diff --git a/src/modules/partition/FillGlobalStorageJob.cpp b/src/modules/partition/FillGlobalStorageJob.cpp index 344df9a20..4abd20643 100644 --- a/src/modules/partition/FillGlobalStorageJob.cpp +++ b/src/modules/partition/FillGlobalStorageJob.cpp @@ -22,14 +22,28 @@ #include #include #include +#include // CalaPM #include #include #include -FillGlobalStorageJob::FillGlobalStorageJob( QList< Device* > devices ) +#include + +static QVariant +mapForPartition( Partition* partition ) +{ + QVariantMap map; + map[ "device" ] = partition->partitionPath(); + map[ "mountPoint" ] = PartitionInfo::mountPoint( partition ); + map[ "fs" ] = partition->fileSystem().name(); + return map; +} + +FillGlobalStorageJob::FillGlobalStorageJob( QList< Device* > devices, const QString& bootLoaderPath ) : m_devices( devices ) + , m_bootLoaderPath( bootLoaderPath ) { } @@ -42,20 +56,37 @@ FillGlobalStorageJob::prettyName() const Calamares::JobResult FillGlobalStorageJob::exec() { - QVariantList lst; - for( auto device : m_devices ) - for( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it) - lst << mapForPartition( *it ); - Calamares::JobQueue::instance()->globalStorage()->insert( "partitions", lst ); + Calamares::GlobalStorage* storage = Calamares::JobQueue::instance()->globalStorage(); + storage->insert( "partitions", createPartitionList() ); + QVariant var = createBootLoaderMap(); + if ( !var.isValid() ) + return Calamares::JobResult::error( tr( "Failed to find path for boot loader" ) ); + storage->insert( "bootLoader", var ); return Calamares::JobResult::ok(); } QVariant -FillGlobalStorageJob::mapForPartition( Partition* partition ) +FillGlobalStorageJob::createPartitionList() +{ + QVariantList lst; + for( auto device : m_devices ) + for( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it) + lst << mapForPartition( *it ); + return lst; +} + +QVariant +FillGlobalStorageJob::createBootLoaderMap() { QVariantMap map; - map[ "device" ] = partition->partitionPath(); - map[ "mountPoint" ] = PartitionInfo::mountPoint( partition ); - map[ "fs" ] = partition->fileSystem().name(); + QString path = m_bootLoaderPath; + if ( !path.startsWith( "/dev/" ) ) + { + Partition* partition = PMUtils::findPartitionByMountPoint( m_devices, path ); + if ( !partition ) + return QVariant(); + path = partition->partitionPath(); + } + map[ "installPath" ] = path; return map; } diff --git a/src/modules/partition/FillGlobalStorageJob.h b/src/modules/partition/FillGlobalStorageJob.h index 3eb1a8703..5e0797435 100644 --- a/src/modules/partition/FillGlobalStorageJob.h +++ b/src/modules/partition/FillGlobalStorageJob.h @@ -28,20 +28,23 @@ class Device; class Partition; /** - * Fills the "partitions" key of GlobalStorage. Doing it after partitioning - * makes it possible to access information such as the partition UUID. + * Fills the partitioning-related keys of GlobalStorage. Doing it after + * partitioning makes it possible to access information such as the partition + * device path. */ class FillGlobalStorageJob : public Calamares::Job { Q_OBJECT public: - FillGlobalStorageJob( QList< Device* > devices ); + FillGlobalStorageJob( QList< Device* > devices, const QString& bootLoaderPath ); QString prettyName() const override; Calamares::JobResult exec() override; private: QList< Device* > m_devices; + QString m_bootLoaderPath; - QVariant mapForPartition( Partition* ); + QVariant createPartitionList(); + QVariant createBootLoaderMap(); }; #endif /* FILLGLOBALSTORAGEJOB_H */ diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index 76d76b8a5..57f4b77b6 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -225,7 +225,7 @@ PartitionCoreModule::jobs() const lst << info->jobs; devices << info->device.data(); } - lst << Calamares::job_ptr( new FillGlobalStorageJob( devices ) ); + lst << Calamares::job_ptr( new FillGlobalStorageJob( devices, m_bootLoaderInstallPath ) ); return lst; }