From ce1e8fa499414ee26fee259904ba5f4a41a3e8a2 Mon Sep 17 00:00:00 2001 From: Philip Date: Sat, 16 Dec 2017 08:46:22 -0500 Subject: [PATCH] [partition] update to kpmcore v3.3 --- CMakeModules/IncludeKPMCore.cmake | 4 +- src/modules/partition/CMakeLists.txt | 36 +---- src/modules/partition/core/ColorUtils.cpp | 33 ++++- src/modules/partition/core/KPMHelpers.cpp | 6 - .../partition/gui/CreatePartitionDialog.cpp | 19 +++ .../partition/gui/CreatePartitionDialog.ui | 20 ++- src/modules/partition/gui/PartitionPage.cpp | 13 +- .../partition/jobs/CreatePartitionJob.cpp | 70 +-------- .../jobs/CreatePartitionTableJob.cpp | 1 - .../partition/jobs/DeletePartitionJob.cpp | 47 +----- .../partition/jobs/FillGlobalStorageJob.cpp | 46 +----- .../partition/jobs/FormatPartitionJob.cpp | 1 - src/modules/partition/jobs/PartitionJob.cpp | 9 ++ src/modules/partition/jobs/PartitionJob.h | 8 ++ .../partition/jobs/ResizePartitionJob.cpp | 14 +- .../partition/jobs/SetPartitionFlagsJob.cpp | 136 +++++------------- src/modules/partition/partition.conf | 13 +- src/modules/partition/tests/CMakeLists.txt | 2 - .../partition/tests/PartitionJobTests.cpp | 2 - 19 files changed, 167 insertions(+), 313 deletions(-) diff --git a/CMakeModules/IncludeKPMCore.cmake b/CMakeModules/IncludeKPMCore.cmake index b06299d91..4b4b8b3f2 100644 --- a/CMakeModules/IncludeKPMCore.cmake +++ b/CMakeModules/IncludeKPMCore.cmake @@ -12,6 +12,6 @@ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) include(KDEInstallDirs) include(GenerateExportHeader) find_package( KF5 REQUIRED CoreAddons ) -find_package( KF5 REQUIRED Config I18n IconThemes KIO Service ) +find_package( KF5 REQUIRED Config I18n Service WidgetsAddons ) -find_package( KPMcore 3.0.3 REQUIRED ) +find_package( KPMcore 3.2 REQUIRED ) diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index ee96c4275..59b897092 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -1,39 +1,11 @@ -find_package(ECM 5.10.0 REQUIRED NO_MODULE) -set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) +find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) include(KDEInstallDirs) include(GenerateExportHeader) -find_package( KF5 REQUIRED CoreAddons ) - -# These are needed because KPMcore links publicly against ConfigCore, I18n, IconThemes, KIOCore and Service -find_package( KF5 REQUIRED Config I18n IconThemes KIO Service ) - -find_package( KPMcore 3.1.50 QUIET ) -if ( KPMcore_FOUND ) - add_definitions(-DWITH_KPMCORE22) -endif() -find_package( KPMcore 3.0.3 QUIET ) -# 3.0.3 and newer has fixes for NVMe support; allow 3.0.2, but warn -# about it .. needs to use a different feature name because it otherwise -# gets reported as KPMcore (the package). -if ( KPMcore_FOUND ) - message( STATUS "KPMCore supports NVMe operations" ) - add_feature_info( KPMcoreNVMe KPMcore_FOUND "KPMcore with NVMe support" ) -else() - find_package( KPMcore 3.0.2 REQUIRED ) - message( WARNING "KPMCore 3.0.2 is known to have bugs with NVMe devices" ) - add_feature_info( KPMcoreNVMe KPMcore_FOUND "Older KPMcore with no NVMe support" ) -endif() - -find_library( atasmart_LIB atasmart ) -find_library( blkid_LIB blkid ) -if( NOT atasmart_LIB ) - message( WARNING "atasmart library not found." ) -endif() -if( NOT blkid_LIB ) - message( WARNING "blkid library not found." ) -endif() +find_package( Qt5 REQUIRED DBus ) +find_package( KF5 REQUIRED Config CoreAddons I18n WidgetsAddons ) +find_package( KPMcore 3.3 REQUIRED ) include_directories( ${KPMCORE_INCLUDE_DIR} ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) diff --git a/src/modules/partition/core/ColorUtils.cpp b/src/modules/partition/core/ColorUtils.cpp index eb3150ab7..2f9710057 100644 --- a/src/modules/partition/core/ColorUtils.cpp +++ b/src/modules/partition/core/ColorUtils.cpp @@ -24,6 +24,7 @@ // KPMcore #include +#include // Qt #include @@ -86,9 +87,19 @@ colorForPartition( Partition* partition ) return EXTENDED_COLOR; if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && - !partition->fileSystem().uuid().isEmpty() && - s_partitionColorsCache.contains( partition->fileSystem().uuid() ) ) - return s_partitionColorsCache[ partition->fileSystem().uuid() ]; + !partition->fileSystem().uuid().isEmpty() ) + { + if ( partition->fileSystem().type() == FileSystem::Luks ) + { + FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() ); + if ( !luksFs.outerUuid().isEmpty() && + s_partitionColorsCache.contains( luksFs.outerUuid() ) ) + return s_partitionColorsCache[ luksFs.outerUuid() ]; + } + + if ( s_partitionColorsCache.contains( partition->fileSystem().uuid() ) ) + return s_partitionColorsCache[ partition->fileSystem().uuid() ]; + } // No partition-specific color needed, pick one from our list, but skip // free space: we don't want a partition to change colors if space before @@ -119,8 +130,20 @@ colorForPartition( Partition* partition ) if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone && !partition->fileSystem().uuid().isEmpty() ) - s_partitionColorsCache.insert( partition->fileSystem().uuid(), - PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ] ); + { + if ( partition->fileSystem().type() == FileSystem::Luks ) + { + FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() ); + if ( !luksFs.outerUuid().isEmpty() ) + { + s_partitionColorsCache.insert( luksFs.outerUuid(), + PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ] ); + } + } + else + s_partitionColorsCache.insert( partition->fileSystem().uuid(), + PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ] ); + } return PARTITION_COLORS[ colorIdx % NUM_PARTITION_COLORS ]; } diff --git a/src/modules/partition/core/KPMHelpers.cpp b/src/modules/partition/core/KPMHelpers.cpp index 6ed167eee..9f97d5e8c 100644 --- a/src/modules/partition/core/KPMHelpers.cpp +++ b/src/modules/partition/core/KPMHelpers.cpp @@ -116,9 +116,7 @@ createNewPartition( PartitionNode* parent, PartitionTable::Flags flags ) { FileSystem* fs = FileSystemFactory::create( fsType, firstSector, lastSector -#ifdef WITH_KPMCORE22 ,device.logicalSize() -#endif ); return new Partition( parent, @@ -153,9 +151,7 @@ createNewEncryptedPartition( PartitionNode* parent, FileSystemFactory::create( FileSystem::Luks, firstSector, lastSector -#ifdef WITH_KPMCORE22 ,device.logicalSize() -#endif ) ); if ( !fs ) { @@ -186,9 +182,7 @@ clonePartition( Device* device, Partition* partition ) partition->fileSystem().type(), partition->firstSector(), partition->lastSector() -#ifdef WITH_KPMCORE22 ,device->logicalSize() -#endif ); return new Partition( partition->parent(), *device, diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 90cf92051..7d32b7d33 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include static QSet< FileSystem::Type > s_unmountableFS( @@ -66,6 +68,19 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->encryptWidget->setText( tr( "En&crypt" ) ); m_ui->encryptWidget->hide(); + if (m_device->type() == Device::Disk_Device) { + m_ui->lvNameLabel->hide(); + m_ui->lvNameLineEdit->hide(); + } + if (m_device->type() == Device::LVM_Device) { + /* LVM logical volume name can consist of: letters numbers _ . - + + * It cannot start with underscore _ and must not be equal to . or .. or any entry in /dev/ + * QLineEdit accepts QValidator::Intermediate, so we just disable . at the beginning */ + QRegularExpression re(QStringLiteral(R"(^(?!_|\.)[\w\-.+]+)")); + QRegularExpressionValidator *validator = new QRegularExpressionValidator(re, this); + m_ui->lvNameLineEdit->setValidator(validator); + } + QStringList mountPoints = { "/", "/boot", "/home", "/opt", "/usr", "/var" }; if ( PartUtils::isEfiSystem() ) mountPoints << Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString(); @@ -227,6 +242,10 @@ CreatePartitionDialog::createPartition() ); } + if (m_device->type() == Device::LVM_Device) { + partition->setPartitionPath(m_device->deviceNode() + QStringLiteral("/") + m_ui->lvNameLineEdit->text().trimmed()); + } + PartitionInfo::setMountPoint( partition, m_ui->mountPointComboBox->currentText() ); PartitionInfo::setFormat( partition, true ); diff --git a/src/modules/partition/gui/CreatePartitionDialog.ui b/src/modules/partition/gui/CreatePartitionDialog.ui index ba457b29c..ac355c880 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.ui +++ b/src/modules/partition/gui/CreatePartitionDialog.ui @@ -146,6 +146,16 @@ + + + LVM LV name + + + + + + + &Mount Point: @@ -155,7 +165,7 @@ - + true @@ -165,21 +175,21 @@ - + - + Flags: - + true @@ -192,7 +202,7 @@ - + Qt::Vertical diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 62e7a97a1..88b03ec72 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -119,7 +119,7 @@ PartitionPage::~PartitionPage() void PartitionPage::updateButtons() { - bool create = false, edit = false, del = false; + bool create = false, createTable = false, edit = false, del = false; QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( index.isValid() ) @@ -141,11 +141,18 @@ PartitionPage::updateButtons() edit = !isFree && !isExtended; del = !isFree; } + + if ( m_ui->deviceComboBox->currentIndex() >= 0 ) + { + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + if ( m_core->deviceModel()->deviceForIndex( deviceIndex )->type() != Device::LVM_Device ) + createTable = true; + } + m_ui->createButton->setEnabled( create ); m_ui->editButton->setEnabled( edit ); m_ui->deleteButton->setEnabled( del ); - - m_ui->newPartitionTableButton->setEnabled( m_ui->deviceComboBox->currentIndex() >= 0 ); + m_ui->newPartitionTableButton->setEnabled( createTable ); } void diff --git a/src/modules/partition/jobs/CreatePartitionJob.cpp b/src/modules/partition/jobs/CreatePartitionJob.cpp index aab032a87..3b16df2fc 100644 --- a/src/modules/partition/jobs/CreatePartitionJob.cpp +++ b/src/modules/partition/jobs/CreatePartitionJob.cpp @@ -24,15 +24,12 @@ #include "utils/Units.h" // KPMcore -#include -#include -#include -#include -#include #include +#include #include #include #include +#include #include // Qt @@ -78,68 +75,15 @@ CreatePartitionJob::prettyStatusMessage() const Calamares::JobResult CreatePartitionJob::exec() { - int step = 0; - const qreal stepCount = 4; - Report report( nullptr ); + NewOperation op(*m_device, m_partition); + op.setStatus(Operation::StatusRunning); + QString message = tr( "The installer failed to create partition on disk '%1'." ).arg( m_device->name() ); - - progress( step++ / stepCount ); - CoreBackend* backend = CoreBackendManager::self()->backend(); - QScopedPointer backendDevice( backend->openDevice( m_device->deviceNode() ) ); - if ( !backendDevice.data() ) - { - return Calamares::JobResult::error( - message, - tr( "Could not open device '%1'." ).arg( m_device->deviceNode() ) - ); - } - - progress( step++ / stepCount ); - QScopedPointer backendPartitionTable( backendDevice->openPartitionTable() ); - if ( !backendPartitionTable.data() ) - { - return Calamares::JobResult::error( - message, - tr( "Could not open partition table." ) - ); - } - - progress( step++ / stepCount ); - QString partitionPath = backendPartitionTable->createPartition( report, *m_partition ); - if ( partitionPath.isEmpty() ) - { - return Calamares::JobResult::error( - message, - report.toText() - ); - } - m_partition->setPartitionPath( partitionPath ); - backendPartitionTable->commit(); - - progress( step++ / stepCount ); - FileSystem& fs = m_partition->fileSystem(); - if ( fs.type() == FileSystem::Unformatted || fs.type() == FileSystem::Extended ) + if (op.execute(report)) return Calamares::JobResult::ok(); - if ( !fs.create( report, partitionPath ) ) - { - return Calamares::JobResult::error( - tr( "The installer failed to create file system on partition %1." ).arg( partitionPath ), - report.toText() - ); - } - - if ( !backendPartitionTable->setPartitionSystemType( report, *m_partition ) ) - { - return Calamares::JobResult::error( - tr( "The installer failed to update partition table on disk '%1'." ).arg( m_device->name() ), - report.toText() - ); - } - - backendPartitionTable->commit(); - return Calamares::JobResult::ok(); + return Calamares::JobResult::error(message, report.toText()); } void diff --git a/src/modules/partition/jobs/CreatePartitionTableJob.cpp b/src/modules/partition/jobs/CreatePartitionTableJob.cpp index e4430134f..5d2df6bc9 100644 --- a/src/modules/partition/jobs/CreatePartitionTableJob.cpp +++ b/src/modules/partition/jobs/CreatePartitionTableJob.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include diff --git a/src/modules/partition/jobs/DeletePartitionJob.cpp b/src/modules/partition/jobs/DeletePartitionJob.cpp index bceffd133..1bed8739f 100644 --- a/src/modules/partition/jobs/DeletePartitionJob.cpp +++ b/src/modules/partition/jobs/DeletePartitionJob.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include DeletePartitionJob::DeletePartitionJob( Device* device, Partition* partition ) @@ -65,48 +66,14 @@ Calamares::JobResult DeletePartitionJob::exec() { Report report( nullptr ); + DeleteOperation op(*m_device, m_partition); + op.setStatus(Operation::StatusRunning); + QString message = tr( "The installer failed to delete partition %1." ).arg( m_partition->devicePath() ); + if (op.execute(report)) + return Calamares::JobResult::ok(); - if ( m_device->deviceNode() != m_partition->devicePath() ) - { - return Calamares::JobResult::error( - message, - tr( "Partition (%1) and device (%2) do not match." ) - .arg( m_partition->devicePath() ) - .arg( m_device->deviceNode() ) - ); - } - - CoreBackend* backend = CoreBackendManager::self()->backend(); - QScopedPointer backendDevice( backend->openDevice( m_device->deviceNode() ) ); - if ( !backendDevice.data() ) - { - return Calamares::JobResult::error( - message, - tr( "Could not open device %1." ).arg( m_device->deviceNode() ) - ); - } - - QScopedPointer backendPartitionTable( backendDevice->openPartitionTable() ); - if ( !backendPartitionTable.data() ) - { - return Calamares::JobResult::error( - message, - tr( "Could not open partition table." ) - ); - } - - bool ok = backendPartitionTable->deletePartition( report, *m_partition ); - if ( !ok ) - { - return Calamares::JobResult::error( - message, - report.toText() - ); - } - - backendPartitionTable->commit(); - return Calamares::JobResult::ok(); + return Calamares::JobResult::error(message, report.toText()); } void diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index 443eb8b9e..a3d709b5b 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -77,50 +77,6 @@ getLuksUuid( const QString& path ) return uuid; } -// TODO: this will be available from KPMCore soon -static const char* filesystem_labels[] = { - "unknown", - "extended", - - "ext2", - "ext3", - "ext4", - "linuxswap", - "fat16", - "fat32", - "ntfs", - "reiser", - "reiser4", - "xfs", - "jfs", - "hfs", - "hfsplus", - "ufs", - "unformatted", - "btrfs", - "hpfs", - "luks", - "ocfs2", - "zfs", - "exfat", - "nilfs2", - "lvm2 pv", - "f2fs", - "udf", - "iso9660", -}; - -Q_STATIC_ASSERT_X((sizeof(filesystem_labels) / sizeof(char *)) >= FileSystem::__lastType, "Mismatch in filesystem labels"); - -static QString -untranslatedTypeName(FileSystem::Type t) -{ - - Q_ASSERT( t >= 0 ); - Q_ASSERT( t <= FileSystem::__lastType ); - - return QLatin1String(filesystem_labels[t]); -} static QVariant mapForPartition( Partition* partition, const QString& uuid ) @@ -129,7 +85,7 @@ mapForPartition( Partition* partition, const QString& uuid ) map[ "device" ] = partition->partitionPath(); map[ "mountPoint" ] = PartitionInfo::mountPoint( partition ); map[ "fsName" ] = partition->fileSystem().name(); - map[ "fs" ] = untranslatedTypeName( partition->fileSystem().type() ); + map[ "fs" ] = partition->fileSystem().name( { QStringLiteral("C") } ); // Untranslated if ( partition->fileSystem().type() == FileSystem::Luks && dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() ) map[ "fs" ] = dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS()->name(); diff --git a/src/modules/partition/jobs/FormatPartitionJob.cpp b/src/modules/partition/jobs/FormatPartitionJob.cpp index 162839ce7..bc13946c6 100644 --- a/src/modules/partition/jobs/FormatPartitionJob.cpp +++ b/src/modules/partition/jobs/FormatPartitionJob.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include diff --git a/src/modules/partition/jobs/PartitionJob.cpp b/src/modules/partition/jobs/PartitionJob.cpp index a85540704..2de93ac47 100644 --- a/src/modules/partition/jobs/PartitionJob.cpp +++ b/src/modules/partition/jobs/PartitionJob.cpp @@ -21,3 +21,12 @@ PartitionJob::PartitionJob( Partition* partition ) : m_partition( partition ) {} + +void PartitionJob::progress(int percent) +{ + if ( percent < 0 ) + percent = 0; + if ( percent > 100 ) + percent = 100; + emit progress( qreal( percent / 100.0 ) ); +} diff --git a/src/modules/partition/jobs/PartitionJob.h b/src/modules/partition/jobs/PartitionJob.h index fc27e14f2..cf773d60e 100644 --- a/src/modules/partition/jobs/PartitionJob.h +++ b/src/modules/partition/jobs/PartitionJob.h @@ -37,6 +37,14 @@ public: return m_partition; } +public slots: + /** @brief Translate from KPMCore to Calamares progress. + * + * KPMCore presents progress as an integer percent from 0 .. 100, + * while Calamares uses a qreal from 0 .. 1.00 . + */ + void progress( int percent ); + protected: Partition* m_partition; }; diff --git a/src/modules/partition/jobs/ResizePartitionJob.cpp b/src/modules/partition/jobs/ResizePartitionJob.cpp index 41950d4df..340a19acd 100644 --- a/src/modules/partition/jobs/ResizePartitionJob.cpp +++ b/src/modules/partition/jobs/ResizePartitionJob.cpp @@ -20,11 +20,15 @@ #include "jobs/ResizePartitionJob.h" +#include "utils/Units.h" + // KPMcore #include #include #include +using CalamaresUtils::BytesToMiB; + //- ResizePartitionJob --------------------------------------------------------- ResizePartitionJob::ResizePartitionJob( Device* device, Partition* partition, qint64 firstSector, qint64 lastSector ) : PartitionJob( partition ) @@ -51,8 +55,8 @@ ResizePartitionJob::prettyDescription() const return tr( "Resize %2MB partition %1 to " "%3MB." ) .arg( partition()->partitionPath() ) - .arg( ( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ) - .arg( ( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ); + .arg( ( BytesToMiB( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() ) ) + .arg( ( BytesToMiB( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() ) ); } @@ -62,8 +66,8 @@ ResizePartitionJob::prettyStatusMessage() const return tr( "Resizing %2MB partition %1 to " "%3MB." ) .arg( partition()->partitionPath() ) - .arg( ( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ) - .arg( ( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() / 1024 / 1024 ); + .arg( ( BytesToMiB( m_oldLastSector - m_oldFirstSector + 1 ) * partition()->sectorSize() ) ) + .arg( ( BytesToMiB( m_newLastSector - m_newFirstSector + 1 ) * partition()->sectorSize() ) ); } @@ -76,7 +80,7 @@ ResizePartitionJob::exec() m_partition->setLastSector( m_oldLastSector ); ResizeOperation op(*m_device, *m_partition, m_newFirstSector, m_newLastSector); op.setStatus(Operation::StatusRunning); - connect(&op, &Operation::progress, [&](int percent) { emit progress(percent / 100.0); } ); + connect(&op, &Operation::progress, this, &ResizePartitionJob::progress ); QString errorMessage = tr( "The installer failed to resize partition %1 on disk '%2'." ) .arg( m_partition->partitionPath() ) diff --git a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp index 8c562450f..ecc8b2142 100644 --- a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp +++ b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp @@ -22,19 +22,20 @@ #include "SetPartitionFlagsJob.h" #include "utils/Logger.h" +#include "utils/Units.h" -#include -#include -#include -#include -#include -#include -#include -#include +// KPMcore +#include +#include +#include +#include +#include + +using CalamaresUtils::BytesToMiB; SetPartFlagsJob::SetPartFlagsJob( Device* device, - Partition* partition, - PartitionTable::Flags flags ) + Partition* partition, + PartitionTable::Flags flags ) : PartitionJob( partition ) , m_device( device ) , m_flags( flags ) @@ -49,8 +50,8 @@ SetPartFlagsJob::prettyName() const if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Set flags on %1MB %2 partition." ) - .arg( partition()->capacity() /1024 /1024) - .arg( partition()->fileSystem().name() ); + .arg( BytesToMiB( partition()->capacity() ) ) + .arg( partition()->fileSystem().name() ); return tr( "Set flags on new partition." ); } @@ -64,12 +65,12 @@ SetPartFlagsJob::prettyDescription() const { if ( !partition()->partitionPath().isEmpty() ) return tr( "Clear flags on partition %1." ) - .arg( partition()->partitionPath() ); + .arg( partition()->partitionPath() ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Clear flags on %1MB %2 partition." ) - .arg( partition()->capacity() /1024 /1024) - .arg( partition()->fileSystem().name() ); + .arg( BytesToMiB( partition()->capacity() ) ) + .arg( partition()->fileSystem().name() ); return tr( "Clear flags on new partition." ); } @@ -77,18 +78,18 @@ SetPartFlagsJob::prettyDescription() const if ( !partition()->partitionPath().isEmpty() ) return tr( "Flag partition %1 as " "%2." ) - .arg( partition()->partitionPath() ) - .arg( flagsList.join( ", " ) ); + .arg( partition()->partitionPath() ) + .arg( flagsList.join( ", " ) ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Flag %1MB %2 partition as " "%3." ) - .arg( partition()->capacity() /1024 /1024) - .arg( partition()->fileSystem().name() ) - .arg( flagsList.join( ", " ) ); + .arg( BytesToMiB( partition()->capacity() ) ) + .arg( partition()->fileSystem().name() ) + .arg( flagsList.join( ", " ) ); return tr( "Flag new partition as %1." ) - .arg( flagsList.join( ", " ) ); + .arg( flagsList.join( ", " ) ); } @@ -100,12 +101,12 @@ SetPartFlagsJob::prettyStatusMessage() const { if ( !partition()->partitionPath().isEmpty() ) return tr( "Clearing flags on partition %1." ) - .arg( partition()->partitionPath() ); + .arg( partition()->partitionPath() ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Clearing flags on %1MB %2 partition." ) - .arg( partition()->capacity() /1024 /1024) - .arg( partition()->fileSystem().name() ); + .arg( BytesToMiB( partition()->capacity() ) ) + .arg( partition()->fileSystem().name() ); return tr( "Clearing flags on new partition." ); } @@ -113,94 +114,33 @@ SetPartFlagsJob::prettyStatusMessage() const if ( !partition()->partitionPath().isEmpty() ) return tr( "Setting flags %2 on partition " "%1." ) - .arg( partition()->partitionPath() ) - .arg( flagsList.join( ", " ) ); + .arg( partition()->partitionPath() ) + .arg( flagsList.join( ", " ) ); if ( !partition()->fileSystem().name().isEmpty() ) return tr( "Setting flags %3 on " "%1MB %2 partition." ) - .arg( partition()->capacity() /1024 /1024) - .arg( partition()->fileSystem().name() ) - .arg( flagsList.join( ", " ) ); + .arg( BytesToMiB( partition()->capacity() ) ) + .arg( partition()->fileSystem().name() ) + .arg( flagsList.join( ", " ) ); return tr( "Setting flags %1 on new partition." ) - .arg( flagsList.join( ", " ) ); + .arg( flagsList.join( ", " ) ); } Calamares::JobResult SetPartFlagsJob::exec() { - PartitionTable::Flags oldFlags = partition()->availableFlags(); - if ( oldFlags == m_flags ) - return Calamares::JobResult::ok(); - - CoreBackend* backend = CoreBackendManager::self()->backend(); + Report report ( nullptr ); + SetPartFlagsOperation op( *m_device, *partition(), m_flags ); + op.setStatus( Operation::StatusRunning ); + connect( &op, &Operation::progress, this, &SetPartFlagsJob::progress ); QString errorMessage = tr( "The installer failed to set flags on partition %1." ) .arg( m_partition->partitionPath() ); + if ( op.execute( report ) ) + return Calamares::JobResult::ok(); - QScopedPointer< CoreBackendDevice > backendDevice( backend->openDevice( m_device->deviceNode() ) ); - if ( !backendDevice.data() ) - { - return Calamares::JobResult::error( - errorMessage, - tr( "Could not open device '%1'." ).arg( m_device->deviceNode() ) - ); - } - - QScopedPointer< CoreBackendPartitionTable > backendPartitionTable( backendDevice->openPartitionTable() ); - if ( !backendPartitionTable.data() ) - { - return Calamares::JobResult::error( - errorMessage, - tr( "Could not open partition table on device '%1'." ).arg( m_device->deviceNode() ) - ); - } - - QScopedPointer< CoreBackendPartition > backendPartition( - ( partition()->roles().has( PartitionRole::Extended ) ) - ? backendPartitionTable->getExtendedPartition() - : backendPartitionTable->getPartitionBySector( partition()->firstSector() ) - ); - if ( !backendPartition.data() ) { - return Calamares::JobResult::error( - errorMessage, - tr( "Could not find partition '%1'." ).arg( partition()->partitionPath() ) - ); - } - - quint32 count = 0; - - foreach( const PartitionTable::Flag& f, PartitionTable::flagList() ) - { - emit progress(++count); - - const bool state = ( m_flags & f ) ? true : false; - - Report report( nullptr ); - if ( !backendPartition->setFlag( report, f, state ) ) - { - cDebug() << QStringLiteral( "WARNING: Could not set flag %2 on " - "partition '%1'." ) - .arg( partition()->partitionPath() ) - .arg( PartitionTable::flagName( f ) ); - } - } - - // HACK: Partition (in KPMcore) declares SetPartFlagsJob as friend, but this actually - // refers to an unrelated class SetPartFlagsJob which is in KPMcore but is not - // exported. - // Obviously here we are relying on having a class in Calamares with the same - // name as a private one in KPMcore, which is awful, but it's the least evil - // way to call Partition::setFlags (KPMcore's SetPartFlagsJob needs its friend - // status for the very same reason). - m_partition->setFlags( m_flags ); - - backendPartitionTable->commit(); - - return Calamares::JobResult::ok(); + return Calamares::JobResult::error( errorMessage, report.toText() ); } - - -#include "SetPartitionFlagsJob.moc" diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 610fb7b42..a5c428e23 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -26,9 +26,16 @@ drawNestedPartitions: false # Show/hide partition labels on manual partitioning page. alwaysShowPartitionLabels: true -# Default filesystem type, pre-selected in the "Create Partition" dialog. -# The filesystem type selected here is also used for automated install -# modes (Erase, Replace and Alongside). +# Default filesystem type, used when a "new" partition is made. +# +# When replacing a partition, the existing filesystem inside the +# partition is retained. In other cases, e.g. Erase and Alongside, +# as well as when using manual partitioning and creating a new +# partition, this filesystem type is pre-selected. Note that +# editing a partition in manual-creation mode will not automatically +# change the filesystem type to this default value -- it is not +# creating a new partition. +# # Suggested values: ext2, ext3, ext4, reiser, xfs, jfs, btrfs # If nothing is specified, Calamares defaults to "ext4". defaultFileSystemType: "ext4" diff --git a/src/modules/partition/tests/CMakeLists.txt b/src/modules/partition/tests/CMakeLists.txt index 41f494ba2..68474287e 100644 --- a/src/modules/partition/tests/CMakeLists.txt +++ b/src/modules/partition/tests/CMakeLists.txt @@ -1,5 +1,4 @@ find_package( Qt5 COMPONENTS Gui Test REQUIRED ) -find_package( KF5 COMPONENTS Service REQUIRED ) include( ECMAddTests ) @@ -31,7 +30,6 @@ ecm_add_test( ${partitionjobtests_SRCS} kpmcore Qt5::Core Qt5::Test - KF5::Service ) set_target_properties( partitionjobtests PROPERTIES AUTOMOC TRUE ) diff --git a/src/modules/partition/tests/PartitionJobTests.cpp b/src/modules/partition/tests/PartitionJobTests.cpp index 8702e0119..bd6962a85 100644 --- a/src/modules/partition/tests/PartitionJobTests.cpp +++ b/src/modules/partition/tests/PartitionJobTests.cpp @@ -219,9 +219,7 @@ PartitionJobTests::newCreatePartitionJob( Partition* freeSpacePartition, Partiti else lastSector = freeSpacePartition->lastSector(); FileSystem* fs = FileSystemFactory::create( type, firstSector, lastSector -#ifdef WITH_KPMCORE22 ,m_device->logicalSize() -#endif ); Partition* partition = new Partition(