From 9302ad14682d4aaf274835a73b6e7d929d39237d Mon Sep 17 00:00:00 2001 From: Artem Grinev Date: Wed, 31 Mar 2021 20:15:02 +0400 Subject: [PATCH 01/24] [partition] Erase disk FS choice --- src/modules/partition/core/Config.cpp | 20 +++++++++++++++++++ src/modules/partition/core/Config.h | 10 ++++++++++ .../partition/core/PartitionActions.cpp | 4 ++++ .../partition/core/PartitionCoreModule.cpp | 1 + src/modules/partition/gui/ChoicePage.cpp | 11 ++++++++-- src/modules/partition/gui/ChoicePage.h | 2 ++ src/modules/partition/partition.conf | 2 +- 7 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index 0afcee83d..a603cedd0 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -207,6 +207,15 @@ Config::setSwapChoice( Config::SwapChoice c ) } } +void +Config::setEraseFsTypeChoice(const QString& choice) +{ + if(choice != m_eraseFsTypeChoice){ + m_eraseFsTypeChoice = choice; + } +} + + bool Config::allowManualPartitioning() const { @@ -240,6 +249,17 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "allowManualPartitioning", CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ) ); + if ( configurationMap.contains( "availableFileSystemTypes" ) ) { + if(configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ){ + m_eraseFsTypes.clear(); + m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toStringList()); + m_eraseFsTypeChoice = m_eraseFsTypes[0]; + } else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ){ + m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toString()); + m_eraseFsTypeChoice = m_eraseFsTypes[0]; + } + } + if ( configurationMap.contains( "requiredPartitionTableType" ) && configurationMap.value( "requiredPartitionTableType" ).type() == QVariant::List ) { diff --git a/src/modules/partition/core/Config.h b/src/modules/partition/core/Config.h index 57230b6e8..5cdd14c9d 100644 --- a/src/modules/partition/core/Config.h +++ b/src/modules/partition/core/Config.h @@ -54,6 +54,8 @@ public: static const NamedEnumTable< SwapChoice >& swapChoiceNames(); using SwapChoiceSet = QSet< SwapChoice >; + using EraseFsTypesSet = QStringList; + void setConfigurationMap( const QVariantMap& ); void updateGlobalStorage() const; @@ -94,6 +96,11 @@ public: */ SwapChoice swapChoice() const { return m_swapChoice; } + EraseFsTypesSet eraseFsTypes() const {return m_eraseFsTypes; } + + QString eraseFsType() const {return m_eraseFsTypeChoice; } + + ///@brief Is manual partitioning allowed (not explicitly disnabled in the config file)? bool allowManualPartitioning() const; @@ -102,6 +109,7 @@ public Q_SLOTS: void setInstallChoice( InstallChoice ); void setSwapChoice( int ); ///< Translates a button ID or so to SwapChoice void setSwapChoice( SwapChoice ); + void setEraseFsTypeChoice( const QString& ); Q_SIGNALS: void installChoiceChanged( InstallChoice ); @@ -109,6 +117,8 @@ Q_SIGNALS: private: SwapChoiceSet m_swapChoices; + EraseFsTypesSet m_eraseFsTypes; + QString m_eraseFsTypeChoice; SwapChoice m_initialSwapChoice = NoSwap; SwapChoice m_swapChoice = NoSwap; InstallChoice m_initialInstallChoice = NoChoice; diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 1a3f6246b..0dab5747f 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -109,6 +109,10 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; } + FileSystem::Type type; + PartUtils::findFS(o.defaultFsType, &type); + core->initLayout( type == FileSystem::Unknown ? FileSystem::Ext4 : type); + core->createPartitionTable( dev, partType ); if ( isEfi ) diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 058c10d18..4370ffa0d 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -381,6 +381,7 @@ PartitionCoreModule::createPartitionTable( Device* device, PartitionTable::Table OperationHelper helper( partitionModelForDevice( device ), this ); deviceInfo->makeJob< CreatePartitionTableJob >( type ); + } } diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index f6b49cb2f..a8f31d416 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -246,6 +246,14 @@ ChoicePage::setupChoices() m_eraseButton->addOptionsComboBox( m_eraseSwapChoiceComboBox ); } + if ( m_config->eraseFsTypes().count() > 1) + { + m_eraseFsTypesChoiceComboBox = new QComboBox; + m_eraseFsTypesChoiceComboBox->addItems(m_config->eraseFsTypes()); + connect(m_eraseFsTypesChoiceComboBox, &QComboBox::currentTextChanged, [this](const auto& currentString){m_config->setEraseFsTypeChoice(currentString); onActionChanged();}); + m_eraseButton->addOptionsComboBox( m_eraseFsTypesChoiceComboBox ); + } + m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); m_itemsLayout->addWidget( m_eraseButton ); @@ -442,9 +450,8 @@ ChoicePage::applyActionChoice( InstallChoice choice ) case InstallChoice::Erase: { auto gs = Calamares::JobQueue::instance()->globalStorage(); - PartitionActions::Choices::AutoPartitionOptions options { gs->value( "defaultPartitionTableType" ).toString(), - gs->value( "defaultFileSystemType" ).toString(), + m_config->eraseFsType(), m_encryptWidget->passphrase(), gs->value( "efiSystemPartition" ).toString(), CalamaresUtils::GiBtoBytes( diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index 89bd775d7..f43578ba5 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -139,6 +139,8 @@ private: Calamares::PrettyRadioButton* m_replaceButton; Calamares::PrettyRadioButton* m_somethingElseButton; QComboBox* m_eraseSwapChoiceComboBox; // UI, see also m_eraseSwapChoice + QComboBox* m_eraseFsTypesChoiceComboBox; // UI, see also m_eraseSwapChoice + DeviceInfoWidget* m_deviceInfoWidget; diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index e5de69659..19d3e1745 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -137,7 +137,7 @@ initialSwapChoice: none # If nothing is specified, Calamares defaults to "ext4". # # Names are case-sensitive and defined by KPMCore. -defaultFileSystemType: "ext4" +availableFileSystemTypes: ["ext4", "btrfs", "f2fs"] # Show/hide LUKS related functionality in automated partitioning modes. # Disable this if you choose not to deploy early unlocking support in GRUB2 From 546253d750aa8f93be7aca016d87635f9cd299dd Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:00:15 +0200 Subject: [PATCH 02/24] [partition] Apply coding style --- src/modules/partition/core/PartitionActions.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 0dab5747f..728eda767 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -16,13 +16,12 @@ #include "core/PartitionCoreModule.h" #include "core/PartitionInfo.h" -#include "utils/CalamaresUtilsSystem.h" -#include "utils/NamedEnum.h" -#include "utils/Units.h" - #include "GlobalStorage.h" #include "JobQueue.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" +#include "utils/NamedEnum.h" +#include "utils/Units.h" #include #include @@ -110,8 +109,8 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO } FileSystem::Type type; - PartUtils::findFS(o.defaultFsType, &type); - core->initLayout( type == FileSystem::Unknown ? FileSystem::Ext4 : type); + PartUtils::findFS( o.defaultFsType, &type ); + core->initLayout( type == FileSystem::Unknown ? FileSystem::Ext4 : type ); core->createPartitionTable( dev, partType ); From f9659989b18efb0e4e8eed268f5d6b85ac2ebb08 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:06:02 +0200 Subject: [PATCH 03/24] [partition] rename findFS Rename findFS -> canonicalFilesystemName because that's what it actually does. While here, apply coding style to the files that are affected. --- src/modules/partition/core/PartUtils.cpp | 2 +- src/modules/partition/core/PartUtils.h | 6 ++++-- src/modules/partition/core/PartitionActions.cpp | 6 ++++-- src/modules/partition/core/PartitionLayout.cpp | 2 +- src/modules/partition/gui/CreatePartitionDialog.cpp | 2 +- .../partition/gui/EditExistingPartitionDialog.cpp | 2 +- src/modules/partition/gui/PartitionViewStep.cpp | 9 ++++----- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 368d04af2..8d048b297 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -472,7 +472,7 @@ isEfiBootable( const Partition* candidate ) } QString -findFS( QString fsName, FileSystem::Type* fsType ) +canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) { QStringList fsLanguage { QLatin1String( "C" ) }; // Required language list to turn off localization if ( fsName.isEmpty() ) diff --git a/src/modules/partition/core/PartUtils.h b/src/modules/partition/core/PartUtils.h index aec345882..89d2c5e1a 100644 --- a/src/modules/partition/core/PartUtils.h +++ b/src/modules/partition/core/PartUtils.h @@ -91,11 +91,13 @@ bool isEfiBootable( const Partition* candidate ); /** @brief translate @p fsName into a recognized name and type * * Makes several attempts to translate the string into a - * name that KPMCore will recognize. + * name that KPMCore will recognize. Returns the canonical + * filesystem name (e.g. asking for "EXT4" will return "ext4"). + * * The corresponding filesystem type is stored in @p fsType, and * its value is FileSystem::Unknown if @p fsName is not recognized. */ -QString findFS( QString fsName, FileSystem::Type* fsType ); +QString canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ); } // namespace PartUtils diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 728eda767..422c1d38f 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -108,8 +108,10 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; } - FileSystem::Type type; - PartUtils::findFS( o.defaultFsType, &type ); + // Looking up the defaultFsType (which should name a filesystem type) + // will log an error and set the type to Unknown if there's something wrong. + FileSystem::Type type = FileSystem::Unknown; + PartUtils::canonicalFilesystemName( o.defaultFsType, &type ); core->initLayout( type == FileSystem::Unknown ? FileSystem::Ext4 : type ); core->createPartitionTable( dev, partType ); diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index 23eaeda62..c828fce69 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -75,7 +75,7 @@ PartitionLayout::PartitionEntry::PartitionEntry( const QString& label, , partMinSize( minSize ) , partMaxSize( maxSize ) { - PartUtils::findFS( fs, &partFileSystem ); + PartUtils::canonicalFilesystemName( fs, &partFileSystem ); } diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index c765bf1f7..4236022be 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -96,7 +96,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, // File system; the config value is translated (best-effort) to a type FileSystem::Type defaultFSType; - QString untranslatedFSName = PartUtils::findFS( + QString untranslatedFSName = PartUtils::canonicalFilesystemName( Calamares::JobQueue::instance()->globalStorage()->value( "defaultFileSystemType" ).toString(), &defaultFSType ); if ( defaultFSType == FileSystem::Type::Unknown ) { diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp index e2d7ac5ba..411d6d0dc 100644 --- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp +++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp @@ -97,7 +97,7 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, m_ui->fileSystemComboBox->addItems( fsNames ); FileSystem::Type defaultFSType; - QString untranslatedFSName = PartUtils::findFS( + QString untranslatedFSName = PartUtils::canonicalFilesystemName( Calamares::JobQueue::instance()->globalStorage()->value( "defaultFileSystemType" ).toString(), &defaultFSType ); if ( defaultFSType == FileSystem::Type::Unknown ) { diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index b4eefb3b0..52bf1fc3b 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -388,7 +388,7 @@ shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) } auto [ r, device ] = core->bootLoaderModel()->findBootLoader( core->bootLoaderInstallPath() ); - Q_UNUSED(r); + Q_UNUSED( r ); if ( device ) { auto* table = device->partitionTable(); @@ -403,8 +403,7 @@ shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) && ( partition->fileSystem().type() == FileSystem::Unformatted ) && ( partition->capacity() >= 8_MiB ) ) { - cDebug() << Logger::SubEntry << "Partition" << partition->devicePath() - << partition->partitionPath() + cDebug() << Logger::SubEntry << "Partition" << partition->devicePath() << partition->partitionPath() << "is a suitable bios_grub partition"; return false; } @@ -591,7 +590,7 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { cWarning() << "Partition-module setting *defaultFileSystemType* is missing, will use ext4"; } - QString fsRealName = PartUtils::findFS( fsName, &fsType ); + QString fsRealName = PartUtils::canonicalFilesystemName( fsName, &fsType ); if ( fsRealName == fsName ) { cDebug() << o << "Partition-module setting *defaultFileSystemType*" << fsRealName; @@ -619,7 +618,7 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) // because it could take a while. Then when it's done, we can set up the widgets // and remove the spinner. m_future = new QFutureWatcher< void >(); - connect( m_future, &QFutureWatcher< void >::finished, this, [ this ] { + connect( m_future, &QFutureWatcher< void >::finished, this, [this] { continueLoading(); this->m_future->deleteLater(); this->m_future = nullptr; From 9fa5ab04e56a4253da7ef39e29e38ec2cc7d0cc7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:23:27 +0200 Subject: [PATCH 04/24] [partition] Apply coding style to core/ --- src/modules/partition/core/Config.cpp | 23 +++++++++++-------- src/modules/partition/core/Config.h | 4 ++-- src/modules/partition/core/DeviceList.cpp | 8 +++---- src/modules/partition/core/PartUtils.cpp | 13 ++++++++--- src/modules/partition/core/PartUtils.h | 2 +- .../partition/core/PartitionCoreModule.cpp | 3 +-- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index a603cedd0..47951321e 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -208,9 +208,10 @@ Config::setSwapChoice( Config::SwapChoice c ) } void -Config::setEraseFsTypeChoice(const QString& choice) +Config::setEraseFsTypeChoice( const QString& choice ) { - if(choice != m_eraseFsTypeChoice){ + if ( choice != m_eraseFsTypeChoice ) + { m_eraseFsTypeChoice = choice; } } @@ -249,14 +250,18 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "allowManualPartitioning", CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ) ); - if ( configurationMap.contains( "availableFileSystemTypes" ) ) { - if(configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ){ + if ( configurationMap.contains( "availableFileSystemTypes" ) ) + { + if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ) + { m_eraseFsTypes.clear(); - m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toStringList()); - m_eraseFsTypeChoice = m_eraseFsTypes[0]; - } else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ){ - m_eraseFsTypes.append(configurationMap.value( "availableFileSystemTypes" ).toString()); - m_eraseFsTypeChoice = m_eraseFsTypes[0]; + m_eraseFsTypes.append( configurationMap.value( "availableFileSystemTypes" ).toStringList() ); + m_eraseFsTypeChoice = m_eraseFsTypes[ 0 ]; + } + else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ) + { + m_eraseFsTypes.append( configurationMap.value( "availableFileSystemTypes" ).toString() ); + m_eraseFsTypeChoice = m_eraseFsTypes[ 0 ]; } } diff --git a/src/modules/partition/core/Config.h b/src/modules/partition/core/Config.h index 5cdd14c9d..a4f5e68f6 100644 --- a/src/modules/partition/core/Config.h +++ b/src/modules/partition/core/Config.h @@ -96,9 +96,9 @@ public: */ SwapChoice swapChoice() const { return m_swapChoice; } - EraseFsTypesSet eraseFsTypes() const {return m_eraseFsTypes; } + EraseFsTypesSet eraseFsTypes() const { return m_eraseFsTypes; } - QString eraseFsType() const {return m_eraseFsTypeChoice; } + QString eraseFsType() const { return m_eraseFsTypeChoice; } ///@brief Is manual partitioning allowed (not explicitly disnabled in the config file)? diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp index d58b22868..6b770a982 100644 --- a/src/modules/partition/core/DeviceList.cpp +++ b/src/modules/partition/core/DeviceList.cpp @@ -10,8 +10,8 @@ #include "DeviceList.h" -#include "utils/Logger.h" #include "partition/PartitionIterator.h" +#include "utils/Logger.h" #include #include @@ -133,11 +133,11 @@ getDevices( DeviceType which ) #endif // Unsafe partitioning - auto removeInAllModes = []( DeviceList& l, DeviceList::iterator& it) { return erase(l, it); }; - auto removeInSafeMode = []( DeviceList&, DeviceList::iterator& it) { return ++it; }; + auto removeInAllModes = []( DeviceList& l, DeviceList::iterator& it ) { return erase( l, it ); }; + auto removeInSafeMode = []( DeviceList&, DeviceList::iterator& it ) { return ++it; }; #else // Safe partitioning - auto removeInAllModes = []( DeviceList& l, DeviceList::iterator& it) { return erase(l, it); }; + auto removeInAllModes = []( DeviceList& l, DeviceList::iterator& it ) { return erase( l, it ); }; auto& removeInSafeMode = removeInAllModes; #endif diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 8d048b297..8bff2c95f 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -177,7 +177,8 @@ canBeResized( Partition* candidate, const Logger::Once& o ) if ( availableStorageB > advisedStorageB ) { - cDebug() << o << "Partition" << convenienceName( candidate ) << "authorized for resize + autopartition install."; + cDebug() << o << "Partition" << convenienceName( candidate ) + << "authorized for resize + autopartition install."; return true; } else @@ -412,8 +413,14 @@ runOsprober( DeviceModel* dm ) FstabEntryList fstabEntries = lookForFstabEntries( path ); QString homePath = findPartitionPathForMountPoint( fstabEntries, "/home" ); - osproberEntries.append( - { prettyName, path, file, QString(), canBeResized( dm, path, o ), lineColumns, fstabEntries, homePath } ); + osproberEntries.append( { prettyName, + path, + file, + QString(), + canBeResized( dm, path, o ), + lineColumns, + fstabEntries, + homePath } ); osproberCleanLines.append( line ); } } diff --git a/src/modules/partition/core/PartUtils.h b/src/modules/partition/core/PartUtils.h index 89d2c5e1a..5e84e379b 100644 --- a/src/modules/partition/core/PartUtils.h +++ b/src/modules/partition/core/PartUtils.h @@ -26,7 +26,7 @@ class DeviceModel; class Partition; namespace Logger { - class Once; +class Once; } namespace PartUtils diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index c8b17b1cb..363d9daef 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -258,7 +258,7 @@ PartitionCoreModule::doInit() cDebug() << Logger::SubEntry << "node\tcapacity\tname\tprettyName"; for ( auto device : devices ) { - cDebug() << Logger::SubEntry << Logger::Pointer(device); + cDebug() << Logger::SubEntry << Logger::Pointer( device ); if ( device ) { // Gives ownership of the Device* to the DeviceInfo object @@ -390,7 +390,6 @@ PartitionCoreModule::createPartitionTable( Device* device, PartitionTable::Table OperationHelper helper( partitionModelForDevice( device ), this ); deviceInfo->makeJob< CreatePartitionTableJob >( type ); - } } From 4fa61249a83a4c0bb5a246bc016ad54cde3b66a2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:29:36 +0200 Subject: [PATCH 05/24] [partition] Make the fs type used for erase, a config property --- src/modules/partition/core/Config.cpp | 2 ++ src/modules/partition/core/Config.h | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index 47951321e..cfe9458cc 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -212,7 +212,9 @@ Config::setEraseFsTypeChoice( const QString& choice ) { if ( choice != m_eraseFsTypeChoice ) { + // FIXME: shouldn't this be a canonical fs name? m_eraseFsTypeChoice = choice; + Q_EMIT eraseModeFilesystemChanged( choice ); } } diff --git a/src/modules/partition/core/Config.h b/src/modules/partition/core/Config.h index a4f5e68f6..8b420a8d0 100644 --- a/src/modules/partition/core/Config.h +++ b/src/modules/partition/core/Config.h @@ -24,6 +24,9 @@ class Config : public QObject ///@brief The swap choice (None, Small, Hibernate, ...) which only makes sense when Erase is chosen Q_PROPERTY( SwapChoice swapChoice READ swapChoice WRITE setSwapChoice NOTIFY swapChoiceChanged ) + ///@brief Name of the FS that will be used when erasing type disk (e.g. "default filesystem") + Q_PROPERTY( QString eraseModeFilesystem READ eraseFsType WRITE setEraseFsTypeChoice NOTIFY eraseModeFilesystemChanged ) + Q_PROPERTY( bool allowManualPartitioning READ allowManualPartitioning CONSTANT FINAL ) public: @@ -109,11 +112,12 @@ public Q_SLOTS: void setInstallChoice( InstallChoice ); void setSwapChoice( int ); ///< Translates a button ID or so to SwapChoice void setSwapChoice( SwapChoice ); - void setEraseFsTypeChoice( const QString& ); + void setEraseFsTypeChoice( const QString& filesystemName ); ///< See property eraseModeFilesystem Q_SIGNALS: void installChoiceChanged( InstallChoice ); void swapChoiceChanged( SwapChoice ); + void eraseModeFilesystemChanged( const QString& ); private: SwapChoiceSet m_swapChoices; From d8a862ec82d0fb96e6c9ca10ef6eb3f87385a9cc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:31:53 +0200 Subject: [PATCH 06/24] [partition] Use Q_EMIT --- src/modules/partition/core/Config.cpp | 4 ++-- src/modules/partition/core/DeviceModel.cpp | 2 +- src/modules/partition/core/PartitionCoreModule.cpp | 6 +++--- src/modules/partition/core/PartitionModel.cpp | 2 +- src/modules/partition/core/PartitionModel.h | 2 +- src/modules/partition/gui/ChoicePage.cpp | 14 +++++++------- src/modules/partition/gui/EncryptWidget.cpp | 2 +- .../partition/gui/PartitionSplitterWidget.cpp | 4 ++-- src/modules/partition/gui/PartitionViewStep.cpp | 2 +- src/modules/partition/gui/ReplaceWidget.cpp | 2 +- src/modules/partition/gui/ScanningDialog.cpp | 2 +- src/modules/partition/jobs/PartitionJob.cpp | 2 +- 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index cfe9458cc..78296018a 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -180,7 +180,7 @@ Config::setInstallChoice( InstallChoice c ) if ( c != m_installChoice ) { m_installChoice = c; - emit installChoiceChanged( c ); + Q_EMIT installChoiceChanged( c ); ::updateGlobalStorage( c, m_swapChoice ); } } @@ -202,7 +202,7 @@ Config::setSwapChoice( Config::SwapChoice c ) if ( c != m_swapChoice ) { m_swapChoice = c; - emit swapChoiceChanged( c ); + Q_EMIT swapChoiceChanged( c ); ::updateGlobalStorage( m_installChoice, c ); } } diff --git a/src/modules/partition/core/DeviceModel.cpp b/src/modules/partition/core/DeviceModel.cpp index 46a181b33..33aae20c0 100644 --- a/src/modules/partition/core/DeviceModel.cpp +++ b/src/modules/partition/core/DeviceModel.cpp @@ -132,7 +132,7 @@ DeviceModel::swapDevice( Device* oldDevice, Device* newDevice ) m_devices[ indexOfOldDevice ] = newDevice; - emit dataChanged( index( indexOfOldDevice ), index( indexOfOldDevice ) ); + Q_EMIT dataChanged( index( indexOfOldDevice ), index( indexOfOldDevice ) ); } void diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 363d9daef..e2c91fbee 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -687,7 +687,7 @@ void PartitionCoreModule::refreshPartition( Device* device, Partition* ) { // Keep it simple for now: reset the model. This can be improved to cause - // the model to emit dataChanged() for the affected row instead, avoiding + // the model to Q_EMIT dataChanged() for the affected row instead, avoiding // the loss of the current selection. auto model = partitionModelForDevice( device ); Q_ASSERT( model ); @@ -966,7 +966,7 @@ PartitionCoreModule::revert() m_deviceInfos.clear(); doInit(); updateIsDirty(); - emit reverted(); + Q_EMIT reverted(); } @@ -1040,7 +1040,7 @@ PartitionCoreModule::revertDevice( Device* dev, bool individualRevert ) { refreshAfterModelChange(); } - emit deviceReverted( newDev ); + Q_EMIT deviceReverted( newDev ); } diff --git a/src/modules/partition/core/PartitionModel.cpp b/src/modules/partition/core/PartitionModel.cpp index b4ea57adb..e310eee5e 100644 --- a/src/modules/partition/core/PartitionModel.cpp +++ b/src/modules/partition/core/PartitionModel.cpp @@ -327,5 +327,5 @@ PartitionModel::partitionForIndex( const QModelIndex& index ) const void PartitionModel::update() { - emit dataChanged( index( 0, 0 ), index( rowCount() - 1, columnCount() - 1 ) ); + Q_EMIT dataChanged( index( 0, 0 ), index( rowCount() - 1, columnCount() - 1 ) ); } diff --git a/src/modules/partition/core/PartitionModel.h b/src/modules/partition/core/PartitionModel.h index 433fa0620..ba5e258a3 100644 --- a/src/modules/partition/core/PartitionModel.h +++ b/src/modules/partition/core/PartitionModel.h @@ -41,7 +41,7 @@ public: /** * This helper class must be instantiated on the stack *before* making * changes to the device represented by this model. It will cause the model - * to emit modelAboutToBeReset() when instantiated and modelReset() when + * to Q_EMIT modelAboutToBeReset() when instantiated and modelReset() when * destructed. */ class ResetHelper diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 5ae62a87e..e6c7ea91f 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -300,7 +300,7 @@ ChoicePage::setupChoices() m_config->setInstallChoice( id ); updateNextEnabled(); - emit actionChosen(); + Q_EMIT actionChosen(); } else // An action was unpicked, either on its own or because of another selection. { @@ -310,7 +310,7 @@ ChoicePage::setupChoices() m_config->setInstallChoice( InstallChoice::NoChoice ); updateNextEnabled(); - emit actionChosen(); + Q_EMIT actionChosen(); } } } ); @@ -433,8 +433,8 @@ ChoicePage::continueApplyDeviceChoice() checkInstallChoiceRadioButton( m_config->installChoice() ); } - emit actionChosen(); - emit deviceChosen(); + Q_EMIT actionChosen(); + Q_EMIT deviceChosen(); } @@ -489,14 +489,14 @@ ChoicePage::applyActionChoice( InstallChoice choice ) } ), [=] { PartitionActions::doAutopartition( m_core, selectedDevice(), options ); - emit deviceChosen(); + Q_EMIT deviceChosen(); }, this ); } else { PartitionActions::doAutopartition( m_core, selectedDevice(), options ); - emit deviceChosen(); + Q_EMIT deviceChosen(); } } break; @@ -1599,7 +1599,7 @@ ChoicePage::updateNextEnabled() if ( enabled != m_nextEnabled ) { m_nextEnabled = enabled; - emit nextStatusChanged( enabled ); + Q_EMIT nextStatusChanged( enabled ); } } diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp index 7f648491a..ee50e7d66 100644 --- a/src/modules/partition/gui/EncryptWidget.cpp +++ b/src/modules/partition/gui/EncryptWidget.cpp @@ -136,7 +136,7 @@ EncryptWidget::updateState() if ( newState != m_state ) { m_state = newState; - emit stateChanged( m_state ); + Q_EMIT stateChanged( m_state ); } } diff --git a/src/modules/partition/gui/PartitionSplitterWidget.cpp b/src/modules/partition/gui/PartitionSplitterWidget.cpp index 93c77bb69..0cafe7814 100644 --- a/src/modules/partition/gui/PartitionSplitterWidget.cpp +++ b/src/modules/partition/gui/PartitionSplitterWidget.cpp @@ -225,7 +225,7 @@ PartitionSplitterWidget::setSplitPartition( const QString& path, qint64 minSize, } } - emit partitionResized( m_itemToResize.itemPath, m_itemToResize.size, m_itemToResizeNext.size ); + Q_EMIT partitionResized( m_itemToResize.itemPath, m_itemToResize.size, m_itemToResizeNext.size ); cDebug() << "Items updated. Status:"; foreach ( const PartitionSplitterItem& item, m_items ) @@ -374,7 +374,7 @@ PartitionSplitterWidget::mouseMoveEvent( QMouseEvent* event ) repaint(); - emit partitionResized( itemPath, m_itemToResize.size, m_itemToResizeNext.size ); + Q_EMIT partitionResized( itemPath, m_itemToResize.size, m_itemToResizeNext.size ); } else { diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 52bf1fc3b..cc06ba967 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -327,7 +327,7 @@ PartitionViewStep::isNextEnabled() const void PartitionViewStep::nextPossiblyChanged( bool ) { - emit nextStatusChanged( isNextEnabled() ); + Q_EMIT nextStatusChanged( isNextEnabled() ); } bool diff --git a/src/modules/partition/gui/ReplaceWidget.cpp b/src/modules/partition/gui/ReplaceWidget.cpp index 078eb4de7..94f527646 100644 --- a/src/modules/partition/gui/ReplaceWidget.cpp +++ b/src/modules/partition/gui/ReplaceWidget.cpp @@ -311,7 +311,7 @@ ReplaceWidget::setNextEnabled( bool enabled ) } m_nextEnabled = enabled; - emit nextStatusChanged( enabled ); + Q_EMIT nextStatusChanged( enabled ); } diff --git a/src/modules/partition/gui/ScanningDialog.cpp b/src/modules/partition/gui/ScanningDialog.cpp index cd22bb861..4dffa922b 100644 --- a/src/modules/partition/gui/ScanningDialog.cpp +++ b/src/modules/partition/gui/ScanningDialog.cpp @@ -68,5 +68,5 @@ void ScanningDialog::setVisible( bool visible ) { QDialog::setVisible( visible ); - emit visibilityChanged(); + Q_EMIT visibilityChanged(); } diff --git a/src/modules/partition/jobs/PartitionJob.cpp b/src/modules/partition/jobs/PartitionJob.cpp index 3bdb05ebd..ca9b00944 100644 --- a/src/modules/partition/jobs/PartitionJob.cpp +++ b/src/modules/partition/jobs/PartitionJob.cpp @@ -25,5 +25,5 @@ PartitionJob::iprogress( int percent ) { percent = 100; } - emit progress( qreal( percent / 100.0 ) ); + Q_EMIT progress( qreal( percent / 100.0 ) ); } From cd804470b57556f49e2484b9d54d49c33bca61dc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 11:51:33 +0200 Subject: [PATCH 07/24] [partition] Canonicalize the FS choice for erase --- src/modules/partition/core/Config.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index 78296018a..b09f1424d 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -9,6 +9,8 @@ #include "Config.h" +#include "PartUtils.h" + #include "GlobalStorage.h" #include "JobQueue.h" #include "utils/Logger.h" @@ -210,11 +212,11 @@ Config::setSwapChoice( Config::SwapChoice c ) void Config::setEraseFsTypeChoice( const QString& choice ) { - if ( choice != m_eraseFsTypeChoice ) + QString canonicalChoice = PartUtils::canonicalFilesystemName( choice, nullptr ); + if ( canonicalChoice != m_eraseFsTypeChoice ) { - // FIXME: shouldn't this be a canonical fs name? - m_eraseFsTypeChoice = choice; - Q_EMIT eraseModeFilesystemChanged( choice ); + m_eraseFsTypeChoice = canonicalChoice; + Q_EMIT eraseModeFilesystemChanged( canonicalChoice ); } } From 26cabbb3e410e6dff1ab3c361df0013699be35ac Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 12:18:04 +0200 Subject: [PATCH 08/24] [partition] refactor config-reading from availableFileSystemTypes --- src/modules/partition/core/Config.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/core/Config.cpp index b09f1424d..69dbe17d3 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/core/Config.cpp @@ -256,16 +256,22 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) if ( configurationMap.contains( "availableFileSystemTypes" ) ) { + QStringList fsTypes; + if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ) { - m_eraseFsTypes.clear(); - m_eraseFsTypes.append( configurationMap.value( "availableFileSystemTypes" ).toStringList() ); - m_eraseFsTypeChoice = m_eraseFsTypes[ 0 ]; + fsTypes = CalamaresUtils::getStringList( configurationMap, "availableFileSystemTypes" ); } else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ) { - m_eraseFsTypes.append( configurationMap.value( "availableFileSystemTypes" ).toString() ); - m_eraseFsTypeChoice = m_eraseFsTypes[ 0 ]; + fsTypes = QStringList { CalamaresUtils::getString( configurationMap, "availableFileSystemTypes" ) }; + } + + m_eraseFsTypes = fsTypes; + if ( !fsTypes.empty() ) + { + m_eraseFsTypeChoice = m_eraseFsTypes.first(); + Q_EMIT eraseModeFilesystemChanged( m_eraseFsTypeChoice ); } } From 2a0d4e5a2356837633395d7a692b46e9e2df717d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 12:35:15 +0200 Subject: [PATCH 09/24] [partition] Initialize pointers in declaration --- src/modules/partition/gui/ChoicePage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index f43578ba5..30de05cb9 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -138,8 +138,8 @@ private: Calamares::PrettyRadioButton* m_eraseButton; Calamares::PrettyRadioButton* m_replaceButton; Calamares::PrettyRadioButton* m_somethingElseButton; - QComboBox* m_eraseSwapChoiceComboBox; // UI, see also m_eraseSwapChoice - QComboBox* m_eraseFsTypesChoiceComboBox; // UI, see also m_eraseSwapChoice + QComboBox* m_eraseSwapChoiceComboBox = nullptr; // UI, see also Config's swap choice + QComboBox* m_eraseFsTypesChoiceComboBox = nullptr; // UI, see also Config's erase-mode FS DeviceInfoWidget* m_deviceInfoWidget; From ef436ac4d73edf6c9346894ebfad7fe1ae29e135 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 13:49:08 +0200 Subject: [PATCH 10/24] [libcalamares] add a convenience optional-setter for use with pointers --- src/libcalamares/utils/RAII.h | 17 ++++++++++++ src/libcalamares/utils/Tests.cpp | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/libcalamares/utils/RAII.h b/src/libcalamares/utils/RAII.h index 1cbead4a2..f3adb90f6 100644 --- a/src/libcalamares/utils/RAII.h +++ b/src/libcalamares/utils/RAII.h @@ -14,6 +14,7 @@ #include #include +#include #include /** @brief Convenience to zero out and deleteLater of any QObject-derived-class @@ -58,4 +59,20 @@ struct cBoolSetter /// @brief Blocks signals on a QObject until destruction using cSignalBlocker = QSignalBlocker; +/** @brief Writes a value on destruction to a pointed-to location. + * + * If the pointer is non-null, write the last-given-value if there + * is one to the pointed-to object. + */ +template < typename T > +struct cPointerSetter +{ + std::optional< T > m_value; + T* m_pointer; + + cPointerSetter( T* p ) : m_pointer(p) {} + ~cPointerSetter() { if ( m_pointer && m_value.has_value() ) { *m_pointer = m_value.value(); } } + + const T& operator=(const T& v) { m_value = v; return v; } +}; #endif diff --git a/src/libcalamares/utils/Tests.cpp b/src/libcalamares/utils/Tests.cpp index cdb37f20d..7a6d52623 100644 --- a/src/libcalamares/utils/Tests.cpp +++ b/src/libcalamares/utils/Tests.cpp @@ -56,6 +56,7 @@ private Q_SLOTS: /** @brief Tests the RAII bits. */ void testBoolSetter(); + void testPointerSetter(); /** @brief Tests the Traits bits. */ void testTraits(); @@ -360,6 +361,50 @@ LibCalamaresTests::testBoolSetter() QVERIFY( b ); } +void +LibCalamaresTests::testPointerSetter() +{ + int special = 17; + + QCOMPARE( special, 17 ); + { + cPointerSetter p( &special ); + } + QCOMPARE( special, 17 ); + { + cPointerSetter p( &special ); + p = 18; + } + QCOMPARE( special, 18 ); + { + cPointerSetter p( &special ); + p = 20; + p = 3; + } + QCOMPARE( special, 3 ); + { + cPointerSetter p( nullptr ); + } + QCOMPARE( special, 3 ); + { + // "don't do this" .. order of destructors is important + cPointerSetter p( &special ); + cPointerSetter q( &special ); + p = 17; + } + QCOMPARE( special, 17 ); + { + // "don't do this" .. order of destructors is important + cPointerSetter p( &special ); + cPointerSetter q( &special ); + p = 34; + q = 2; + // q destroyed first, then p + } + QCOMPARE( special, 34 ); +} + + /* Demonstration of Traits support for has-a-method or not. * * We have two classes, c1 and c2; one has a method do_the_thing() and the From 7ce2a876448ea33b371ec379a3259a9f7f6d16da Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 13:49:31 +0200 Subject: [PATCH 11/24] [partition] Fix build - fsName was a QString (a copy) so it could be modified; - the modification isn't really necessary. - While here, pick up new PointerSetter convenience class. --- src/modules/partition/core/PartUtils.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 8bff2c95f..2f269d37f 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -22,6 +22,7 @@ #include "partition/PartitionQuery.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" +#include "utils/RAII.h" #include #include @@ -481,19 +482,17 @@ isEfiBootable( const Partition* candidate ) QString canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) { - QStringList fsLanguage { QLatin1String( "C" ) }; // Required language list to turn off localization + cPointerSetter type( fsType ); if ( fsName.isEmpty() ) { - fsName = QStringLiteral( "ext4" ); + type = FileSystem::Ext4; + return QStringLiteral( "ext4" ); } - FileSystem::Type tmpType = FileSystem::typeForName( fsName, fsLanguage ); - if ( tmpType != FileSystem::Unknown ) + QStringList fsLanguage { QLatin1String( "C" ) }; // Required language list to turn off localization + + if ( ( type = FileSystem::typeForName( fsName, fsLanguage ) ) != FileSystem::Unknown ) { - if ( fsType ) - { - *fsType = tmpType; - } return fsName; } @@ -513,7 +512,6 @@ canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) } cWarning() << "Filesystem" << fsName << "not found, using ext4"; - fsName = QStringLiteral( "ext4" ); // fsType can be used to check whether fsName was a valid filesystem. if ( fsType ) { @@ -533,7 +531,8 @@ canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) } } #endif - return fsName; + type = FileSystem::Unknown; + return QStringLiteral( "ext4" ); } } // namespace PartUtils From fb7e6101ffd47e89618effd715d078bec5157c9e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 18 Jun 2021 13:53:47 +0200 Subject: [PATCH 12/24] [partition] Hook erase-fs-type changes to the config-object --- src/modules/partition/gui/ChoicePage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index e6c7ea91f..0c86fd718 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -272,7 +272,8 @@ ChoicePage::setupChoices() { m_eraseFsTypesChoiceComboBox = new QComboBox; m_eraseFsTypesChoiceComboBox->addItems(m_config->eraseFsTypes()); - connect(m_eraseFsTypesChoiceComboBox, &QComboBox::currentTextChanged, [this](const auto& currentString){m_config->setEraseFsTypeChoice(currentString); onActionChanged();}); + connect( m_eraseFsTypesChoiceComboBox, &QComboBox::currentTextChanged, m_config, &Config::setEraseFsTypeChoice ); + connect( m_config, &Config::eraseModeFilesystemChanged, this, &ChoicePage::onActionChanged ); m_eraseButton->addOptionsComboBox( m_eraseFsTypesChoiceComboBox ); } From cba5b9e4fb00e8c8fec7e60a7d24180bb4251a79 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 21 Jun 2021 22:56:23 +0200 Subject: [PATCH 13/24] [partition]: restore defaultFileSystemType in config Add the old key back, document the new key, expand schema. --- src/modules/partition/partition.conf | 8 ++++++++ src/modules/partition/partition.schema.yaml | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index c9a72655b..a900bdf48 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -137,6 +137,14 @@ initialSwapChoice: none # If nothing is specified, Calamares defaults to "ext4". # # Names are case-sensitive and defined by KPMCore. +defaultFileSystemType: "ext4" + +# Selectable filesystem type, used when "erase" is done. +# +# When erasing the disk, the *defaultFileSystemType* is used (see +# above), but it is also possible to give users a choice: +# list suitable filesystems here. A drop-down is provided +# to pick which is the filesystems will be used. availableFileSystemTypes: ["ext4", "btrfs", "f2fs"] # Show/hide LUKS related functionality in automated partitioning modes. diff --git a/src/modules/partition/partition.schema.yaml b/src/modules/partition/partition.schema.yaml index 16cc08319..6c65e8ae7 100644 --- a/src/modules/partition/partition.schema.yaml +++ b/src/modules/partition/partition.schema.yaml @@ -18,6 +18,8 @@ properties: alwaysShowPartitionLabels: { type: boolean, default: true } defaultFileSystemType: { type: string } + availableFileSystemTypes: { type: array, items: { type: string } } + enableLuksAutomatedPartitioning: { type: boolean, default: false } allowManualPartitioning: { type: boolean, default: true } partitionLayout: { type: array } # TODO: specify items From c3bc305bb6ccefd7604e39d491a625d090150ec7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 11:22:47 +0200 Subject: [PATCH 14/24] [partition] Shuffle Config and ViewStep to top Modules nearly always have a Config and either a Job or ViewStep as their "top level" components. Everything else is implementation- detail. The *partition* module was unusual in that those two "top level" components were tucked away in subdirectories. Shuffle them to the top: this makes it more clear that these two files are there to coordinate the module. --- src/modules/partition/CMakeLists.txt | 5 +++-- src/modules/partition/{core => }/Config.cpp | 2 +- src/modules/partition/{core => }/Config.h | 0 .../partition/{gui => }/PartitionViewStep.cpp | 4 ++-- .../partition/{gui => }/PartitionViewStep.h | 0 src/modules/partition/core/PartitionActions.h | 2 +- src/modules/partition/gui/ChoicePage.cpp | 17 +++++++++-------- src/modules/partition/gui/ChoicePage.h | 2 +- 8 files changed, 17 insertions(+), 15 deletions(-) rename src/modules/partition/{core => }/Config.cpp (99%) rename src/modules/partition/{core => }/Config.h (100%) rename src/modules/partition/{gui => }/PartitionViewStep.cpp (99%) rename src/modules/partition/{gui => }/PartitionViewStep.h (100%) diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index bffb2128c..26d4ffae7 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -49,9 +49,11 @@ if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES + Config.cpp + PartitionViewStep.cpp + core/BootLoaderModel.cpp core/ColorUtils.cpp - core/Config.cpp core/DeviceList.cpp core/DeviceModel.cpp core/KPMHelpers.cpp @@ -75,7 +77,6 @@ if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND gui/PartitionLabelsView.cpp gui/PartitionSizeController.cpp gui/PartitionSplitterWidget.cpp - gui/PartitionViewStep.cpp gui/ResizeVolumeGroupDialog.cpp gui/ScanningDialog.cpp gui/ReplaceWidget.cpp diff --git a/src/modules/partition/core/Config.cpp b/src/modules/partition/Config.cpp similarity index 99% rename from src/modules/partition/core/Config.cpp rename to src/modules/partition/Config.cpp index 69dbe17d3..c24fdea20 100644 --- a/src/modules/partition/core/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -9,7 +9,7 @@ #include "Config.h" -#include "PartUtils.h" +#include "core/PartUtils.h" #include "GlobalStorage.h" #include "JobQueue.h" diff --git a/src/modules/partition/core/Config.h b/src/modules/partition/Config.h similarity index 100% rename from src/modules/partition/core/Config.h rename to src/modules/partition/Config.h diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp similarity index 99% rename from src/modules/partition/gui/PartitionViewStep.cpp rename to src/modules/partition/PartitionViewStep.cpp index cc06ba967..c75706972 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp @@ -11,10 +11,10 @@ * */ -#include "gui/PartitionViewStep.h" +#include "PartitionViewStep.h" +#include "Config.h" #include "core/BootLoaderModel.h" -#include "core/Config.h" #include "core/DeviceModel.h" #include "core/PartitionCoreModule.h" #include "gui/ChoicePage.h" diff --git a/src/modules/partition/gui/PartitionViewStep.h b/src/modules/partition/PartitionViewStep.h similarity index 100% rename from src/modules/partition/gui/PartitionViewStep.h rename to src/modules/partition/PartitionViewStep.h diff --git a/src/modules/partition/core/PartitionActions.h b/src/modules/partition/core/PartitionActions.h index 3a345dc4e..4a60f4735 100644 --- a/src/modules/partition/core/PartitionActions.h +++ b/src/modules/partition/core/PartitionActions.h @@ -10,7 +10,7 @@ #ifndef PARTITIONACTIONS_H #define PARTITIONACTIONS_H -#include "core/Config.h" +#include "Config.h" #include #include diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 0c86fd718..6bbb852be 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -11,15 +11,9 @@ #include "ChoicePage.h" -#include "BootInfoWidget.h" -#include "DeviceInfoWidget.h" -#include "PartitionBarsView.h" -#include "PartitionLabelsView.h" -#include "PartitionSplitterWidget.h" -#include "ReplaceWidget.h" -#include "ScanningDialog.h" +#include "Config.h" + #include "core/BootLoaderModel.h" -#include "core/Config.h" #include "core/DeviceModel.h" #include "core/KPMHelpers.h" #include "core/OsproberEntry.h" @@ -28,6 +22,13 @@ #include "core/PartitionCoreModule.h" #include "core/PartitionInfo.h" #include "core/PartitionModel.h" +#include "gui/BootInfoWidget.h" +#include "gui/DeviceInfoWidget.h" +#include "gui/PartitionBarsView.h" +#include "gui/PartitionLabelsView.h" +#include "gui/PartitionSplitterWidget.h" +#include "gui/ReplaceWidget.h" +#include "gui/ScanningDialog.h" #include "Branding.h" #include "GlobalStorage.h" diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index 30de05cb9..5e0a24d43 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -15,7 +15,7 @@ #include "ui_ChoicePage.h" -#include "core/Config.h" +#include "Config.h" #include "core/OsproberEntry.h" #include From 5f7cfefed7407e9fbf61b9b0b82e044e9c532f05 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 11:43:20 +0200 Subject: [PATCH 15/24] [partition] Migrate EFI settings-setting to Config object --- src/modules/partition/Config.cpp | 24 +++++++++++++++++++++ src/modules/partition/PartitionViewStep.cpp | 19 ---------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index c24fdea20..1e0a1ce84 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -228,6 +228,28 @@ Config::allowManualPartitioning() const return gs->value( "allowManualPartitioning" ).toBool(); } +static void +fillGSConfigurationEFI( Calamares::GlobalStorage* gs, const QVariantMap& configurationMap ) +{ + // Set up firmwareType global storage entry. This is used, e.g. by the bootloader module. + QString firmwareType( PartUtils::isEfiSystem() ? QStringLiteral( "efi" ) : QStringLiteral( "bios" ) ); + gs->insert( "firmwareType", firmwareType ); + + gs->insert( "efiSystemPartition", CalamaresUtils::getString( configurationMap, "efiSystemPartition", QStringLiteral( "/boot/efi" ) ) ); + + // Read and parse key efiSystemPartitionSize + if ( configurationMap.contains( "efiSystemPartitionSize" ) ) + { + gs->insert( "efiSystemPartitionSize", CalamaresUtils::getString( configurationMap, "efiSystemPartitionSize" ) ); + } + + // Read and parse key efiSystemPartitionName + if ( configurationMap.contains( "efiSystemPartitionName" ) ) + { + gs->insert( "efiSystemPartitionName", CalamaresUtils::getString( configurationMap, "efiSystemPartitionName" ) ); + } +} + void Config::setConfigurationMap( const QVariantMap& configurationMap ) @@ -288,6 +310,8 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) m_requiredPartitionTableType.append( configurationMap.value( "requiredPartitionTableType" ).toString() ); } gs->insert( "requiredPartitionTableType", m_requiredPartitionTableType ); + + fillGSConfigurationEFI(gs, configurationMap); } void diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp index c75706972..cea1df023 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp @@ -548,25 +548,6 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) // Copy the efiSystemPartition setting to the global storage. It is needed not only in // the EraseDiskPage, but also in the bootloader configuration modules (grub, bootloader). Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - QString efiSP = CalamaresUtils::getString( configurationMap, "efiSystemPartition", QStringLiteral( "/boot/efi" ) ); - gs->insert( "efiSystemPartition", efiSP ); - - // Set up firmwareType global storage entry. This is used, e.g. by the bootloader module. - QString firmwareType( PartUtils::isEfiSystem() ? QStringLiteral( "efi" ) : QStringLiteral( "bios" ) ); - cDebug() << o << "Setting firmwareType to" << firmwareType; - gs->insert( "firmwareType", firmwareType ); - - // Read and parse key efiSystemPartitionSize - if ( configurationMap.contains( "efiSystemPartitionSize" ) ) - { - gs->insert( "efiSystemPartitionSize", CalamaresUtils::getString( configurationMap, "efiSystemPartitionSize" ) ); - } - - // Read and parse key efiSystemPartitionName - if ( configurationMap.contains( "efiSystemPartitionName" ) ) - { - gs->insert( "efiSystemPartitionName", CalamaresUtils::getString( configurationMap, "efiSystemPartitionName" ) ); - } // Read and parse key swapPartitionName if ( configurationMap.contains( "swapPartitionName" ) ) From 46f2d72b4c081da88747c73475ed25079421d3d9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 11:48:53 +0200 Subject: [PATCH 16/24] [partition] requiredPartitionTableType: improve docs --- src/modules/partition/partition.conf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index a900bdf48..23f1f12b6 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -113,12 +113,11 @@ initialSwapChoice: none # Restrict the installation on disks that match the type of partition # tables that are specified. # -# Suggested values: msdos, gpt -# If nothing is specified, Calamares defaults to both "msdos" and "mbr". +# Possible values: msdos, gpt. Names are case-sensitive and defined by KPMCore. +# +# If nothing is specified, Calamares defaults to both "msdos" and "gpt". # -# Names are case-sensitive and defined by KPMCore. # requiredPartitionTableType: gpt -# or, # requiredPartitionTableType: # - msdos # - gpt From 88be947f6c0f5cc3aacef4908e6ef8121fdcc78e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 12:13:37 +0200 Subject: [PATCH 17/24] [libcalamares] Expand tests for Variant access - document that getStringList() also handles strings as 1-element lists --- src/libcalamares/utils/Tests.cpp | 33 +++++++++++++++++++++++--------- src/libcalamares/utils/Variant.h | 12 ++++++++---- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/libcalamares/utils/Tests.cpp b/src/libcalamares/utils/Tests.cpp index 7a6d52623..a689505e9 100644 --- a/src/libcalamares/utils/Tests.cpp +++ b/src/libcalamares/utils/Tests.cpp @@ -46,26 +46,27 @@ private Q_SLOTS: void testCommands(); - /** @brief Test that all the UMask objects work correctly. */ + /** @section Test that all the UMask objects work correctly. */ void testUmask(); - /** @brief Tests the entropy functions. */ + /** @section Tests the entropy functions. */ void testEntropy(); void testPrintableEntropy(); void testOddSizedPrintable(); - /** @brief Tests the RAII bits. */ + /** @section Tests the RAII bits. */ void testBoolSetter(); void testPointerSetter(); - /** @brief Tests the Traits bits. */ + /** @section Tests the Traits bits. */ void testTraits(); + /** @section Testing the variants-methods */ void testVariantStringListCode(); void testVariantStringListYAMLDashed(); void testVariantStringListYAMLBracketed(); - /** @brief Test smart string truncation. */ + /** @section Test smart string truncation. */ void testStringTruncation(); void testStringTruncationShorter(); void testStringTruncationDegenerate(); @@ -476,17 +477,31 @@ LibCalamaresTests::testVariantStringListCode() QCOMPARE( getStringList( m, key ), QStringList {} ); m.insert( key, 17 ); QCOMPARE( getStringList( m, key ), QStringList {} ); - m.insert( key, QString( "more strings" ) ); - QCOMPARE( getStringList( m, key ), - QStringList { "more strings" } ); // A single string **can** be considered a stringlist! m.insert( key, QVariant {} ); QCOMPARE( getStringList( m, key ), QStringList {} ); } { - // Things that are stringlists + // Things that are **like** stringlists + QVariantMap m; + m.insert( key, QString( "astring" ) ); + QCOMPARE( getStringList( m, key ).count(), 1 ); + QCOMPARE( getStringList( m, key ), + QStringList { "astring" } ); // A single string **can** be considered a stringlist! + m.insert( key, QString( "more strings" ) ); + QCOMPARE( getStringList( m, key ).count(), 1 ); + QCOMPARE( getStringList( m, key ), + QStringList { "more strings" } ); + m.insert( key, QString() ); + QCOMPARE( getStringList( m, key ).count(), 1 ); + QCOMPARE( getStringList( m, key ), QStringList { QString() } ); + } + + { + // Things that are definitely stringlists QVariantMap m; m.insert( key, QStringList { "aap", "noot" } ); + QCOMPARE( getStringList( m, key ).count(), 2 ); QVERIFY( getStringList( m, key ).contains( "aap" ) ); QVERIFY( !getStringList( m, key ).contains( "mies" ) ); } diff --git a/src/libcalamares/utils/Variant.h b/src/libcalamares/utils/Variant.h index e1261f877..ab9e73f90 100644 --- a/src/libcalamares/utils/Variant.h +++ b/src/libcalamares/utils/Variant.h @@ -25,13 +25,17 @@ namespace CalamaresUtils */ DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d = false ); -/** - * Get a string value from a mapping with a given key; returns @p d if no value. +/** @brief Get a string value from a mapping with a given key; returns @p d if no value. + * + * The value must be an actual string; numbers are not automatically converted to strings, + * nor are lists flattened or converted. */ DLLEXPORT QString getString( const QVariantMap& map, const QString& key, const QString& d = QString() ); -/** - * Get a string list from a mapping with a given key; returns @p d if no value. +/** @brief Get a string list from a mapping with a given key; returns @p d if no value. + * + * This is slightly more lenient that getString(), and a single-string value will + * be returned as a 1-item list. */ DLLEXPORT QStringList getStringList( const QVariantMap& map, const QString& key, const QStringList& d = QStringList() ); From ebecfb9f8b368bd913dba3d6fe1b4ddc1efaa285 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 12:21:14 +0200 Subject: [PATCH 18/24] [partition] Simplify config-reading (now the variant-docs are better) --- src/modules/partition/Config.cpp | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index 1e0a1ce84..7de7dbbe3 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -278,16 +278,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) if ( configurationMap.contains( "availableFileSystemTypes" ) ) { - QStringList fsTypes; - - if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::List ) - { - fsTypes = CalamaresUtils::getStringList( configurationMap, "availableFileSystemTypes" ); - } - else if ( configurationMap.value( "availableFileSystemTypes" ).type() == QVariant::String ) - { - fsTypes = QStringList { CalamaresUtils::getString( configurationMap, "availableFileSystemTypes" ) }; - } + QStringList fsTypes = CalamaresUtils::getStringList( configurationMap, "availableFileSystemTypes" ); m_eraseFsTypes = fsTypes; if ( !fsTypes.empty() ) @@ -297,18 +288,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) } } - if ( configurationMap.contains( "requiredPartitionTableType" ) - && configurationMap.value( "requiredPartitionTableType" ).type() == QVariant::List ) - { - m_requiredPartitionTableType.clear(); - m_requiredPartitionTableType.append( configurationMap.value( "requiredPartitionTableType" ).toStringList() ); - } - else if ( configurationMap.contains( "requiredPartitionTableType" ) - && configurationMap.value( "requiredPartitionTableType" ).type() == QVariant::String ) - { - m_requiredPartitionTableType.clear(); - m_requiredPartitionTableType.append( configurationMap.value( "requiredPartitionTableType" ).toString() ); - } + m_requiredPartitionTableType = CalamaresUtils::getStringList( configurationMap, "requiredPartitionTableType" ); gs->insert( "requiredPartitionTableType", m_requiredPartitionTableType ); fillGSConfigurationEFI(gs, configurationMap); From 5e3a0eda7315be86a97729cace504a2fe6862103 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 13:01:21 +0200 Subject: [PATCH 19/24] [partition] Reduce confused naming --- src/modules/packagechooser/Config.h | 2 +- src/modules/partition/Config.cpp | 2 +- src/modules/partition/Config.h | 11 ++++++++++- src/modules/partition/PartitionViewStep.cpp | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/modules/packagechooser/Config.h b/src/modules/packagechooser/Config.h index 4cb545cb8..5959e3ea4 100644 --- a/src/modules/packagechooser/Config.h +++ b/src/modules/packagechooser/Config.h @@ -72,7 +72,7 @@ public: */ void updateGlobalStorage( const QStringList& selected ) const; /// As updateGlobalStorage() with an empty selection list - void updateGlobalStorage() const { updateGlobalStorage( QStringList() ); } + void fillGSSecondaryConfiguration() const { updateGlobalStorage( QStringList() ); } private: PackageListModel* m_model = nullptr; diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index 7de7dbbe3..a47bf90f8 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -295,7 +295,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) } void -Config::updateGlobalStorage() const +Config::fillGSSecondaryConfiguration() const { // If there's no setting (e.g. from the welcome page) for required storage // then use ours, if it was set. diff --git a/src/modules/partition/Config.h b/src/modules/partition/Config.h index 8b420a8d0..826cc73b5 100644 --- a/src/modules/partition/Config.h +++ b/src/modules/partition/Config.h @@ -60,7 +60,16 @@ public: using EraseFsTypesSet = QStringList; void setConfigurationMap( const QVariantMap& ); - void updateGlobalStorage() const; + /** @brief Set GS values where other modules configuration has priority + * + * Some "required" values are duplicated between modules; if some + * othe module hasn't already set the GS value, take a value from + * the partitioning configuration. + * + * Applicable GS keys: + * - requiredStorageGiB + */ + void fillGSSecondaryConfiguration() const; /** @brief What kind of installation (partitioning) is requested **initially**? * diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp index cea1df023..47315e6a0 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp @@ -368,7 +368,7 @@ PartitionViewStep::isAtEnd() const void PartitionViewStep::onActivate() { - m_config->updateGlobalStorage(); + m_config->fillGSSecondaryConfiguration(); // if we're coming back to PVS from the next VS if ( m_widget->currentWidget() == m_choicePage && m_config->installChoice() == Config::InstallChoice::Alongside ) From f4944408955918527cce1d39f9622aa0373cf5fa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 13:21:46 +0200 Subject: [PATCH 20/24] [partition] Don't run bool allowManualPartitioning through GS It's a bit over-wrought to store a bool in a QVariant in GS for consumption **only** by ChoicePage, so drop that GS key and store it locally. --- src/modules/partition/Config.cpp | 13 ++----------- src/modules/partition/Config.h | 7 ++++--- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index a47bf90f8..deb75d2a4 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -220,14 +220,6 @@ Config::setEraseFsTypeChoice( const QString& choice ) } } - -bool -Config::allowManualPartitioning() const -{ - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - return gs->value( "allowManualPartitioning" ).toBool(); -} - static void fillGSConfigurationEFI( Calamares::GlobalStorage* gs, const QVariantMap& configurationMap ) { @@ -272,9 +264,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) } setSwapChoice( m_initialSwapChoice ); - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - gs->insert( "allowManualPartitioning", - CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ) ); + m_allowManualPartitioning = CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ); if ( configurationMap.contains( "availableFileSystemTypes" ) ) { @@ -288,6 +278,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) } } + Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); m_requiredPartitionTableType = CalamaresUtils::getStringList( configurationMap, "requiredPartitionTableType" ); gs->insert( "requiredPartitionTableType", m_requiredPartitionTableType ); diff --git a/src/modules/partition/Config.h b/src/modules/partition/Config.h index 826cc73b5..309bb4a49 100644 --- a/src/modules/partition/Config.h +++ b/src/modules/partition/Config.h @@ -112,9 +112,8 @@ public: QString eraseFsType() const { return m_eraseFsTypeChoice; } - - ///@brief Is manual partitioning allowed (not explicitly disnabled in the config file)? - bool allowManualPartitioning() const; + ///@brief Is manual partitioning allowed (not explicitly disabled in the config file)? + bool allowManualPartitioning() const { return m_allowManualPartitioning; } public Q_SLOTS: void setInstallChoice( int ); ///< Translates a button ID or so to InstallChoice @@ -138,6 +137,8 @@ private: InstallChoice m_installChoice = NoChoice; qreal m_requiredStorageGiB = 0.0; // May duplicate setting in the welcome module QStringList m_requiredPartitionTableType; + + bool m_allowManualPartitioning = true; }; /** @brief Given a set of swap choices, return a sensible value from it. From 67fafa04ac9452e95766165b373b068222839de9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 14:47:09 +0200 Subject: [PATCH 21/24] [partition] Move fs-type handling into Config - the defaultFileSystemType interacts with availableFileSystemTypes so set them together. --- src/modules/partition/Config.cpp | 68 +++++++++++++++++---- src/modules/partition/Config.h | 20 +++++- src/modules/partition/PartitionViewStep.cpp | 28 +-------- 3 files changed, 76 insertions(+), 40 deletions(-) diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index deb75d2a4..7a931b9be 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -242,6 +242,61 @@ fillGSConfigurationEFI( Calamares::GlobalStorage* gs, const QVariantMap& configu } } +void +Config::fillConfigurationFSTypes(const QVariantMap& configurationMap) +{ + Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); + + + // The defaultFileSystemType setting needs a bit more processing, + // as we want to cover various cases (such as different cases) + QString fsName = CalamaresUtils::getString( configurationMap, "defaultFileSystemType" ); + QString fsRealName; + FileSystem::Type fsType = FileSystem::Type::Unknown; + if ( fsName.isEmpty() ) + { + cWarning() << "Partition-module setting *defaultFileSystemType* is missing, will use ext4"; + fsRealName = PartUtils::canonicalFilesystemName( QStringLiteral("ext4"), &fsType ); + } + else + { + fsRealName = PartUtils::canonicalFilesystemName( fsName, &fsType ); + if ( fsType == FileSystem::Type::Unknown ) + { + cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << fsName << ") using ext4 instead"; + fsRealName = PartUtils::canonicalFilesystemName( QStringLiteral("ext4"), &fsType ); + } + else if ( fsRealName != fsName ) + { + cWarning() << "Partition-module setting *defaultFileSystemType* changed to" << fsRealName; + } + } + Q_ASSERT( fsType != FileSystem::Type::Unknown ); + m_defaultFsType = fsType; + gs->insert( "defaultFileSystemType", fsRealName ); + + // TODO: canonicalize the names? How is translation supposed to work? + m_eraseFsTypes = CalamaresUtils::getStringList( configurationMap, "availableFileSystemTypes" ); + if ( !m_eraseFsTypes.contains( fsRealName ) ) + { + if ( !m_eraseFsTypes.isEmpty() ) + { + // Explicitly set, and doesn't include the default + cWarning() << "Partition-module *availableFileSystemTypes* does not contain the default" << fsRealName; + m_eraseFsTypes.prepend( fsRealName ); + } + else + { + // Not explicitly set, so it's empty; don't complain + m_eraseFsTypes = QStringList { fsRealName }; + } + } + + Q_ASSERT( !m_eraseFsTypes.isEmpty() ); + m_eraseFsTypeChoice = m_eraseFsTypes.first(); + Q_EMIT eraseModeFilesystemChanged( m_eraseFsTypeChoice ); +} + void Config::setConfigurationMap( const QVariantMap& configurationMap ) @@ -266,23 +321,12 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) m_allowManualPartitioning = CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ); - if ( configurationMap.contains( "availableFileSystemTypes" ) ) - { - QStringList fsTypes = CalamaresUtils::getStringList( configurationMap, "availableFileSystemTypes" ); - - m_eraseFsTypes = fsTypes; - if ( !fsTypes.empty() ) - { - m_eraseFsTypeChoice = m_eraseFsTypes.first(); - Q_EMIT eraseModeFilesystemChanged( m_eraseFsTypeChoice ); - } - } - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); m_requiredPartitionTableType = CalamaresUtils::getStringList( configurationMap, "requiredPartitionTableType" ); gs->insert( "requiredPartitionTableType", m_requiredPartitionTableType ); fillGSConfigurationEFI(gs, configurationMap); + fillConfigurationFSTypes( configurationMap ); } void diff --git a/src/modules/partition/Config.h b/src/modules/partition/Config.h index 309bb4a49..3365403fa 100644 --- a/src/modules/partition/Config.h +++ b/src/modules/partition/Config.h @@ -12,6 +12,8 @@ #include "utils/NamedEnum.h" +#include + #include #include @@ -108,10 +110,22 @@ public: */ SwapChoice swapChoice() const { return m_swapChoice; } + /** @brief Get the list of configured FS types to use with *erase* mode + * + * This list is not empty. + */ EraseFsTypesSet eraseFsTypes() const { return m_eraseFsTypes; } + /** @brief Currently-selected FS type for *erase* mode + */ QString eraseFsType() const { return m_eraseFsTypeChoice; } + /** @brief Configured default FS type (for other modes than erase) + * + * This is not "Unknown" or "Unformatted" + */ + FileSystem::Type defaultFsType() const { return m_defaultFsType; } + ///@brief Is manual partitioning allowed (not explicitly disabled in the config file)? bool allowManualPartitioning() const { return m_allowManualPartitioning; } @@ -128,9 +142,13 @@ Q_SIGNALS: void eraseModeFilesystemChanged( const QString& ); private: - SwapChoiceSet m_swapChoices; + /** @brief Handle FS-type configuration, for erase and default */ + void fillConfigurationFSTypes( const QVariantMap& configurationMap ); EraseFsTypesSet m_eraseFsTypes; QString m_eraseFsTypeChoice; + FileSystem::Type m_defaultFsType; + + SwapChoiceSet m_swapChoices; SwapChoice m_initialSwapChoice = NoSwap; SwapChoice m_swapChoice = NoSwap; InstallChoice m_initialInstallChoice = NoChoice; diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp index 47315e6a0..fc6b3e50c 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp @@ -541,8 +541,6 @@ PartitionViewStep::onLeave() void PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { - Logger::Once o; - m_config->setConfigurationMap( configurationMap ); // Copy the efiSystemPartition setting to the global storage. It is needed not only in @@ -563,30 +561,6 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "enableLuksAutomatedPartitioning", CalamaresUtils::getBool( configurationMap, "enableLuksAutomatedPartitioning", true ) ); - // The defaultFileSystemType setting needs a bit more processing, - // as we want to cover various cases (such as different cases) - QString fsName = CalamaresUtils::getString( configurationMap, "defaultFileSystemType" ); - FileSystem::Type fsType; - if ( fsName.isEmpty() ) - { - cWarning() << "Partition-module setting *defaultFileSystemType* is missing, will use ext4"; - } - QString fsRealName = PartUtils::canonicalFilesystemName( fsName, &fsType ); - if ( fsRealName == fsName ) - { - cDebug() << o << "Partition-module setting *defaultFileSystemType*" << fsRealName; - } - else if ( fsType != FileSystem::Unknown ) - { - cWarning() << "Partition-module setting *defaultFileSystemType* changed" << fsRealName; - } - else - { - cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << fsName << ") using" << fsRealName - << "instead."; - } - gs->insert( "defaultFileSystemType", fsRealName ); - QString partitionTableName = CalamaresUtils::getString( configurationMap, "defaultPartitionTableType" ); if ( partitionTableName.isEmpty() ) { @@ -608,7 +582,7 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) QFuture< void > future = QtConcurrent::run( this, &PartitionViewStep::initPartitionCoreModule ); m_future->setFuture( future ); - m_core->initLayout( fsType == FileSystem::Unknown ? FileSystem::Ext4 : fsType, + m_core->initLayout( m_config->defaultFsType(), configurationMap.value( "partitionLayout" ).toList() ); } From c3528e4e40aac264d0eb081b87d220c905f3af92 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 14:52:16 +0200 Subject: [PATCH 22/24] [partition] Document that the default FS is used, also when erasing --- src/modules/partition/Config.cpp | 3 ++- src/modules/partition/partition.conf | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp index 7a931b9be..82c0ad846 100644 --- a/src/modules/partition/Config.cpp +++ b/src/modules/partition/Config.cpp @@ -293,7 +293,8 @@ Config::fillConfigurationFSTypes(const QVariantMap& configurationMap) } Q_ASSERT( !m_eraseFsTypes.isEmpty() ); - m_eraseFsTypeChoice = m_eraseFsTypes.first(); + Q_ASSERT( m_eraseFsTypes.contains( fsRealName ) ); + m_eraseFsTypeChoice = fsRealName; Q_EMIT eraseModeFilesystemChanged( m_eraseFsTypeChoice ); } diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 23f1f12b6..61e955375 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -144,6 +144,9 @@ defaultFileSystemType: "ext4" # above), but it is also possible to give users a choice: # list suitable filesystems here. A drop-down is provided # to pick which is the filesystems will be used. +# +# The value *defaultFileSystemType* is added to this list (with a warning) +# if not present; the default pick is the *defaultFileSystemType*. availableFileSystemTypes: ["ext4", "btrfs", "f2fs"] # Show/hide LUKS related functionality in automated partitioning modes. From 453d533d2c852fa412d097612c0feb249551e002 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 Jun 2021 23:47:33 +0200 Subject: [PATCH 23/24] [partition] Use default FS for layout items with type Unknown --- .../partition/core/PartitionLayout.cpp | 74 ++++++++++++++++++- src/modules/partition/core/PartitionLayout.h | 20 ++++- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index c828fce69..a8ed206d8 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -95,7 +95,7 @@ PartitionLayout::addEntry( const PartitionEntry& entry ) void PartitionLayout::init( FileSystem::Type defaultFsType, const QVariantList& config ) { - bool ok; + bool ok = true; // bogus argument to getSubMap() m_partLayout.clear(); @@ -130,10 +130,71 @@ PartitionLayout::init( FileSystem::Type defaultFsType, const QVariantList& confi if ( !m_partLayout.count() ) { - addEntry( { defaultFsType, QString( "/" ), QString( "100%" ) } ); + // Unknown will be translated to defaultFsType at apply-time + addEntry( { FileSystem::Type::Unknown, QString( "/" ), QString( "100%" ) } ); } + + setDefaultFsType( defaultFsType ); } +void +PartitionLayout::setDefaultFsType(FileSystem::Type defaultFsType) +{ + using T = FileSystem::Type; + switch ( defaultFsType ) + { + case T::Unknown: + case T::Unformatted: + case T::Extended: + case T::LinuxSwap: + case T::Luks: + case T::Ocfs2: + case T::Lvm2_PV: + case T::Udf: + case T::Iso9660: + case T::Luks2: + case T::LinuxRaidMember: + case T::BitLocker: + // bad bad + cWarning() << "The selected default FS" << defaultFsType << "is not suitable." << "Using ext4 instead."; + defaultFsType = T::Ext4; + break; + case T::Ext2: + case T::Ext3: + case T::Ext4: + case T::Fat32: + case T::Ntfs: + case T::Reiser4: + case T::ReiserFS: + case T::Xfs: + case T::Jfs: + case T::Btrfs: + case T::Exfat: + case T::F2fs: + // ok + break; + case T::Fat12: + case T::Fat16: + case T::Hfs: + case T::HfsPlus: + case T::Ufs: + case T::Hpfs: + case T::Zfs: + case T::Nilfs2: + case T::Apfs: + case T::Minix: + // weird + cWarning() << "The selected default FS" << defaultFsType << "is unusual, but not wrong."; + break; + default: + cWarning() << "The selected default FS" << defaultFsType << "is not known to Calamares." << "Using ext4 instead."; + defaultFsType = T::Ext4; + } + + m_defaultFsType = defaultFsType; +} + + QList< Partition* > PartitionLayout::createPartitions( Device* dev, qint64 firstSector, @@ -142,6 +203,9 @@ PartitionLayout::createPartitions( Device* dev, PartitionNode* parent, const PartitionRole& role ) { + // Make sure the default FS is sensible; warn and use ext4 if not + setDefaultFsType( m_defaultFsType ); + QList< Partition* > partList; // Map each partition entry to its requested size (0 when calculated later) QMap< const PartitionLayout::PartitionEntry*, qint64 > partSectorsMap; @@ -210,6 +274,8 @@ PartitionLayout::createPartitions( Device* dev, } } + auto correctFS = [d=m_defaultFsType]( FileSystem::Type t ) { return t == FileSystem::Type::Unknown ? d : t; }; + // Create the partitions. currentSector = firstSector; availableSectors = totalSectors; @@ -229,7 +295,7 @@ PartitionLayout::createPartitions( Device* dev, part = KPMHelpers::createNewPartition( parent, *dev, role, - entry.partFileSystem, + correctFS( entry.partFileSystem ), entry.partLabel, currentSector, currentSector + sectors - 1, @@ -240,7 +306,7 @@ PartitionLayout::createPartitions( Device* dev, part = KPMHelpers::createNewEncryptedPartition( parent, *dev, role, - entry.partFileSystem, + correctFS( entry.partFileSystem ), entry.partLabel, currentSector, currentSector + sectors - 1, diff --git a/src/modules/partition/core/PartitionLayout.h b/src/modules/partition/core/PartitionLayout.h index 6e0c73f8f..c4c26d9f1 100644 --- a/src/modules/partition/core/PartitionLayout.h +++ b/src/modules/partition/core/PartitionLayout.h @@ -87,11 +87,28 @@ public: * * @p config is a list of partition entries (in QVariant form, * read from YAML). If no entries are given, then a single - * partition is created with the given @p defaultFsType + * partition is created with type Unkown. + * + * Any partitions with FS type Unknown will get the default filesystem + * that is set at **apply** time (e.g. when createPartitions() is + * called as well. + * + * @see setDefaultFsType() */ void init( FileSystem::Type defaultFsType, const QVariantList& config ); + /** @brief add an entry as if it had been listed in the config + * + * The same comments about filesystem type apply. + */ bool addEntry( const PartitionEntry& entry ); + /** @brief set the default filesystem type + * + * Any partitions in the layout with type Unknown will get + * the default type when createPartitions() is called. + */ + void setDefaultFsType( FileSystem::Type defaultFsType ); + /** * @brief Apply the current partition layout to the selected drive space. * @return A list of Partition objects. @@ -105,6 +122,7 @@ public: private: QList< PartitionEntry > m_partLayout; + FileSystem::Type m_defaultFsType = FileSystem::Type::Unknown; }; #endif /* PARTITIONLAYOUT_H */ From 6a7a486b8cf43462ad717378a2e61a184e048732 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 5 Jul 2021 12:28:17 +0200 Subject: [PATCH 24/24] [partition] Document interactions between defaultFS and layout --- src/modules/partition/partition.conf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 61e955375..3213e0d33 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -215,7 +215,12 @@ availableFileSystemTypes: ["ext4", "btrfs", "f2fs"] # - uuid: partition uuid (optional parameter; gpt only; requires KPMCore >= 4.2.0) # - type: partition type (optional parameter; gpt only; requires KPMCore >= 4.2.0) # - attributes: partition attributes (optional parameter; gpt only; requires KPMCore >= 4.2.0) -# - filesystem: filesystem type (optional parameter; fs not created if "unformatted" or unset) +# - filesystem: filesystem type (optional parameter) +# - if not set at all, treat as "unformatted" +# - if "unformatted", no filesystem will be created +# - if "unknown" (or an unknown FS name, like "elephant") then the +# default filesystem type, or the user's choice, will be applied instead +# of "unknown" (e.g. the user might pick ext4, or xfs). # - mountPoint: partition mount point (optional parameter; not mounted if unset) # - size: partition size in bytes (append 'K', 'M' or 'G' for KiB, MiB or GiB) # or