Merge branch 'smooth-partition-crash'

This commit is contained in:
Adriaan de Groot 2019-02-11 19:07:32 -05:00
commit faa3392cc5
9 changed files with 67 additions and 36 deletions

View File

@ -47,7 +47,7 @@ This release contains contributions from (alphabetically by first name):
* The currently-selected disk device is remembered between manual partitioning * The currently-selected disk device is remembered between manual partitioning
and the partitioning-overview pages. (Thanks to Arnaud) and the partitioning-overview pages. (Thanks to Arnaud)
* *partition* There is new support for partitioning layout presets. * *partition* There is new support for partitioning layout presets.
See `partitionc.conf` for documentation and details. See `partition.conf` for documentation and details.
* The *keyboard* module now handles the (bogus) Austrian keymap for * The *keyboard* module now handles the (bogus) Austrian keymap for
the system console properly. (Thanks to Kevin) the system console properly. (Thanks to Kevin)
* The *preservefiles* module now has a mechanism for setting the permissions * The *preservefiles* module now has a mechanism for setting the permissions
@ -56,7 +56,8 @@ This release contains contributions from (alphabetically by first name):
for use in OEM installs where an image of fixed size is created, for use in OEM installs where an image of fixed size is created,
and then sized to the actual SD card the user has used. and then sized to the actual SD card the user has used.
* The *mount* module now handles missing *extraMounts* and *extraMountsEfi* * The *mount* module now handles missing *extraMounts* and *extraMountsEfi*
keys gracefully (this is probably a misconfiguration issue). keys gracefully (this is probably a misconfiguration, though, and gives a
warning).
* The *packages* module now supports pre- and post-script options * The *packages* module now supports pre- and post-script options
for all operations, not just during install (keep in mind that for all operations, not just during install (keep in mind that
these run as three separate shells, though). these run as three separate shells, though).

View File

@ -880,7 +880,7 @@ PartitionCoreModule::revertAllDevices()
} }
} }
revertDevice( ( *it )->device.data() ); revertDevice( ( *it )->device.data(), false );
++it; ++it;
} }
@ -889,7 +889,7 @@ PartitionCoreModule::revertAllDevices()
void void
PartitionCoreModule::revertDevice( Device* dev ) PartitionCoreModule::revertDevice( Device* dev, bool individualRevert )
{ {
QMutexLocker locker( &m_revertMutex ); QMutexLocker locker( &m_revertMutex );
DeviceInfo* devInfo = infoForDevice( dev ); DeviceInfo* devInfo = infoForDevice( dev );
@ -915,7 +915,8 @@ PartitionCoreModule::revertDevice( Device* dev )
m_bootLoaderModel->init( devices ); m_bootLoaderModel->init( devices );
refreshAfterModelChange(); if ( individualRevert )
refreshAfterModelChange();
emit deviceReverted( newDev ); emit deviceReverted( newDev );
} }
@ -931,7 +932,7 @@ PartitionCoreModule::asyncRevertDevice( Device* dev, std::function< void() > cal
watcher->deleteLater(); watcher->deleteLater();
} ); } );
QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev ); QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev, true );
watcher->setFuture( future ); watcher->setFuture( future );
} }

View File

@ -191,7 +191,12 @@ public:
void revert(); // full revert, thread safe, calls doInit void revert(); // full revert, thread safe, calls doInit
void revertAllDevices(); // convenience function, calls revertDevice void revertAllDevices(); // convenience function, calls revertDevice
void revertDevice( Device* dev ); // rescans a single Device and updates DeviceInfo /** @brief rescans a single Device and updates DeviceInfo
*
* When @p individualRevert is true, calls refreshAfterModelChange(),
* used to reduce number of refreshes when calling revertAllDevices().
*/
void revertDevice( Device* dev, bool individualRevert=true );
void asyncRevertDevice( Device* dev, std::function< void() > callback ); //like revertDevice, but asynchronous void asyncRevertDevice( Device* dev, std::function< void() > callback ); //like revertDevice, but asynchronous
void clearJobs(); // only clear jobs, the Device* states are preserved void clearJobs(); // only clear jobs, the Device* states are preserved

View File

