diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index d61064041..d09bcd149 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -408,6 +408,56 @@ isEfiBootable( const Partition* candidate ) flags.testFlag( PartitionTable::FlagBoot ); } +QString +findFS( QString fsName, FileSystem::Type* fsType ) +{ + QStringList fsLanguage { QLatin1Literal( "C" ) }; // Required language list to turn off localization + if ( fsName.isEmpty() ) + fsName = QStringLiteral( "ext4" ); + + FileSystem::Type tmpType = FileSystem::typeForName( fsName, fsLanguage ); + if ( tmpType != FileSystem::Unknown ) + { + cDebug() << "Found filesystem" << fsName; + if ( fsType ) + *fsType = tmpType; + return fsName; + } + + // Second pass: try case-insensitive + const auto fstypes = FileSystem::types(); + for ( FileSystem::Type t : fstypes ) + { + if ( 0 == QString::compare( fsName, FileSystem::nameForType( t, fsLanguage ), Qt::CaseInsensitive ) ) + { + QString fsRealName = FileSystem::nameForType( t, fsLanguage ); + cDebug() << "Filesystem name" << fsName << "translated to" << fsRealName; + if ( fsType ) + *fsType = t; + return fsRealName; + } + } + + cDebug() << "Filesystem" << fsName << "not found, using ext4"; + fsName = QStringLiteral( "ext4" ); + // fsType can be used to check whether fsName was a valid filesystem. + if (fsType) + *fsType = FileSystem::Unknown; +#ifdef DEBUG_FILESYSTEMS + // This bit is for distro's debugging their settings, and shows + // all the strings that KPMCore is matching against for FS type. + { + Logger::CDebug d; + using TR = Logger::DebugRow< int, QString >; + const auto fstypes = FileSystem::types(); + d << "Available types (" << fstypes.count() << ')'; + for ( FileSystem::Type t : fstypes ) + d << TR( static_cast( t ), FileSystem::nameForType( t, fsLanguage ) ); + } +#endif + return fsName; +} + } // nmamespace PartUtils /* Implementation of methods for FstabEntry, from OsproberEntry.h */ diff --git a/src/modules/partition/core/PartUtils.h b/src/modules/partition/core/PartUtils.h index b94e20567..c7da86c06 100644 --- a/src/modules/partition/core/PartUtils.h +++ b/src/modules/partition/core/PartUtils.h @@ -22,6 +22,10 @@ #include "OsproberEntry.h" +// KPMcore +#include + +// Qt #include class PartitionCoreModule; @@ -73,6 +77,15 @@ bool isEfiSystem(); * the partition table layout, this may mean different flags. */ 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. + * 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 ); } #endif // PARTUTILS_H diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index f6521cea7..39341fddd 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -26,21 +26,26 @@ #include "core/KPMHelpers.h" #include "core/PartitionActions.h" #include "core/PartitionInfo.h" +#include "core/PartUtils.h" #include #include #include -static int +static FileSystem::Type getDefaultFileSystemType() { Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - int defaultFs = FileSystem::typeForName( gs->value( "defaultFileSystemType" ).toString() ); + FileSystem::Type defaultFS = FileSystem::Ext4; - if ( defaultFs == FileSystem::Unknown ) - defaultFs = FileSystem::Ext4; + if ( gs->contains( "defaultFileSystemType" ) ) + { + PartUtils::findFS( gs->value( "defaultFileSystemType" ).toString(), &defaultFS); + if ( defaultFS == FileSystem::Unknown ) + defaultFS = FileSystem::Ext4; + } - return defaultFs; + return defaultFS; } PartitionLayout::PartitionLayout() @@ -145,7 +150,7 @@ PartitionLayout::addEntry( const QString& label, const QString& mountPoint, cons entry.partLabel = label; entry.partMountPoint = mountPoint; - entry.partFileSystem = FileSystem::typeForName( fs ); + PartUtils::findFS( fs, &entry.partFileSystem ); if ( entry.partFileSystem == FileSystem::Unknown ) entry.partFileSystem = m_defaultFsType; @@ -214,7 +219,7 @@ PartitionLayout::execute( Device *dev, qint64 firstSector, parent, *dev, role, - static_cast(part.partFileSystem), + part.partFileSystem, firstSector, end, PartitionTable::FlagNone @@ -226,7 +231,7 @@ PartitionLayout::execute( Device *dev, qint64 firstSector, parent, *dev, role, - static_cast(part.partFileSystem), + part.partFileSystem, firstSector, end, luksPassphrase, diff --git a/src/modules/partition/core/PartitionLayout.h b/src/modules/partition/core/PartitionLayout.h index f2a4cbff5..999e10425 100644 --- a/src/modules/partition/core/PartitionLayout.h +++ b/src/modules/partition/core/PartitionLayout.h @@ -24,6 +24,7 @@ // KPMcore #include +#include // Qt #include @@ -48,7 +49,7 @@ public: { QString partLabel; QString partMountPoint; - int partFileSystem = 0; + FileSystem::Type partFileSystem = FileSystem::Unknown; double partSize = 0.0L; SizeUnit partSizeUnit = Percent; double partMinSize = 0.0L; @@ -76,7 +77,7 @@ public: QList< Partition* > execute( Device *dev, qint64 firstSector, qint64 lastSector, QString luksPassphrase, PartitionNode* parent, const PartitionRole& role ); private: - int m_defaultFsType; + FileSystem::Type m_defaultFsType; QList< PartitionEntry > m_partLayout; }; diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index a152db14b..3c71302e0 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -493,55 +493,6 @@ nameToChoice( QString name, bool& ok ) return names.find( name, ok ); } -/** @brief translate @p defaultFS into a recognized name - * - * Makes several attempts to translate the string into a - * name that KPMCore will recognize. - */ -static QString -findFS( QString defaultFS ) -{ - QStringList fsLanguage { QLatin1Literal( "C" ) }; // Required language list to turn off localization - if ( defaultFS.isEmpty() ) - { - cWarning() << "Partition-module setting *defaultFileSystemType* is missing, using ext4"; - defaultFS = QStringLiteral( "ext4" ); - } - if ( FileSystem::typeForName( defaultFS, fsLanguage ) != FileSystem::Unknown ) - { - cDebug() << "Partition-module setting *defaultFileSystemType*" << defaultFS; - return defaultFS; - } - - // Second pass: try case-insensitive - const auto fstypes = FileSystem::types(); - for ( FileSystem::Type t : fstypes ) - { - if ( 0 == QString::compare( defaultFS, FileSystem::nameForType( t, fsLanguage ), Qt::CaseInsensitive ) ) - { - defaultFS = FileSystem::nameForType( t, fsLanguage ); - cWarning() << "Partition-module setting *defaultFileSystemType* changed" << defaultFS; - return defaultFS; - } - } - - cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << defaultFS << ") using ext4."; - defaultFS = QStringLiteral( "ext4" ); -#ifdef DEBUG_FILESYSTEMS - // This bit is for distro's debugging their settings, and shows - // all the strings that KPMCore is matching against for FS type. - { - Logger::CDebug d; - using TR = Logger::DebugRow< int, QString >; - const auto fstypes = FileSystem::types(); - d << "Available types (" << fstypes.count() << ')'; - for ( FileSystem::Type t : fstypes ) - d << TR( static_cast( t ), FileSystem::nameForType( t, fsLanguage ) ); - } -#endif - return defaultFS; -} - void PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { @@ -630,7 +581,21 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "alwaysShowPartitionLabels", CalamaresUtils::getBool( configurationMap, "alwaysShowPartitionLabels", true ) ); gs->insert( "enableLuksAutomatedPartitioning", CalamaresUtils::getBool( configurationMap, "enableLuksAutomatedPartitioning", true ) ); gs->insert( "allowManualPartitioning", CalamaresUtils::getBool( configurationMap, "allowManualPartitioning", true ) ); - gs->insert( "defaultFileSystemType", findFS( CalamaresUtils::getString( configurationMap, "defaultFileSystemType" ) ) ); + + // 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::findFS( fsName, &fsType ); + if ( fsRealName == fsName ) + cDebug() << "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 (" << fsRealName << ") using ext4."; + gs->insert( "defaultFileSystemType", fsRealName ); // Now that we have the config, we load the PartitionCoreModule in the background