diff --git a/src/modules/partition/core/KPMHelpers.cpp b/src/modules/partition/core/KPMHelpers.cpp index ed105e28b..d5086ef21 100644 --- a/src/modules/partition/core/KPMHelpers.cpp +++ b/src/modules/partition/core/KPMHelpers.cpp @@ -15,8 +15,8 @@ #include "partition/PartitionIterator.h" #include "utils/Logger.h" +#include "utils/String.h" -// KPMcore #include #include #include @@ -127,4 +127,23 @@ clonePartition( Device* device, Partition* partition ) partition->activeFlags() ); } +Calamares::JobResult +execute( Operation& operation, const QString& failureMessage ) +{ + operation.setStatus( Operation::StatusRunning ); + + Report report( nullptr ); + if ( operation.execute( report ) ) + { + return Calamares::JobResult::ok(); + } + + // Remove the === lines from the report by trimming them to empty + QStringList l = report.toText().split( '\n' ); + std::for_each( l.begin(), l.end(), []( QString& s ) { CalamaresUtils::removeLeading( s, '=' ); } ); + + return Calamares::JobResult::error( failureMessage, l.join( '\n' ) ); +} + + } // namespace KPMHelpers diff --git a/src/modules/partition/core/KPMHelpers.h b/src/modules/partition/core/KPMHelpers.h index 89a019f6c..2f867bc25 100644 --- a/src/modules/partition/core/KPMHelpers.h +++ b/src/modules/partition/core/KPMHelpers.h @@ -11,11 +11,13 @@ #ifndef KPMHELPERS_H #define KPMHELPERS_H -// KPMcore +#include "Job.h" + #include #include +#include +#include -// Qt #include #include @@ -72,6 +74,24 @@ Partition* createNewEncryptedPartition( PartitionNode* parent, Partition* clonePartition( Device* device, Partition* partition ); +/** @brief Return a result for an @p operation + * + * Executes the operation, and if successful, returns a success result. + * Otherwise returns an error using @p failureMessage as the primary part + * of the error, and details obtained from the operation. + */ +Calamares::JobResult execute( Operation& operation, const QString& failureMessage ); +/** @brief Return a result for an @p operation + * + * It's acceptable to use an rvalue: the operation-running is the effect + * you're interested in, rather than keeping the temporary around. + */ +static inline Calamares::JobResult +execute( Operation&& operation, const QString& failureMessage ) +{ + return execute( operation, failureMessage ); +} + } // namespace KPMHelpers #endif /* KPMHELPERS_H */ diff --git a/src/modules/partition/jobs/CreatePartitionJob.cpp b/src/modules/partition/jobs/CreatePartitionJob.cpp index 3e51ed598..fe7c6f350 100644 --- a/src/modules/partition/jobs/CreatePartitionJob.cpp +++ b/src/modules/partition/jobs/CreatePartitionJob.cpp @@ -11,7 +11,9 @@ #include "CreatePartitionJob.h" +#include "core/KPMHelpers.h" #include "core/PartitionInfo.h" + #include "partition/FileSystem.h" #include "partition/PartitionQuery.h" #include "utils/CalamaresUtilsSystem.h" @@ -273,17 +275,9 @@ CreatePartitionJob::exec() return createZfs( m_partition, m_device ); } - 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() ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( + NewOperation( *m_device, m_partition ), + tr( "The installer failed to create partition on disk '%1'." ).arg( m_device->name() ) ); } void diff --git a/src/modules/partition/jobs/CreatePartitionTableJob.cpp b/src/modules/partition/jobs/CreatePartitionTableJob.cpp index 118ec8823..3b9415d1a 100644 --- a/src/modules/partition/jobs/CreatePartitionTableJob.cpp +++ b/src/modules/partition/jobs/CreatePartitionTableJob.cpp @@ -12,9 +12,11 @@ #include "CreatePartitionTableJob.h" #include "partition/PartitionIterator.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" -// KPMcore +#include "core/KPMHelpers.h" + #include #include #include @@ -63,8 +65,6 @@ CreatePartitionTableJob::prettyStatusMessage() const Calamares::JobResult CreatePartitionTableJob::exec() { - Report report( nullptr ); - QString message = tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() ); PartitionTable* table = m_device->partitionTable(); @@ -76,30 +76,16 @@ CreatePartitionTableJob::exec() cDebug() << Logger::SubEntry << ( ( *it ) ? ( *it )->deviceNode() : QString( "" ) ); } - QProcess lsblk; - lsblk.setProgram( "lsblk" ); - lsblk.setProcessChannelMode( QProcess::MergedChannels ); - lsblk.start(); - lsblk.waitForFinished(); - cDebug() << Logger::SubEntry << "lsblk output:\n" << Logger::NoQuote << lsblk.readAllStandardOutput(); + auto lsblkResult = CalamaresUtils::System::runCommand( { "lsblk" }, std::chrono::seconds( 30 ) ); + cDebug() << Logger::SubEntry << "lsblk output:\n" << Logger::NoQuote << lsblkResult.getOutput(); - QProcess mount; - mount.setProgram( "mount" ); // Debug output only, not mounting something - mount.setProcessChannelMode( QProcess::MergedChannels ); - mount.start(); - mount.waitForFinished(); - cDebug() << Logger::SubEntry << "mount output:\n" << Logger::NoQuote << mount.readAllStandardOutput(); + auto mountResult = CalamaresUtils::System::runCommand( { "mount" }, std::chrono::seconds( 30 ) ); + cDebug() << Logger::SubEntry << "mount output:\n" << Logger::NoQuote << mountResult.getOutput(); } - CreatePartitionTableOperation op( *m_device, table ); - op.setStatus( Operation::StatusRunning ); - - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( + CreatePartitionTableOperation( *m_device, table ), + tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() ) ); } void diff --git a/src/modules/partition/jobs/CreateVolumeGroupJob.cpp b/src/modules/partition/jobs/CreateVolumeGroupJob.cpp index 36d79b7b7..683913b7f 100644 --- a/src/modules/partition/jobs/CreateVolumeGroupJob.cpp +++ b/src/modules/partition/jobs/CreateVolumeGroupJob.cpp @@ -9,7 +9,8 @@ #include "CreateVolumeGroupJob.h" -// KPMcore +#include "core/KPMHelpers.h" + #include #include #include @@ -46,19 +47,8 @@ CreateVolumeGroupJob::prettyStatusMessage() const Calamares::JobResult CreateVolumeGroupJob::exec() { - Report report( nullptr ); - - CreateVolumeGroupOperation op( m_vgName, m_pvList, m_peSize ); - - op.setStatus( Operation::StatusRunning ); - - QString message = tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( CreateVolumeGroupOperation( m_vgName, m_pvList, m_peSize ), + tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName ) ); } void diff --git a/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp index 92086015d..65920a84e 100644 --- a/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp +++ b/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp @@ -9,6 +9,8 @@ #include "DeactivateVolumeGroupJob.h" +#include "core/KPMHelpers.h" + #include #include #include @@ -39,18 +41,12 @@ DeactivateVolumeGroupJob::prettyStatusMessage() const Calamares::JobResult DeactivateVolumeGroupJob::exec() { - Report report( nullptr ); - DeactivateVolumeGroupOperation op( *m_device ); - - op.setStatus( Operation::OperationStatus::StatusRunning ); - - QString message = tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() ); - if ( op.execute( report ) ) + auto r = KPMHelpers::execute( + op, tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() ) ); + if ( r ) { op.preview(); - return Calamares::JobResult::ok(); } - - return Calamares::JobResult::error( message, report.toText() ); + return r; } diff --git a/src/modules/partition/jobs/DeletePartitionJob.cpp b/src/modules/partition/jobs/DeletePartitionJob.cpp index a678b5e90..d61bb955e 100644 --- a/src/modules/partition/jobs/DeletePartitionJob.cpp +++ b/src/modules/partition/jobs/DeletePartitionJob.cpp @@ -10,9 +10,11 @@ */ #include "DeletePartitionJob.h" + +#include "core/KPMHelpers.h" + #include "utils/CalamaresUtilsSystem.h" -// KPMcore #include #include #include @@ -45,7 +47,7 @@ removePartition( Partition* partition ) auto r = CalamaresUtils::System::instance()->runCommand( { "sfdisk", "--delete", "--force", partition->devicePath(), QString::number( partition->number() ) }, std::chrono::seconds( 5 ) ); - if ( r.getExitCode() !=0 || r.getOutput().contains("failed") ) + if ( r.getExitCode() != 0 || r.getOutput().contains( "failed" ) ) { return Calamares::JobResult::error( QCoreApplication::translate( DeletePartitionJob::staticMetaObject.className(), "Deletion Failed" ), @@ -96,17 +98,8 @@ DeletePartitionJob::exec() return removePartition( m_partition ); } - 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(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( DeleteOperation( *m_device, m_partition ), + tr( "The installer failed to delete partition %1." ).arg( m_partition->devicePath() ) ); } void diff --git a/src/modules/partition/jobs/FormatPartitionJob.cpp b/src/modules/partition/jobs/FormatPartitionJob.cpp index 4dadacf9c..1ccc6e617 100644 --- a/src/modules/partition/jobs/FormatPartitionJob.cpp +++ b/src/modules/partition/jobs/FormatPartitionJob.cpp @@ -11,6 +11,8 @@ #include "FormatPartitionJob.h" +#include "core/KPMHelpers.h" + #include "partition/FileSystem.h" #include "utils/Logger.h" @@ -65,17 +67,7 @@ FormatPartitionJob::prettyStatusMessage() const Calamares::JobResult FormatPartitionJob::exec() { - Report report( nullptr ); // Root of the report tree, no parent - CreateFileSystemOperation op( *m_device, *m_partition, m_partition->fileSystem().type() ); - op.setStatus( Operation::StatusRunning ); - - QString message = tr( "The installer failed to format partition %1 on disk '%2'." ) - .arg( m_partition->partitionPath(), m_device->name() ); - - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( CreateFileSystemOperation( *m_device, *m_partition, m_partition->fileSystem().type() ), + tr( "The installer failed to format partition %1 on disk '%2'." ) + .arg( m_partition->partitionPath(), m_device->name() ) ); } diff --git a/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp index 3c4e7b036..227351064 100644 --- a/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp +++ b/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp @@ -9,6 +9,8 @@ #include "RemoveVolumeGroupJob.h" +#include "core/KPMHelpers.h" + #include #include #include @@ -39,17 +41,7 @@ RemoveVolumeGroupJob::prettyStatusMessage() const Calamares::JobResult RemoveVolumeGroupJob::exec() { - Report report( nullptr ); - - RemoveVolumeGroupOperation op( *m_device ); - - op.setStatus( Operation::OperationStatus::StatusRunning ); - - QString message = tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( + RemoveVolumeGroupOperation( *m_device ), + tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() ) ); } diff --git a/src/modules/partition/jobs/ResizePartitionJob.cpp b/src/modules/partition/jobs/ResizePartitionJob.cpp index 87b87c1c0..fe1ceca4c 100644 --- a/src/modules/partition/jobs/ResizePartitionJob.cpp +++ b/src/modules/partition/jobs/ResizePartitionJob.cpp @@ -11,9 +11,10 @@ #include "ResizePartitionJob.h" +#include "core/KPMHelpers.h" + #include "utils/Units.h" -// KPMcore #include #include #include @@ -66,23 +67,16 @@ ResizePartitionJob::prettyStatusMessage() const Calamares::JobResult ResizePartitionJob::exec() { - Report report( nullptr ); // Restore partition sectors that were modified for preview m_partition->setFirstSector( m_oldFirstSector ); m_partition->setLastSector( m_oldLastSector ); + ResizeOperation op( *m_device, *m_partition, m_newFirstSector, m_newLastSector ); - op.setStatus( Operation::StatusRunning ); connect( &op, &Operation::progress, this, &ResizePartitionJob::iprogress ); - - QString errorMessage = tr( "The installer failed to resize partition %1 on disk '%2'." ) - .arg( m_partition->partitionPath() ) - .arg( m_device->name() ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( errorMessage, report.toText() ); + return KPMHelpers::execute( op, + tr( "The installer failed to resize partition %1 on disk '%2'." ) + .arg( m_partition->partitionPath() ) + .arg( m_device->name() ) ); } void diff --git a/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp index 1aa4541b8..f7a21d80d 100644 --- a/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp +++ b/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp @@ -9,7 +9,8 @@ #include "ResizeVolumeGroupJob.h" -// KPMcore +#include "core/KPMHelpers.h" + #include #include #include @@ -51,19 +52,9 @@ ResizeVolumeGroupJob::prettyStatusMessage() const Calamares::JobResult ResizeVolumeGroupJob::exec() { - Report report( nullptr ); - - ResizeVolumeGroupOperation op( *m_device, m_partitionList ); - - op.setStatus( Operation::OperationStatus::StatusRunning ); - - QString message = tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( message, report.toText() ); + return KPMHelpers::execute( + ResizeVolumeGroupOperation( *m_device, m_partitionList ), + tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() ) ); } QString diff --git a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp index de77d86f8..507773288 100644 --- a/src/modules/partition/jobs/SetPartitionFlagsJob.cpp +++ b/src/modules/partition/jobs/SetPartitionFlagsJob.cpp @@ -13,6 +13,8 @@ #include "SetPartitionFlagsJob.h" +#include "core/KPMHelpers.h" + #include "partition/FileSystem.h" #include "utils/Logger.h" #include "utils/Units.h" @@ -148,17 +150,8 @@ SetPartFlagsJob::exec() cDebug() << "Setting flags on" << m_device->deviceNode() << "partition" << partition()->deviceNode() << Logger::DebugList( flagsList ); - Report report( nullptr ); SetPartFlagsOperation op( *m_device, *partition(), m_flags ); - op.setStatus( Operation::StatusRunning ); connect( &op, &Operation::progress, this, &SetPartFlagsJob::iprogress ); - - QString errorMessage - = tr( "The installer failed to set flags on partition %1." ).arg( m_partition->partitionPath() ); - if ( op.execute( report ) ) - { - return Calamares::JobResult::ok(); - } - - return Calamares::JobResult::error( errorMessage, report.toText() ); + return KPMHelpers::execute( + op, tr( "The installer failed to set flags on partition %1." ).arg( m_partition->partitionPath() ) ); }