@ -53,7 +53,7 @@ PartitionLayout::addEntry( PartitionLayout::PartitionEntry entry )
} }
static double static double
parseSizeString( QString sizeString, PartitionLayout::SizeUnit *unit ) parseSizeString( const QString& sizeString, PartitionLayout::SizeUnit* unit )
{ {
double value; double value;
bool ok; bool ok;
@ -102,35 +102,32 @@ parseSizeString( QString sizeString, PartitionLayout::SizeUnit *unit )
return value; return value;
} }
void PartitionLayout::PartitionEntry::PartitionEntry(const QString& size, const QString& min)
PartitionLayout::addEntry( QString mountPoint, QString size, QString min )
{ {
PartitionLayout::PartitionEntry entry; partSize = parseSizeString( size , &partSizeUnit );
if ( !min.isEmpty() )
partMinSize = parseSizeString( min , &partMinSizeUnit );
}
void
PartitionLayout::addEntry( const QString& mountPoint, const QString& size, const QString& min )
{
PartitionLayout::PartitionEntry entry( size, min );
entry.partMountPoint = mountPoint; entry.partMountPoint = mountPoint;
entry.partFileSystem = FileSystem::Ext4; entry.partFileSystem = FileSystem::Ext4;
entry.partSize = parseSizeString( size , &entry.partSizeUnit );
if (min.isEmpty())
entry.partMinSize = 0;
else
entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit );
partLayout.append( entry ); partLayout.append( entry );
} }
void void
PartitionLayout::addEntry( QString label, QString mountPoint, QString fs, QString size, QString min ) PartitionLayout::addEntry( const QString& label, const QString& mountPoint, const QString& fs, const QString& size, const QString& min )
{ {
PartitionLayout::PartitionEntry entry; PartitionLayout::PartitionEntry entry( size, min );
entry.partLabel = label; entry.partLabel = label;
entry.partMountPoint = mountPoint; entry.partMountPoint = mountPoint;
entry.partFileSystem = FileSystem::typeForName( fs ); entry.partFileSystem = FileSystem::typeForName( fs );
entry.partSize = parseSizeString( size , &entry.partSizeUnit );
if (min.isEmpty())
entry.partMinSize = 0;
else
entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit );
partLayout.append( entry ); partLayout.append( entry );
} }

View File

@ -1,6 +1,7 @@
/* === This file is part of Calamares - <https://github.com/calamares> === /* === This file is part of Calamares - <https://github.com/calamares> ===
* *
* Copyright 2018, Collabora Ltd * Copyright 2018, Collabora Ltd
* Copyright 2019, Adriaan de Groot <groot@kde.org>
* *
* Calamares is free software: you can redistribute it and/or modify * Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -47,11 +48,16 @@ public:
{ {
QString partLabel; QString partLabel;
QString partMountPoint; QString partMountPoint;
int partFileSystem; int partFileSystem = 0;
double partSize; double partSize = 0.0L;
SizeUnit partSizeUnit; SizeUnit partSizeUnit = Percent;
double partMinSize; double partMinSize = 0.0L;
SizeUnit partMinSizeUnit; SizeUnit partMinSizeUnit = Percent;
/// @brief All-zeroes PartitionEntry
PartitionEntry() {};
/// @brief Parse @p size and @p min to their respective member variables
PartitionEntry( const QString& size, const QString& min );
}; };
PartitionLayout(); PartitionLayout();
@ -60,8 +66,8 @@ public:
~PartitionLayout(); ~PartitionLayout();
void addEntry( PartitionEntry entry ); void addEntry( PartitionEntry entry );
void addEntry( QString mountPoint, QString size, QString min = "" ); void addEntry( const QString& mountPoint, const QString& size, const QString& min = QString() );
void addEntry( QString label, QString mountPoint, QString fs, QString size, QString min = "" ); void addEntry( const QString& label, const QString& mountPoint, const QString& fs, const QString& size, const QString& min = QString() );
/** /**
* @brief Apply the current partition layout to the selected drive space. * @brief Apply the current partition layout to the selected drive space.

View File

@ -107,9 +107,9 @@ ChoicePage::ChoicePage( const SwapChoiceSet& swapChoices, QWidget* parent )
, m_bootloaderComboBox( nullptr ) , m_bootloaderComboBox( nullptr )
, m_lastSelectedDeviceIndex( -1 ) , m_lastSelectedDeviceIndex( -1 )
, m_enableEncryptionWidget( true ) , m_enableEncryptionWidget( true )
, m_allowManualPartitioning( true )
, m_availableSwapChoices( swapChoices ) , m_availableSwapChoices( swapChoices )
, m_eraseSwapChoice( pickOne( swapChoices ) ) , m_eraseSwapChoice( pickOne( swapChoices ) )
, m_allowManualPartitioning( true )
{ {
setupUi( this ); setupUi( this );
@ -1246,6 +1246,7 @@ ChoicePage::setupActions()
if ( osproberEntriesForCurrentDevice.count() == 0 ) if ( osproberEntriesForCurrentDevice.count() == 0 )
{ {
CALAMARES_RETRANSLATE( CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 0 osprober entries";
m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. "
"What would you like to do?<br/>" "What would you like to do?<br/>"
"You will be able to review and confirm your choices " "You will be able to review and confirm your choices "
@ -1278,6 +1279,7 @@ ChoicePage::setupActions()
if ( !osName.isEmpty() ) if ( !osName.isEmpty() )
{ {
CALAMARES_RETRANSLATE( CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 1 non-empty osprober entry";
m_messageLabel->setText( tr( "This storage device has %1 on it. " m_messageLabel->setText( tr( "This storage device has %1 on it. "
"What would you like to do?<br/>" "What would you like to do?<br/>"
"You will be able to review and confirm your choices " "You will be able to review and confirm your choices "
@ -1301,6 +1303,7 @@ ChoicePage::setupActions()
else else
{ {
CALAMARES_RETRANSLATE( CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 1 empty osprober entry";
m_messageLabel->setText( tr( "This storage device already has an operating system on it. " m_messageLabel->setText( tr( "This storage device already has an operating system on it. "
"What would you like to do?<br/>" "What would you like to do?<br/>"
"You will be able to review and confirm your choices " "You will be able to review and confirm your choices "
@ -1325,6 +1328,8 @@ ChoicePage::setupActions()
// osproberEntriesForCurrentDevice has at least 2 items. // osproberEntriesForCurrentDevice has at least 2 items.
CALAMARES_RETRANSLATE( CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for >= 2 osprober entries";
m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. "
"What would you like to do?<br/>" "What would you like to do?<br/>"
"You will be able to review and confirm your choices " "You will be able to review and confirm your choices "

View File

@ -165,9 +165,13 @@ PartitionPage::updateButtons()
if ( m_ui->deviceComboBox->currentIndex() >= 0 ) if ( m_ui->deviceComboBox->currentIndex() >= 0 )
{ {
Device* device = nullptr;
QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 );
auto device = m_core->deviceModel()->deviceForIndex( deviceIndex ); if ( deviceIndex.isValid() )
if ( device->type() != Device::Type::LVM_Device ) device = m_core->deviceModel()->deviceForIndex( deviceIndex );
if ( !device )
cWarning() << "Device for updateButtons is nullptr";
else if ( device->type() != Device::Type::LVM_Device )
{ {
createTable = true; createTable = true;
@ -577,7 +581,7 @@ void
PartitionPage::onPartitionModelReset() PartitionPage::onPartitionModelReset()
{ {
m_ui->partitionTreeView->expandAll(); m_ui->partitionTreeView->expandAll();
updateButtons(); // updateButtons();
updateBootLoaderIndex(); updateBootLoaderIndex();
} }

View File

@ -538,7 +538,7 @@ findFS( QString defaultFS )
// This bit is for distro's debugging their settings, and shows // This bit is for distro's debugging their settings, and shows
// all the strings that KPMCore is matching against for FS type. // all the strings that KPMCore is matching against for FS type.
{ {
Logger::CLog d( Logger::LOGDEBUG ); Logger::CDebug d;
using TR = Logger::DebugRow< int, QString >; using TR = Logger::DebugRow< int, QString >;
const auto fstypes = FileSystem::types(); const auto fstypes = FileSystem::types();
d << "Available types (" << fstypes.count() << ')'; d << "Available types (" << fstypes.count() << ')';
@ -612,6 +612,18 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap )
else else
choices.insert( PartitionActions::Choices::SwapChoice::SmallSwap ); choices.insert( PartitionActions::Choices::SwapChoice::SmallSwap );
} }
// Not all are supported right now // FIXME
static const char unsupportedSetting[] = "Partition-module does not support *userSwapChoices* setting";
#define COMPLAIN_UNSUPPORTED(x) \
if ( choices.contains( x ) ) \
{ cWarning() << unsupportedSetting << PartitionActions::Choices::choiceToName( x ); choices.remove( x ); }
COMPLAIN_UNSUPPORTED( PartitionActions::Choices::SwapChoice::SwapFile )
COMPLAIN_UNSUPPORTED( PartitionActions::Choices::SwapChoice::ReuseSwap )
#undef COMPLAIN_UNSUPPORTED
m_swapChoices = choices; m_swapChoices = choices;
// These gs settings seem to be unused (in upstream Calamares) outside of // These gs settings seem to be unused (in upstream Calamares) outside of

View File

@ -96,7 +96,7 @@ mapForPartition( Partition* partition, const QString& uuid )
// Debugging for inside the loop in createPartitionList(), // Debugging for inside the loop in createPartitionList(),
// so indent a bit // so indent a bit
Logger::CLog deb = cDebug(); Logger::CDebug deb;
using TR = Logger::DebugRow<const char *const, const QString&>; using TR = Logger::DebugRow<const char *const, const QString&>;
deb << " .. mapping for" << partition->partitionPath() << partition->deviceNode() deb << " .. mapping for" << partition->partitionPath() << partition->deviceNode()
<< TR( "mtpoint:", PartitionInfo::mountPoint( partition ) ) << TR( "mtpoint:", PartitionInfo::mountPoint( partition ) )