Added espList Function

This commit is contained in:
Sohrab Behdani 2025-01-25 12:39:28 +03:30
parent 7a959951e9
commit df3a15b367
33 changed files with 526 additions and 632 deletions

View file

@ -60,7 +60,6 @@ if(KPMcore_FOUND)
core/DeviceList.cpp core/DeviceList.cpp
core/DeviceModel.cpp core/DeviceModel.cpp
core/KPMHelpers.cpp core/KPMHelpers.cpp
core/DirFSRestrictLayout.cpp
core/OsproberEntry.cpp core/OsproberEntry.cpp
core/PartitionActions.cpp core/PartitionActions.cpp
core/PartitionCoreModule.cpp core/PartitionCoreModule.cpp

View file

@ -47,12 +47,12 @@ Config::swapChoiceNames()
// *INDENT-OFF* // *INDENT-OFF*
// clang-format off // clang-format off
static const NamedEnumTable< SwapChoice > names { static const NamedEnumTable< SwapChoice > names {
{ QStringLiteral( "none" ), SwapChoice::NoSwap }, { QStringLiteral( "none" ), SwapChoice::NoSwap },
{ QStringLiteral( "small" ), SwapChoice::SmallSwap }, { QStringLiteral( "small" ), SwapChoice::SmallSwap },
{ QStringLiteral( "suspend" ), SwapChoice::FullSwap }, { QStringLiteral( "suspend" ), SwapChoice::FullSwap },
{ QStringLiteral( "reuse" ), SwapChoice::ReuseSwap }, { QStringLiteral( "reuse" ), SwapChoice::ReuseSwap },
{ QStringLiteral( "file" ), SwapChoice::SwapFile }, { QStringLiteral( "file" ), SwapChoice::SwapFile },
}; };
// clang-format on // clang-format on
// *INDENT-ON* // *INDENT-ON*
@ -65,10 +65,10 @@ Config::luksGenerationNames()
// *INDENT-OFF* // *INDENT-OFF*
// clang-format off // clang-format off
static const NamedEnumTable< LuksGeneration > names { static const NamedEnumTable< LuksGeneration > names {
{ QStringLiteral( "luks1" ), LuksGeneration::Luks1 }, { QStringLiteral( "luks1" ), LuksGeneration::Luks1 },
{ QStringLiteral( "luks" ), LuksGeneration::Luks1 }, { QStringLiteral( "luks" ), LuksGeneration::Luks1 },
{ QStringLiteral( "luks2" ), LuksGeneration::Luks2 }, { QStringLiteral( "luks2" ), LuksGeneration::Luks2 },
}; };
// clang-format on // clang-format on
// *INDENT-ON* // *INDENT-ON*
@ -260,6 +260,12 @@ Config::setReplaceFilesystemChoice( const QString& filesystemName )
} }
} }
void
Config::setLuksFileSystemType( const LuksGeneration luks)
{
m_luksFileSystemType = luks;
}
bool bool
Config::acceptPartitionTableType( PartitionTable::TableType tableType ) const Config::acceptPartitionTableType( PartitionTable::TableType tableType ) const
{ {
@ -316,6 +322,24 @@ fillGSConfigurationEFI( Calamares::GlobalStorage* gs, const QVariantMap& configu
const auto efiMinimumSize = Calamares::getString( efiConfiguration, "minimumSize" ); const auto efiMinimumSize = Calamares::getString( efiConfiguration, "minimumSize" );
if ( !efiMinimumSize.isEmpty() ) if ( !efiMinimumSize.isEmpty() )
if ( configurationMap.contains( "efiSystemPartitionMinSize" ) )
{
const QString sizeString = Calamares::getString( configurationMap, "efiSystemPartitionMinSize" );
Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( sizeString );
if ( part_size.isValid() )
{
// Insert once as string, once as a size-in-bytes;
// changes to these keys should be synchronized with PartUtils.cpp
gs->insert( "efiSystemPartitionMinSize", sizeString );
gs->insert( "efiSystemPartitionMinSize_i", part_size.toBytes() );
}
else
{
cWarning() << "Minimum EFI partition size" << sizeString << "is invalid, ignored";
}
}
{ {
Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( efiMinimumSize ); Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( efiMinimumSize );
if ( part_size.isValid() ) if ( part_size.isValid() )
@ -406,7 +430,6 @@ Config::fillConfigurationFSTypes( const QVariantMap& configurationMap )
} }
m_luksFileSystemType = luksGeneration; m_luksFileSystemType = luksGeneration;
gs->insert( "luksFileSystemType", luksGenerationNames().find( luksGeneration ) ); gs->insert( "luksFileSystemType", luksGenerationNames().find( luksGeneration ) );
Q_ASSERT( !m_eraseFsTypes.isEmpty() ); Q_ASSERT( !m_eraseFsTypes.isEmpty() );
Q_ASSERT( m_eraseFsTypes.contains( fsRealName ) ); Q_ASSERT( m_eraseFsTypes.contains( fsRealName ) );
m_eraseFsTypeChoice = fsRealName; m_eraseFsTypeChoice = fsRealName;
@ -415,6 +438,7 @@ Config::fillConfigurationFSTypes( const QVariantMap& configurationMap )
Q_EMIT replaceModeFilesystemChanged( m_replaceFileSystemChoice ); Q_EMIT replaceModeFilesystemChanged( m_replaceFileSystemChoice );
} }
void void
Config::setConfigurationMap( const QVariantMap& configurationMap ) Config::setConfigurationMap( const QVariantMap& configurationMap )
{ {
@ -448,11 +472,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
m_showNotEncryptedBootMessage = Calamares::getBool( configurationMap, "showNotEncryptedBootMessage", true ); m_showNotEncryptedBootMessage = Calamares::getBool( configurationMap, "showNotEncryptedBootMessage", true );
m_requiredPartitionTableType = Calamares::getStringList( configurationMap, "requiredPartitionTableType" ); m_requiredPartitionTableType = Calamares::getStringList( configurationMap, "requiredPartitionTableType" );
{ m_bootloaderVar = Calamares::getString( configurationMap, "efiBootLoaderVar", "" );
bool bogus = true;
const auto lvmConfiguration = Calamares::getSubMap( configurationMap, "lvm", bogus );
m_isLVMEnabled = Calamares::getBool( lvmConfiguration, "enable", true);
}
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
gs->insert( "armInstall", Calamares::getBool( configurationMap, "armInstall", false ) ); gs->insert( "armInstall", Calamares::getBool( configurationMap, "armInstall", false ) );

View file

@ -38,8 +38,6 @@ class Config : public QObject
Q_PROPERTY( bool preCheckEncryption READ preCheckEncryption CONSTANT FINAL ) Q_PROPERTY( bool preCheckEncryption READ preCheckEncryption CONSTANT FINAL )
Q_PROPERTY( bool showNotEncryptedBootMessage READ showNotEncryptedBootMessage CONSTANT FINAL ) Q_PROPERTY( bool showNotEncryptedBootMessage READ showNotEncryptedBootMessage CONSTANT FINAL )
Q_PROPERTY( bool lvmEnabled READ isLVMEnabled CONSTANT FINAL )
public: public:
Config( QObject* parent ); Config( QObject* parent );
~Config() override = default; ~Config() override = default;
@ -70,7 +68,6 @@ public:
using EraseFsTypesSet = QStringList; using EraseFsTypesSet = QStringList;
/** @brief Choice of LUKS disk encryption generation */
enum class LuksGeneration enum class LuksGeneration
{ {
Luks1, // First generation of LUKS Luks1, // First generation of LUKS
@ -128,6 +125,11 @@ public:
*/ */
SwapChoice swapChoice() const { return m_swapChoice; } SwapChoice swapChoice() const { return m_swapChoice; }
/** @brief Get the variable name in global storage holding the name of bootloader
*
*/
QString bootloaderVar() const { return m_bootloaderVar; }
/** @brief Get the list of configured FS types to use with *erase* mode /** @brief Get the list of configured FS types to use with *erase* mode
* *
* This list is not empty. * This list is not empty.
@ -176,8 +178,6 @@ public:
/// @brief If zfs encryption should be allowed /// @brief If zfs encryption should be allowed
bool allowZfsEncryption() const { return m_allowZfsEncryption; } bool allowZfsEncryption() const { return m_allowZfsEncryption; }
bool isLVMEnabled() const { return m_isLVMEnabled; }
public Q_SLOTS: public Q_SLOTS:
void setInstallChoice( int ); ///< Translates a button ID or so to InstallChoice void setInstallChoice( int ); ///< Translates a button ID or so to InstallChoice
void setInstallChoice( InstallChoice ); void setInstallChoice( InstallChoice );
@ -185,6 +185,7 @@ public Q_SLOTS:
void setSwapChoice( SwapChoice ); void setSwapChoice( SwapChoice );
void setEraseFsTypeChoice( const QString& filesystemName ); ///< See property eraseModeFilesystem void setEraseFsTypeChoice( const QString& filesystemName ); ///< See property eraseModeFilesystem
void setReplaceFilesystemChoice( const QString& filesystemName ); void setReplaceFilesystemChoice( const QString& filesystemName );
void setLuksFileSystemType( const LuksGeneration );
Q_SIGNALS: Q_SIGNALS:
void installChoiceChanged( InstallChoice ); void installChoiceChanged( InstallChoice );
@ -209,10 +210,10 @@ private:
qreal m_requiredStorageGiB = 0.0; // May duplicate setting in the welcome module qreal m_requiredStorageGiB = 0.0; // May duplicate setting in the welcome module
QStringList m_requiredPartitionTableType; QStringList m_requiredPartitionTableType;
bool m_allowZfsEncryption = true; bool m_allowZfsEncryption = true;
QString m_bootloaderVar;
bool m_allowManualPartitioning = true; bool m_allowManualPartitioning = true;
bool m_preCheckEncryption = false; bool m_preCheckEncryption = false;
bool m_showNotEncryptedBootMessage = true; bool m_showNotEncryptedBootMessage = true;
bool m_isLVMEnabled = true;
}; };
/** @brief Given a set of swap choices, return a sensible value from it. /** @brief Given a set of swap choices, return a sensible value from it.

View file

@ -17,11 +17,11 @@
#include "core/BootLoaderModel.h" #include "core/BootLoaderModel.h"
#include "core/DeviceModel.h" #include "core/DeviceModel.h"
#include "core/PartitionCoreModule.h" #include "core/PartitionCoreModule.h"
#include "core/PartitionInfo.h"
#include "gui/ChoicePage.h" #include "gui/ChoicePage.h"
#include "gui/PartitionBarsView.h" #include "gui/PartitionBarsView.h"
#include "gui/PartitionLabelsView.h" #include "gui/PartitionLabelsView.h"
#include "gui/PartitionPage.h" #include "gui/PartitionPage.h"
#include "partition/FileSystem.h"
#include "Branding.h" #include "Branding.h"
#include "GlobalStorage.h" #include "GlobalStorage.h"
@ -34,7 +34,6 @@
#include "widgets/TranslationFix.h" #include "widgets/TranslationFix.h"
#include "widgets/WaitingWidget.h" #include "widgets/WaitingWidget.h"
#include <kpmcore/core/device.h>
#include <kpmcore/core/partition.h> #include <kpmcore/core/partition.h>
#include <QFormLayout> #include <QFormLayout>
@ -61,18 +60,6 @@ PartitionViewStep::PartitionViewStep( QObject* parent )
// We're not done loading, but we need the configuration map first. // We're not done loading, but we need the configuration map first.
} }
PartitionViewStep::FSConflictEntry::FSConflictEntry() {}
PartitionViewStep::FSConflictEntry::FSConflictEntry( const QString& conflictingPathArg,
const QString& conflictingFilesystemArg,
const QString& conflictedPathArg,
QStringList allowableFilesystemsArg )
: conflictingPath( conflictingPathArg )
, conflictingFilesystem( conflictingFilesystemArg )
, conflictedPath( conflictedPathArg )
, allowableFilesystems( allowableFilesystemsArg )
{}
void void
PartitionViewStep::initPartitionCoreModule() PartitionViewStep::initPartitionCoreModule()
{ {
@ -131,7 +118,7 @@ static QStringList
jobDescriptions( const Calamares::JobList& jobs ) jobDescriptions( const Calamares::JobList& jobs )
{ {
QStringList jobsLines; QStringList jobsLines;
for ( const Calamares::job_ptr& job : std::as_const( jobs ) ) for ( const Calamares::job_ptr& job : qAsConst( jobs ) )
{ {
const auto description = job->prettyDescription(); const auto description = job->prettyDescription();
if ( !description.isEmpty() ) if ( !description.isEmpty() )
@ -375,7 +362,7 @@ PartitionViewStep::next()
{ {
if ( !m_manualPartitionPage ) if ( !m_manualPartitionPage )
{ {
m_manualPartitionPage = new PartitionPage( m_core, *m_config ); m_manualPartitionPage = new PartitionPage( m_core );
m_widget->addWidget( m_manualPartitionPage ); m_widget->addWidget( m_manualPartitionPage );
} }
@ -463,6 +450,63 @@ PartitionViewStep::isAtEnd() const
void void
PartitionViewStep::onActivate() PartitionViewStep::onActivate()
{ {
auto gs = Calamares::JobQueue::instance()->globalStorage();
if ( PartUtils::isEfiSystem() && !m_config->bootloaderVar().isEmpty() )
{
// Alter GS based on prior module
QString efiLocation;
bool efiChanged = false;
bool luksChanged = false;
if ( gs->contains( m_config->bootloaderVar() ) )
{
m_bootloader = gs->value( m_config->bootloaderVar() ).toString();
gs->insert( "curBootloader", m_bootloader );
cDebug() << "The bootloader is " << m_bootloader;
if ( m_bootloader.toLower() == "grub" )
{
efiLocation = "/boot/efi";
}
else if ( m_bootloader.toLower() == "refind" )
{
efiLocation = "/boot";
}
else
{
efiLocation = "/efi";
}
cDebug() << "The efi location is " << efiLocation;
if ( gs->contains( "efiSystemPartition" ) && gs->value( "efiSystemPartition" ).toString() != efiLocation )
{
efiChanged = true;
}
gs->insert( "efiSystemPartition", efiLocation );
}
// Set the luks type
Config::LuksGeneration currentLuks = m_config->luksFileSystemType();
const Config::LuksGeneration newLuks
= m_bootloader == "grub" ? Config::LuksGeneration::Luks1 : Config::LuksGeneration::Luks2;
if ( newLuks != currentLuks )
{
m_config->setLuksFileSystemType( newLuks );
gs->insert( "luksFileSystemType", Config::luksGenerationNames().find( newLuks ) );
luksChanged = true;
}
// This may not be our first trip so reset things if needed
if ( m_core->isDirty() && ( luksChanged || efiChanged ) )
{
m_core->revertAllDevices();
m_choicePage->reset();
}
}
m_config->fillGSSecondaryConfiguration(); m_config->fillGSSecondaryConfiguration();
// if we're coming back to PVS from the next VS // if we're coming back to PVS from the next VS
@ -473,12 +517,6 @@ PartitionViewStep::onActivate()
} }
} }
static QString
listItem( QString s )
{
return s.prepend( QStringLiteral( "<li>" ) ).append( QStringLiteral( "</li>" ) );
}
static bool static bool
shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) shouldWarnForGPTOnBIOS( const PartitionCoreModule* core )
{ {
@ -498,7 +536,7 @@ shouldWarnForGPTOnBIOS( const PartitionCoreModule* core )
if ( table && table->type() == PartitionTable::TableType::gpt ) if ( table && table->type() == PartitionTable::TableType::gpt )
{ {
// So this is a BIOS system, and the bootloader will be installed on a GPT system // So this is a BIOS system, and the bootloader will be installed on a GPT system
for ( const auto& partition : std::as_const( table->children() ) ) for ( const auto& partition : qAsConst( table->children() ) )
{ {
using Calamares::Units::operator""_MiB; using Calamares::Units::operator""_MiB;
if ( ( partition->activeFlags() & KPM_PARTITION_FLAG( BiosGrub ) ) if ( ( partition->activeFlags() & KPM_PARTITION_FLAG( BiosGrub ) )
@ -542,146 +580,50 @@ shouldWarnForNotEncryptedBoot( const Config* config, const PartitionCoreModule*
return false; return false;
} }
static PartitionViewStep::FSConflictEntry
calcFSConflictEntry( PartitionCoreModule* core, PartitionModel* partModel, QModelIndex partFsIdx, QModelIndex partMountPointIdx, QStringList mountPointList )
{
PartitionViewStep::FSConflictEntry result;
QString partFs = partModel->data( partFsIdx ).toString().toLower();
QString partMountPoint = partModel->data( partMountPointIdx ).toString();
FileSystem::Type fsType;
PartUtils::canonicalFilesystemName( partFs, &fsType );
bool fsTypeIsAllowed = false;
if ( fsType == FileSystem::Type::Unknown )
{
fsTypeIsAllowed = true;
}
else
{
QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( partMountPoint, mountPointList, true );
for ( const auto& allowedFsType : allowedFsTypes )
{
if ( fsType == allowedFsType )
{
fsTypeIsAllowed = true;
break;
}
}
}
if ( !fsTypeIsAllowed )
{
QString conflictedPath = core->dirFSRestrictLayout().diagnoseFSConflict( partMountPoint, fsType, mountPointList );
QList< FileSystem::Type > nonConflictingFilesystemTypes = core->dirFSRestrictLayout().allowedFSTypes( conflictedPath, mountPointList, true );
QStringList nonConflictingFilesystems;
for ( const auto& fsType : nonConflictingFilesystemTypes )
{
nonConflictingFilesystems.append( Calamares::Partition::prettyNameForFileSystemType( fsType ) );
}
result = PartitionViewStep::FSConflictEntry( partMountPoint, partFs, conflictedPath, nonConflictingFilesystems );
}
return result;
}
static QList< PartitionViewStep::FSConflictEntry >
checkForFilesystemConflicts( PartitionCoreModule* core )
{
QList< PartitionViewStep::FSConflictEntry > result;
DeviceModel* dm = core->deviceModel();
QStringList mountPointList;
// Walk the device and partition tree, extracting mountpoints from it
for ( int i = 0; i < dm->rowCount(); i++ )
{
Device* dev = dm->deviceForIndex( dm->index( i ) );
PartitionModel* pm = core->partitionModelForDevice( dev );
QModelIndex extPartMountPointIdx = QModelIndex();
bool extPartFound = false;
for ( int j = 0; j < pm->rowCount(); j++ )
{
QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn );
QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn );
if ( pm->data( partFsIdx ).toString().toLower() == "extended" )
{
extPartFound = true;
extPartMountPointIdx = partMountPointIdx;
break;
}
QString mountPoint = pm->data( partMountPointIdx ).toString();
if ( !mountPoint.isEmpty() )
{
mountPointList.append( mountPoint );
}
}
if ( extPartFound )
{
for ( int j = 0; j < pm->rowCount( extPartMountPointIdx ); j++ )
{
QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx );
QString mountPoint = pm->data( partMountPointIdx ).toString();
if ( !mountPoint.isEmpty() )
{
mountPointList.append( mountPoint );
}
}
}
}
// Walk the device and partition tree again, validating it this time
for ( int i = 0; i < dm->rowCount(); i++ )
{
Device* dev = dm->deviceForIndex( dm->index( i ) );
PartitionModel* pm = core->partitionModelForDevice( dev );
QModelIndex extPartFsIdx = QModelIndex();
QModelIndex extPartMountPointIdx = QModelIndex();
bool extPartFound = false;
for ( int j = 0; j < pm->rowCount(); j++ )
{
QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn );
QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn );
if ( pm->data( partFsIdx ).toString().toLower() == "extended" )
{
extPartFound = true;
extPartFsIdx = partFsIdx;
extPartMountPointIdx = partMountPointIdx;
break;
}
PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList );
if ( !conflictEntry.conflictedPath.isEmpty() )
{
result.append( conflictEntry );
}
}
if ( extPartFound )
{
for ( int j = 0; j < pm->rowCount( extPartFsIdx ); j++ )
{
QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn, extPartFsIdx );
QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx );
PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList );
if ( !conflictEntry.conflictedPath.isEmpty() )
{
result.append( conflictEntry );
}
}
}
}
return result;
}
void void
PartitionViewStep::onLeave() PartitionViewStep::onLeave()
{ {
auto gs = Calamares::JobQueue::instance()->globalStorage();
// Put the ESPs in global storage
if ( PartUtils::isEfiSystem() )
{
QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions();
QStringList espPaths;
for ( auto partition : efiSystemPartitions )
{
if ( !partition->partitionPath().trimmed().isEmpty() )
{
espPaths.append( partition->partitionPath() );
}
}
gs->insert( "espList", espPaths );
}
// Check the size of the ESP for systemd-boot
if ( PartUtils::isEfiSystem() && m_bootloader.trimmed() == "systemd-boot" )
{
const QString espMountPoint = gs->value( "efiSystemPartition" ).toString();
Partition* esp = m_core->findPartitionByMountPoint( espMountPoint );
qint64 minEspSize = gs->value( "efiSystemPartitionMinSize_i" ).toLongLong();
if ( esp != nullptr && esp->capacity() < minEspSize )
{
QString minSizeString = gs->value( "efiSystemPartitionMinSize" ).toString();
QString message = tr( "EFI partition too small" );
QString description = tr( "The size of the EFI partition is smaller than recommended "
"for systemd-boot. If you proceed with this partition size, "
"the installation may fail or the system may not boot. "
"The recommended minimum size is %1" )
.arg( minSizeString );
QMessageBox mb( QMessageBox::Warning, message, description, QMessageBox::Ok, m_choicePage );
Calamares::fixButtonLabels( &mb );
mb.exec();
}
}
if ( m_widget->currentWidget() == m_choicePage ) if ( m_widget->currentWidget() == m_choicePage )
{ {
m_choicePage->onLeave(); m_choicePage->onLeave();
@ -689,10 +631,6 @@ PartitionViewStep::onLeave()
} }
const auto* branding = Calamares::Branding::instance(); const auto* branding = Calamares::Branding::instance();
const QString startList = QStringLiteral( "<br/><br/><ul>" );
const QString endList = QStringLiteral( "</ul><br/><br/>" );
if ( m_widget->currentWidget() == m_manualPartitionPage ) if ( m_widget->currentWidget() == m_manualPartitionPage )
{ {
if ( PartUtils::isEfiSystem() ) if ( PartUtils::isEfiSystem() )
@ -707,7 +645,6 @@ PartitionViewStep::onLeave()
Logger::Once o; Logger::Once o;
const bool okType = esp && PartUtils::isEfiFilesystemSuitableType( esp ); const bool okType = esp && PartUtils::isEfiFilesystemSuitableType( esp );
const bool okRecommendedSize = esp && PartUtils::isEfiFilesystemRecommendedSize( esp );
const bool okMinimumSize = esp && PartUtils::isEfiFilesystemMinimumSize( esp ); const bool okMinimumSize = esp && PartUtils::isEfiFilesystemMinimumSize( esp );
const bool okFlag = esp && PartUtils::isEfiBootable( esp ); const bool okFlag = esp && PartUtils::isEfiBootable( esp );
@ -748,6 +685,12 @@ PartitionViewStep::onLeave()
const QString possibleFail = tr( "You can continue with this EFI system " const QString possibleFail = tr( "You can continue with this EFI system "
"partition configuration but your system may fail to start." ); "partition configuration but your system may fail to start." );
const QString startList = QStringLiteral( "<br/><br/><ul>" );
const QString endList = QStringLiteral( "</ul><br/><br/>" );
auto listItem = []( QString s ) -> QString
{ return s.prepend( QStringLiteral( "<li>" ) ).append( QStringLiteral( "</li>" ) ); };
if ( !esp ) if ( !esp )
{ {
cDebug() << o << "No ESP mounted"; cDebug() << o << "No ESP mounted";
@ -777,11 +720,6 @@ PartitionViewStep::onLeave()
description.append( endList ); description.append( endList );
description.append( mayFail ); description.append( mayFail );
} }
else if ( !okRecommendedSize )
{
message = tr( "EFI system partition recommendation" );
description = genericRecommendationMessage + suggestConfiguredSize + possibleFail;
}
if ( !message.isEmpty() ) if ( !message.isEmpty() )
{ {
@ -839,52 +777,6 @@ PartitionViewStep::onLeave()
Calamares::fixButtonLabels( &mb ); Calamares::fixButtonLabels( &mb );
mb.exec(); mb.exec();
} }
QList< FSConflictEntry > conflictMap = checkForFilesystemConflicts( m_core );
if ( !conflictMap.isEmpty() )
{
QString message = tr( "Filesystem conflicts found" );
const QString descHeader = tr( "The chosen manual partitioning layout does not "
"comply with the filesystem restrictions set by the "
"distro. The following issues were found:");
QStringList issueList;
for ( const auto& entry : conflictMap )
{
QString buildString;
if ( entry.conflictedPath == "any" )
{
buildString = tr( "The %1 directory uses filesystem %2, but this distro only allows the following filesystems: %3." )
.arg( entry.conflictingPath )
.arg( entry.conflictingFilesystem )
.arg( entry.allowableFilesystems.join( ", " ) );
issueList.append( buildString );
}
else
{
buildString = tr( "The %1 directory uses filesystem %2, but the %3 directory must use one of the following filesystems: %4." )
.arg( entry.conflictingPath )
.arg( entry.conflictingFilesystem )
.arg( entry.conflictedPath )
.arg( entry.allowableFilesystems.join( ", " ) );
issueList.append( buildString );
}
}
const QString descFooter = tr( "You can continue without setting up filesystems "
"properly, but your system may fail to start." );
QString description = descHeader + startList;
for ( const auto& item : issueList )
{
description += listItem( item );
}
description += endList + descFooter;
QMessageBox mb( QMessageBox::Warning, message, description, QMessageBox::Ok, m_manualPartitionPage );
Calamares::fixButtonLabels( &mb );
mb.exec();
}
} }
} }
@ -941,7 +833,6 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap )
m_future->setFuture( future ); m_future->setFuture( future );
m_core->partitionLayout().init( m_config->defaultFsType(), configurationMap.value( "partitionLayout" ).toList() ); m_core->partitionLayout().init( m_config->defaultFsType(), configurationMap.value( "partitionLayout" ).toList() );
m_core->dirFSRestrictLayout().init( configurationMap.value( "directoryFilesystemRestrictions" ).toList() );
} }
Calamares::JobList Calamares::JobList

View file

@ -39,21 +39,6 @@ class PLUGINDLLEXPORT PartitionViewStep : public Calamares::ViewStep
Q_OBJECT Q_OBJECT
public: public:
struct FSConflictEntry
{
QString conflictingPath;
QString conflictingFilesystem;
QString conflictedPath;
QStringList allowableFilesystems;
FSConflictEntry();
FSConflictEntry( const QString& conflictingPathArg,
const QString& conflictingFilesystemArg,
const QString& conflictedPathArg,
QStringList allowableFilesystemsArg );
FSConflictEntry( const FSConflictEntry& e ) = default;
};
explicit PartitionViewStep( QObject* parent = nullptr ); explicit PartitionViewStep( QObject* parent = nullptr );
~PartitionViewStep() override; ~PartitionViewStep() override;
@ -81,6 +66,8 @@ public:
Calamares::RequirementsList checkRequirements() override; Calamares::RequirementsList checkRequirements() override;
QString bootLoader() const { return m_bootloader; }
private: private:
void initPartitionCoreModule(); void initPartitionCoreModule();
void continueLoading(); void continueLoading();
@ -97,6 +84,8 @@ private:
WaitingWidget* m_waitingWidget; WaitingWidget* m_waitingWidget;
QFutureWatcher< void >* m_future; QFutureWatcher< void >* m_future;
QString m_bootloader;
}; };
CALAMARES_PLUGIN_FACTORY_DECLARATION( PartitionViewStepFactory ) CALAMARES_PLUGIN_FACTORY_DECLARATION( PartitionViewStepFactory )

View file

@ -33,19 +33,19 @@ static const int NUM_NEW_PARTITION_COLORS = 4;
//Let's try to use the Breeze palette //Let's try to use the Breeze palette
static const QColor PARTITION_COLORS[ NUM_PARTITION_COLORS ] = { static const QColor PARTITION_COLORS[ NUM_PARTITION_COLORS ] = {
"#2980b9", //Dark Plasma Blue "#2980b9", //Dark Plasma Blue
"#27ae60", //Dark Icon Green "#7f3fbf", //Dark Purple
"#c9ce3b", //Dirty Yellow "#ff5454", //Orange
"#3daee9", //Plasma Blue "#3daee9", //Plasma Blue
"#9b59b6", //Purple "#9b59b6", //Purple
}; };
static const QColor NEW_PARTITION_COLORS[ NUM_NEW_PARTITION_COLORS ] = { static const QColor NEW_PARTITION_COLORS[ NUM_NEW_PARTITION_COLORS ] = {
"#c0392b", //Dark Icon Red "#c0392b", //Dark Icon Red
"#f39c1f", //Dark Icon Yellow "#3b3b81", //Dark Blue
"#f1b7bc", //Light Salmon "#615c5d", //Light Salmon
"#fed999", //Light Orange "#ff8585", //Light Orange
}; };
static QColor FREE_SPACE_COLOR = "#777777"; static QColor FREE_SPACE_COLOR = "#6969ea";
static QColor EXTENDED_COLOR = "#aaaaaa"; static QColor EXTENDED_COLOR = "#6e5151";
static QColor UNKNOWN_DISKLABEL_COLOR = "#4d4151"; static QColor UNKNOWN_DISKLABEL_COLOR = "#4d4151";
static QMap< QString, QColor > s_partitionColorsCache; static QMap< QString, QColor > s_partitionColorsCache;
@ -98,7 +98,7 @@ colorForPartition( Partition* partition )
if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone
&& !partition->fileSystem().uuid().isEmpty() ) && !partition->fileSystem().uuid().isEmpty() )
{ {
if ( partition->fileSystem().type() == FileSystem::Luks || partition->fileSystem().type() == FileSystem::Luks2 ) if ( partition->fileSystem().type() == FileSystem::Luks )
{ {
FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() ); FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() );
if ( !luksFs.outerUuid().isEmpty() && s_partitionColorsCache.contains( luksFs.outerUuid() ) ) if ( !luksFs.outerUuid().isEmpty() && s_partitionColorsCache.contains( luksFs.outerUuid() ) )
@ -146,7 +146,7 @@ colorForPartition( Partition* partition )
if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone
&& !partition->fileSystem().uuid().isEmpty() ) && !partition->fileSystem().uuid().isEmpty() )
{ {
if ( partition->fileSystem().type() == FileSystem::Luks || partition->fileSystem().type() == FileSystem::Luks2 ) if ( partition->fileSystem().type() == FileSystem::Luks )
{ {
FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() ); FS::luks& luksFs = dynamic_cast< FS::luks& >( partition->fileSystem() );
if ( !luksFs.outerUuid().isEmpty() ) if ( !luksFs.outerUuid().isEmpty() )

View file

@ -149,19 +149,6 @@ execute( Operation&& operation, const QString& failureMessage )
return execute( operation, failureMessage ); return execute( operation, failureMessage );
} }
/** @brief Is this an MSDOS partition table?
*
* Deals with KPMcore deprecations in the TableType enum.
*/
inline bool isMSDOSPartition(PartitionTable::TableType t)
{
#if WITH_KPMcore > 0x240801
return t == PartitionTable::TableType::msdos;
#else
return t == PartitionTable::TableType::msdos || t == PartitionTable::TableType::msdos_sectorbased;
#endif
}
} // namespace KPMHelpers } // namespace KPMHelpers
#endif /* KPMHELPERS_H */ #endif /* KPMHELPERS_H */

View file

@ -390,7 +390,7 @@ runOsprober( DeviceModel* dm )
} }
QString file, path = lineColumns.value( 0 ).simplified(); QString file, path = lineColumns.value( 0 ).simplified();
if ( !path.startsWith( "/dev/" ) ) //basic sanity check if ( !path.startsWith( "/dev/" ) ) // basic sanity check
{ {
continue; continue;
} }
@ -512,7 +512,6 @@ isEfiFilesystemMinimumSize( const Partition* candidate )
return false; return false;
} }
} }
bool bool
isEfiBootable( const Partition* candidate ) isEfiBootable( const Partition* candidate )
{ {
@ -563,20 +562,24 @@ efiFilesystemMinimumSize()
{ {
const QString key = efiFilesystemMinimumSizeGSKey(); const QString key = efiFilesystemMinimumSizeGSKey();
qint64 uefisys_part_sizeB = efiFilesystemRecommendedSize(); qint64 uefisys_part_sizeB = 0;
// The default can be overridden; the key used here comes // The default can be overridden; the key used here comes
// from the partition module Config.cpp // from the partition module Config.cpp
auto* gs = Calamares::JobQueue::instance()->globalStorage(); auto* gs = Calamares::JobQueue::instance()->globalStorage();
if ( gs->contains( key ) ) if ( gs->contains( key ) )
{ {
qint64 v = gs->value( key ).toLongLong(); // Ignore the minimum size when grub is the bootloader
uefisys_part_sizeB = v > 0 ? v : 0; if ( !gs->contains( "curBootloader" ) || gs->value( "curBootloader" ).toString().toLower() != "grub" )
{
qint64 v = gs->value( key ).toLongLong();
uefisys_part_sizeB = v > 0 ? v : 0;
}
} }
// There is a lower limit of what can be configured // There is a lower limit of what can be configured
return std::max( uefisys_part_sizeB, efiSpecificationHardMinimumSize ); return std::max( uefisys_part_sizeB, efiSpecificationHardMinimumSize );
} }
QString QString
canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType )
{ {

View file

@ -108,7 +108,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos;
} }
// last usable sector possibly allowing for secondary GPT using 66 sectors (256 entries) // last usable sector possibly allowing for secondary GPT using 66 sectors (256 entries)
const qint64 lastUsableSector = dev->totalLogical() - ( partType == PartitionTable::gpt ? 67 : 1 ); qint64 lastSectorForRoot = dev->totalLogical() - (partType == PartitionTable::gpt ? 67 : 1);
// Looking up the defaultFsType (which should name a filesystem 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. // will log an error and set the type to Unknown if there's something wrong.
@ -154,7 +154,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
const quint64 sectorSize = quint64( dev->logicalSize() ); const quint64 sectorSize = quint64( dev->logicalSize() );
if ( mayCreateSwap ) if ( mayCreateSwap )
{ {
quint64 availableSpaceB = quint64( lastUsableSector - firstFreeSector + 1 ) * sectorSize; quint64 availableSpaceB = quint64( dev->totalLogical() - firstFreeSector ) * sectorSize;
suggestedSwapSizeB = swapSuggestion( availableSpaceB, o.swap ); suggestedSwapSizeB = swapSuggestion( availableSpaceB, o.swap );
// Space required by this installation is what the distro claims is needed // Space required by this installation is what the distro claims is needed
// (via global configuration) plus the swap size plus a fudge factor of // (via global configuration) plus the swap size plus a fudge factor of
@ -165,7 +165,6 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
shouldCreateSwap = availableSpaceB > requiredSpaceB; shouldCreateSwap = availableSpaceB > requiredSpaceB;
} }
qint64 lastSectorForRoot = lastUsableSector;
if ( shouldCreateSwap ) if ( shouldCreateSwap )
{ {
lastSectorForRoot -= suggestedSwapSizeB / sectorSize + 1; lastSectorForRoot -= suggestedSwapSizeB / sectorSize + 1;
@ -184,7 +183,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
FileSystem::LinuxSwap, FileSystem::LinuxSwap,
QStringLiteral( "swap" ), QStringLiteral( "swap" ),
lastSectorForRoot + 1, lastSectorForRoot + 1,
lastUsableSector, dev->totalLogical() - 1,
KPM_PARTITION_FLAG( None ) ); KPM_PARTITION_FLAG( None ) );
} }
else else
@ -195,7 +194,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
FileSystem::LinuxSwap, FileSystem::LinuxSwap,
QStringLiteral( "swap" ), QStringLiteral( "swap" ),
lastSectorForRoot + 1, lastSectorForRoot + 1,
lastUsableSector, dev->totalLogical() - 1,
o.luksFsType, o.luksFsType,
o.luksPassphrase, o.luksPassphrase,
KPM_PARTITION_FLAG( None ) ); KPM_PARTITION_FLAG( None ) );
@ -214,6 +213,8 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
void void
doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, Choices::ReplacePartitionOptions o ) doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, Choices::ReplacePartitionOptions o )
{ {
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
qint64 firstSector, lastSector; qint64 firstSector, lastSector;
cDebug() << "doReplacePartition for device" << partition->partitionPath(); cDebug() << "doReplacePartition for device" << partition->partitionPath();
@ -252,7 +253,36 @@ doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition
core->deletePartition( dev, partition ); core->deletePartition( dev, partition );
} }
core->layoutApply( dev, firstSector, lastSector, o.luksFsType, o.luksPassphrase ); qint64 newFirstSector = firstSector;
if ( o.newEfiPartition && PartUtils::isEfiSystem() )
{
qint64 uefisys_part_sizeB = PartUtils::efiFilesystemRecommendedSize();
qint64 efiSectorCount = Calamares::bytesToSectors( uefisys_part_sizeB, dev->logicalSize() );
Q_ASSERT( efiSectorCount > 0 );
// Since sectors count from 0, and this partition is created starting
// at firstFreeSector, we need efiSectorCount sectors, numbered
// firstFreeSector..firstFreeSector+efiSectorCount-1.
qint64 lastSector = newFirstSector + efiSectorCount - 1;
Partition* efiPartition = KPMHelpers::createNewPartition( dev->partitionTable(),
*dev,
PartitionRole( PartitionRole::Primary ),
FileSystem::Fat32,
QString(),
newFirstSector,
lastSector,
KPM_PARTITION_FLAG( None ) );
PartitionInfo::setFormat( efiPartition, true );
PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ).toString() );
if ( gs->contains( "efiSystemPartitionName" ) )
{
efiPartition->setLabel( gs->value( "efiSystemPartitionName" ).toString() );
}
core->createPartition( dev, efiPartition, KPM_PARTITION_FLAG_ESP );
newFirstSector = lastSector + 1;
}
core->layoutApply( dev, newFirstSector, lastSector, o.luksFsType, o.luksPassphrase );
core->dumpQueue(); core->dumpQueue();
} }

View file

@ -27,21 +27,26 @@ namespace PartitionActions
*/ */
namespace Choices namespace Choices
{ {
struct ReplacePartitionOptions struct ReplacePartitionOptions
{ {
QString defaultPartitionTableType; // e.g. "gpt" or "msdos" QString defaultPartitionTableType; // e.g. "gpt" or "msdos"
QString defaultFsType; // e.g. "ext4" or "btrfs" QString defaultFsType; // e.g. "ext4" or "btrfs"
Config::LuksGeneration luksFsType = Config::LuksGeneration::Luks1; // optional ("luks", "luks2") Config::LuksGeneration luksFsType = Config::LuksGeneration::Luks1; // optional ("luks", "luks2")
QString luksPassphrase; // optional QString luksPassphrase; // optional
bool newEfiPartition;
ReplacePartitionOptions( const QString& pt, ReplacePartitionOptions( const QString& pt,
const QString& fs, const QString& fs,
Config::LuksGeneration luksFs, Config::LuksGeneration luksFs,
const QString& passphrase ) const QString& passphrase,
const bool& newEsp
)
: defaultPartitionTableType( pt ) : defaultPartitionTableType( pt )
, defaultFsType( fs ) , defaultFsType( fs )
, luksFsType( luksFs ) , luksFsType( luksFs )
, luksPassphrase( passphrase ) , luksPassphrase( passphrase )
, newEfiPartition( newEsp )
{ {
} }
}; };
@ -59,7 +64,7 @@ struct AutoPartitionOptions : ReplacePartitionOptions
const QString& efi, const QString& efi,
qint64 requiredBytes, qint64 requiredBytes,
Config::SwapChoice s ) Config::SwapChoice s )
: ReplacePartitionOptions( pt, fs, luksFs, passphrase ) : ReplacePartitionOptions( pt, fs, luksFs, passphrase, false )
, efiPartitionMountPoint( efi ) , efiPartitionMountPoint( efi )
, requiredSpaceB( requiredBytes > 0 ? quint64( requiredBytes ) : 0U ) , requiredSpaceB( requiredBytes > 0 ? quint64( requiredBytes ) : 0U )
, swap( s ) , swap( s )

View file

@ -619,7 +619,7 @@ findEssentialLVs( const QList< PartitionCoreModule::DeviceInfo* >& infos )
continue; continue;
} }
for ( const auto& j : std::as_const( info->jobs() ) ) for ( const auto& j : qAsConst( info->jobs() ) )
{ {
FormatPartitionJob* format = dynamic_cast< FormatPartitionJob* >( j.data() ); FormatPartitionJob* format = dynamic_cast< FormatPartitionJob* >( j.data() );
if ( format ) if ( format )
@ -1221,3 +1221,12 @@ PartitionCoreModule::createSummaryInfo() const
} }
return lst; return lst;
} }
void
PartitionCoreModule::removeEspMounts()
{
for ( auto const partition : qAsConst( m_efiSystemPartitions ) )
{
PartitionInfo::setMountPoint( partition, QString() );
}
}

View file

@ -16,7 +16,6 @@
#include "core/KPMHelpers.h" #include "core/KPMHelpers.h"
#include "core/PartitionLayout.h" #include "core/PartitionLayout.h"
#include "core/PartitionModel.h" #include "core/PartitionModel.h"
#include "core/DirFSRestrictLayout.h"
#include "jobs/PartitionJob.h" #include "jobs/PartitionJob.h"
#include "Job.h" #include "Job.h"
@ -120,6 +119,8 @@ public:
//FIXME: make this horrible method private. -- Teo 12/2015 //FIXME: make this horrible method private. -- Teo 12/2015
Device* immutableDeviceCopy( const Device* device ); Device* immutableDeviceCopy( const Device* device );
void removeEspMounts();
/** /**
* @brief bootLoaderModel returns a model which represents the available boot * @brief bootLoaderModel returns a model which represents the available boot
* loader locations. * loader locations.
@ -168,9 +169,6 @@ public:
*/ */
PartitionLayout& partitionLayout() { return m_partLayout; } PartitionLayout& partitionLayout() { return m_partLayout; }
/// @brief Get the directory filesystem restriction layout.
DirFSRestrictLayout& dirFSRestrictLayout() { return m_dirFSRestrictLayout; }
void layoutApply( Device* dev, void layoutApply( Device* dev,
qint64 firstSector, qint64 firstSector,
qint64 lastSector, qint64 lastSector,
@ -274,7 +272,6 @@ private:
bool m_isDirty = false; bool m_isDirty = false;
QString m_bootLoaderInstallPath; QString m_bootLoaderInstallPath;
PartitionLayout m_partLayout; PartitionLayout m_partLayout;
DirFSRestrictLayout m_dirFSRestrictLayout;
OsproberEntryList m_osproberLines; OsproberEntryList m_osproberLines;

View file

@ -221,7 +221,7 @@ PartitionLayout::createPartitions( Device* dev,
// Let's check if we have enough space for each partitions, using the size // Let's check if we have enough space for each partitions, using the size
// propery or the min-size property if unit is in percentage. // propery or the min-size property if unit is in percentage.
for ( const auto& entry : std::as_const( m_partLayout ) ) for ( const auto& entry : qAsConst( m_partLayout ) )
{ {
if ( !entry.partSize.isValid() ) if ( !entry.partSize.isValid() )
{ {
@ -250,7 +250,7 @@ PartitionLayout::createPartitions( Device* dev,
if ( availableSectors < 0 ) if ( availableSectors < 0 )
{ {
availableSectors = totalSectors; availableSectors = totalSectors;
for ( const auto& entry : std::as_const( m_partLayout ) ) for ( const auto& entry : qAsConst( m_partLayout ) )
{ {
qint64 sectors = partSectorsMap.value( &entry ); qint64 sectors = partSectorsMap.value( &entry );
if ( entry.partMinSize.isValid() ) if ( entry.partMinSize.isValid() )
@ -263,7 +263,7 @@ PartitionLayout::createPartitions( Device* dev,
} }
// Assign sectors for percentage-defined partitions. // Assign sectors for percentage-defined partitions.
for ( const auto& entry : std::as_const( m_partLayout ) ) for ( const auto& entry : qAsConst( m_partLayout ) )
{ {
if ( entry.partSize.unit() == Calamares::Partition::SizeUnit::Percent ) if ( entry.partSize.unit() == Calamares::Partition::SizeUnit::Percent )
{ {
@ -286,7 +286,7 @@ PartitionLayout::createPartitions( Device* dev,
// Create the partitions. // Create the partitions.
currentSector = firstSector; currentSector = firstSector;
availableSectors = totalSectors; availableSectors = totalSectors;
for ( const auto& entry : std::as_const( m_partLayout ) ) for ( const auto& entry : qAsConst( m_partLayout ) )
{ {
// Adjust partition size based on available space. // Adjust partition size based on available space.
qint64 sectors = partSectorsMap.value( &entry ); qint64 sectors = partSectorsMap.value( &entry );

View file

@ -34,7 +34,6 @@
#include "Branding.h" #include "Branding.h"
#include "GlobalStorage.h" #include "GlobalStorage.h"
#include "JobQueue.h" #include "JobQueue.h"
#include "compat/CheckBox.h"
#include "partition/PartitionIterator.h" #include "partition/PartitionIterator.h"
#include "partition/PartitionQuery.h" #include "partition/PartitionQuery.h"
#include "utils/Gui.h" #include "utils/Gui.h"
@ -188,7 +187,7 @@ ChoicePage::init( PartitionCoreModule* core )
connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice ); connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice );
connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged ); connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged );
connect( m_reuseHomeCheckBox, Calamares::checkBoxStateChangedSignal, this, &ChoicePage::onHomeCheckBoxStateChanged ); connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged );
ChoicePage::applyDeviceChoice(); ChoicePage::applyDeviceChoice();
} }
@ -353,6 +352,12 @@ ChoicePage::setupChoices()
updateChoiceButtonsTr(); updateChoiceButtonsTr();
} }
bool
ChoicePage::isNewEfiSelected() const
{
return m_efiComboBox && m_efiNewIndex != -1 && m_efiComboBox->currentIndex() == m_efiNewIndex;
}
/** /**
* @brief ChoicePage::selectedDevice queries the device picker (which may be a combo or * @brief ChoicePage::selectedDevice queries the device picker (which may be a combo or
* a list view) to get a pointer to the currently selected Device. * a list view) to get a pointer to the currently selected Device.
@ -362,8 +367,7 @@ ChoicePage::setupChoices()
Device* Device*
ChoicePage::selectedDevice() ChoicePage::selectedDevice()
{ {
Device* const currentDevice Device* const currentDevice = m_core->deviceModel()->deviceForIndex( m_core->deviceModel()->index( m_drivesCombo->currentIndex() ) );
= m_core->deviceModel()->deviceForIndex( m_core->deviceModel()->index( m_drivesCombo->currentIndex() ) );
return currentDevice; return currentDevice;
} }
@ -586,21 +590,8 @@ ChoicePage::applyActionChoice( InstallChoice choice )
&ChoicePage::doAlongsideSetupSplitter, &ChoicePage::doAlongsideSetupSplitter,
Qt::UniqueConnection ); Qt::UniqueConnection );
break; break;
case InstallChoice::Manual:
if ( m_core->isDirty() )
{
ScanningDialog::run(
QtConcurrent::run(
[ = ]
{
QMutexLocker locker( &m_coreMutex );
m_core->revertDevice( selectedDevice() );
} ),
[] {},
this );
}
break;
case InstallChoice::NoChoice: case InstallChoice::NoChoice:
case InstallChoice::Manual:
break; break;
} }
updateNextEnabled(); updateNextEnabled();
@ -686,6 +677,17 @@ ChoicePage::onHomeCheckBoxStateChanged()
} }
} }
int
ChoicePage::efiIndex()
{
if ( !m_efiComboBox )
{
return 0;
}
return m_efiComboBox->currentIndex();
}
void void
ChoicePage::onLeave() ChoicePage::onLeave()
{ {
@ -703,22 +705,29 @@ ChoicePage::onLeave()
|| m_config->installChoice() == InstallChoice::Replace ) ) || m_config->installChoice() == InstallChoice::Replace ) )
{ {
QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions();
if ( efiSystemPartitions.count() == 1 ) if ( !isNewEfiSelected() )
{ {
PartitionInfo::setMountPoint( Partition* part = nullptr;
efiSystemPartitions.first(), for ( auto const partition : qAsConst( efiSystemPartitions ) )
Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString() ); {
} if ( partition->partitionPath() == m_efiComboBox->currentText() )
else if ( efiSystemPartitions.count() > 1 && m_efiComboBox ) {
{ part = partition;
PartitionInfo::setMountPoint( break;
efiSystemPartitions.at( m_efiComboBox->currentIndex() ), }
Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString() ); }
}
else if ( part != nullptr )
{ {
cError() << "cannot set up EFI system partition.\nESP count:" << efiSystemPartitions.count() m_core->removeEspMounts();
<< "\nm_efiComboBox:" << m_efiComboBox; PartitionInfo::setMountPoint(
part, Calamares::JobQueue::instance()->globalStorage()->value( "efiSystemPartition" ).toString() );
}
else
{
// This should never happen
cError() << "No valid efi partition found matching the selected partition" << Qt::endl;
}
} }
} }
else // installPath is then passed to the bootloader module for MBR setup else // installPath is then passed to the bootloader module for MBR setup
@ -756,6 +765,8 @@ ChoicePage::doAlongsideApply()
Q_ASSERT( m_afterPartitionSplitterWidget->splitPartitionSize() >= 0 ); Q_ASSERT( m_afterPartitionSplitterWidget->splitPartitionSize() >= 0 );
Q_ASSERT( m_afterPartitionSplitterWidget->newPartitionSize() >= 0 ); Q_ASSERT( m_afterPartitionSplitterWidget->newPartitionSize() >= 0 );
auto gs = Calamares::JobQueue::instance()->globalStorage();
QMutexLocker locker( &m_coreMutex ); QMutexLocker locker( &m_coreMutex );
QString path = m_beforePartitionBarsView->selectionModel() QString path = m_beforePartitionBarsView->selectionModel()
@ -776,8 +787,40 @@ ChoicePage::doAlongsideApply()
= firstSector + m_afterPartitionSplitterWidget->splitPartitionSize() / dev->logicalSize(); = firstSector + m_afterPartitionSplitterWidget->splitPartitionSize() / dev->logicalSize();
m_core->resizePartition( dev, candidate, firstSector, newLastSector ); m_core->resizePartition( dev, candidate, firstSector, newLastSector );
qint64 firstFreeSector = newLastSector + 2;
// Add an EFI partition if required
if ( PartUtils::isEfiSystem() && isNewEfiSelected() )
{
qint64 uefisys_part_sizeB = PartUtils::efiFilesystemRecommendedSize();
qint64 efiSectorCount = Calamares::bytesToSectors( uefisys_part_sizeB, dev->logicalSize() );
Q_ASSERT( efiSectorCount > 0 );
// Since sectors count from 0, and this partition is created starting
// at firstFreeSector, we need efiSectorCount sectors, numbered
// firstFreeSector..firstFreeSector+efiSectorCount-1.
qint64 lastSector = firstFreeSector + efiSectorCount - 1;
Partition* efiPartition = KPMHelpers::createNewPartition( dev->partitionTable(),
*dev,
PartitionRole( PartitionRole::Primary ),
FileSystem::Fat32,
QString(),
firstFreeSector,
lastSector,
KPM_PARTITION_FLAG( None ) );
PartitionInfo::setFormat( efiPartition, true );
m_core->removeEspMounts();
PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ).toString() );
if ( gs->contains( "efiSystemPartitionName" ) )
{
efiPartition->setLabel( gs->value( "efiSystemPartitionName" ).toString() );
}
m_core->createPartition( dev, efiPartition, KPM_PARTITION_FLAG_ESP );
firstFreeSector = lastSector + 1;
}
m_core->layoutApply( dev, m_core->layoutApply( dev,
newLastSector + 2, firstFreeSector,
oldLastSector, oldLastSector,
m_config->luksFileSystemType(), m_config->luksFileSystemType(),
m_encryptWidget->passphrase(), m_encryptWidget->passphrase(),
@ -827,6 +870,13 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
m_core->revertDevice( selectedDevice() ); m_core->revertDevice( selectedDevice() );
} }
if ( m_isEfi && m_efiComboBox->count() == 0 )
{
m_inOnReplace = true;
setupEfiSystemPartitionSelector();
m_inOnReplace = false;
}
// if the partition is unallocated(free space), we don't replace it but create new one // if the partition is unallocated(free space), we don't replace it but create new one
// with the same first and last sector // with the same first and last sector
Partition* selectedPartition Partition* selectedPartition
@ -836,6 +886,9 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
//NOTE: if the selected partition is free space, we don't deal with //NOTE: if the selected partition is free space, we don't deal with
// a separate /home partition at all because there's no existing // a separate /home partition at all because there's no existing
// rootfs to read it from. // rootfs to read it from.
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
PartitionRole newRoles = PartitionRole( PartitionRole::Primary ); PartitionRole newRoles = PartitionRole( PartitionRole::Primary );
PartitionNode* newParent = selectedDevice()->partitionTable(); PartitionNode* newParent = selectedDevice()->partitionTable();
@ -849,8 +902,38 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
} }
} }
m_core->layoutApply( selectedDevice(), auto dev = selectedDevice();
selectedPartition->firstSector(), qint64 newFirstSector = selectedPartition->firstSector();
if ( isNewEfiSelected() && PartUtils::isEfiSystem() )
{
qint64 uefisys_part_sizeB = PartUtils::efiFilesystemRecommendedSize();
qint64 efiSectorCount = Calamares::bytesToSectors( uefisys_part_sizeB, dev->logicalSize() );
Q_ASSERT( efiSectorCount > 0 );
// Since sectors count from 0, and this partition is created starting
// at firstFreeSector, we need efiSectorCount sectors, numbered
// firstFreeSector..firstFreeSector+efiSectorCount-1.
qint64 lastSector = newFirstSector + efiSectorCount - 1;
Partition* efiPartition
= KPMHelpers::createNewPartition( dev->partitionTable(),
*dev,
PartitionRole( PartitionRole::Primary ),
FileSystem::Fat32,
QString(),
newFirstSector,
lastSector,
KPM_PARTITION_FLAG( None ) );
PartitionInfo::setFormat( efiPartition, true );
PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ).toString() );
if ( gs->contains( "efiSystemPartitionName" ) )
{
efiPartition->setLabel( gs->value( "efiSystemPartitionName" ).toString() );
}
m_core->createPartition( dev, efiPartition, KPM_PARTITION_FLAG_ESP );
newFirstSector = lastSector + 1;
}
m_core->layoutApply( dev,
newFirstSector,
selectedPartition->lastSector(), selectedPartition->lastSector(),
m_config->luksFileSystemType(), m_config->luksFileSystemType(),
m_encryptWidget->passphrase(), m_encryptWidget->passphrase(),
@ -888,7 +971,8 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
{ gs->value( "defaultPartitionType" ).toString(), { gs->value( "defaultPartitionType" ).toString(),
m_config->replaceModeFilesystem(), m_config->replaceModeFilesystem(),
m_config->luksFileSystemType(), m_config->luksFileSystemType(),
m_encryptWidget->passphrase() } ); m_encryptWidget->passphrase(),
isNewEfiSelected() } );
Partition* homePartition = findPartitionByPath( { selectedDevice() }, *homePartitionPath ); Partition* homePartition = findPartitionByPath( { selectedDevice() }, *homePartitionPath );
if ( homePartition && doReuseHomePartition ) if ( homePartition && doReuseHomePartition )
@ -919,7 +1003,6 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
{ {
setupEfiSystemPartitionSelector(); setupEfiSystemPartitionSelector();
} }
updateNextEnabled(); updateNextEnabled();
if ( !m_bootloaderComboBox.isNull() && m_bootloaderComboBox->currentIndex() < 0 ) if ( !m_bootloaderComboBox.isNull() && m_bootloaderComboBox->currentIndex() < 0 )
{ {
@ -1046,10 +1129,9 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
if ( m_enableEncryptionWidget ) if ( m_enableEncryptionWidget )
{ {
m_encryptWidget->show(); m_encryptWidget->show();
if ( m_config->preCheckEncryption() && !m_preCheckActivated ) if ( m_config->preCheckEncryption() )
{ {
m_encryptWidget->setEncryptionCheckbox( true ); m_encryptWidget->setEncryptionCheckbox( true );
m_preCheckActivated = true;
} }
} }
m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); m_previewBeforeLabel->setText( tr( "Current:", "@label" ) );
@ -1106,10 +1188,9 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
if ( shouldShowEncryptWidget( choice ) ) if ( shouldShowEncryptWidget( choice ) )
{ {
m_encryptWidget->show(); m_encryptWidget->show();
if ( m_config->preCheckEncryption() && !m_preCheckActivated ) if ( m_config->preCheckEncryption() )
{ {
m_encryptWidget->setEncryptionCheckbox( true ); m_encryptWidget->setEncryptionCheckbox( true );
m_preCheckActivated = true;
} }
} }
m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); m_previewBeforeLabel->setText( tr( "Current:", "@label" ) );
@ -1183,6 +1264,7 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
efiLayout->addWidget( m_efiComboBox ); efiLayout->addWidget( m_efiComboBox );
m_efiLabel->setBuddy( m_efiComboBox ); m_efiLabel->setBuddy( m_efiComboBox );
m_efiComboBox->hide(); m_efiComboBox->hide();
connect( m_efiComboBox, &QComboBox::currentTextChanged, this, &ChoicePage::onEficomboTextChanged );
efiLayout->addStretch(); efiLayout->addStretch();
} }
@ -1211,41 +1293,58 @@ ChoicePage::setupEfiSystemPartitionSelector()
{ {
Q_ASSERT( m_isEfi ); Q_ASSERT( m_isEfi );
// Ensure the EFI selector is not already configured
if ( m_efiComboBox->count() > 0 )
{
return;
}
auto gs = Calamares::JobQueue::instance()->globalStorage();
m_efiNewIndex = -1;
// Only the already existing ones: // Only the already existing ones:
QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions(); QList< Partition* > efiSystemPartitions = m_core->efiSystemPartitions();
if ( efiSystemPartitions.count() == 0 ) //should never happen m_efiLabel->setText( tr( "EFI system partition:", "@label" ) );
for ( int i = 0; i < efiSystemPartitions.count(); ++i )
{ {
m_efiLabel->setText( tr( "An EFI system partition cannot be found anywhere " Partition* efiPartition = efiSystemPartitions.at( i );
"on this system. Please go back and use manual " if ( gs->contains( "curBootloader" )
"partitioning to set up %1.", && gs->value( "curBootloader" ).toString().trimmed() == QStringLiteral( "systemd-boot" ) )
"@info, %1 is product name" )
.arg( Calamares::Branding::instance()->shortProductName() ) );
updateNextEnabled();
}
else if ( efiSystemPartitions.count() == 1 ) //probably most usual situation
{
m_efiLabel->setText( tr( "The EFI system partition at %1 will be used for "
"starting %2.",
"@info, %1 is partition path, %2 is product name" )
.arg( efiSystemPartitions.first()->partitionPath() )
.arg( Calamares::Branding::instance()->shortProductName() ) );
}
else
{
m_efiComboBox->show();
m_efiLabel->setText( tr( "EFI system partition:", "@label" ) );
for ( int i = 0; i < efiSystemPartitions.count(); ++i )
{ {
Partition* efiPartition = efiSystemPartitions.at( i ); if ( efiPartition->capacity() < PartUtils::efiFilesystemMinimumSize() )
m_efiComboBox->addItem( efiPartition->partitionPath(), i );
// We pick an ESP on the currently selected device, if possible
if ( efiPartition->devicePath() == selectedDevice()->deviceNode() && efiPartition->number() == 1 )
{ {
m_efiComboBox->setCurrentIndex( i ); continue;
} }
} }
m_efiComboBox->addItem( efiPartition->partitionPath() );
// We pick an ESP on the currently selected device, if possible
if ( efiPartition->devicePath() == selectedDevice()->deviceNode() && m_efiComboBox->currentIndex() < 0 )
{
m_efiComboBox->setCurrentIndex( m_efiComboBox->findText( efiPartition->partitionPath() ) );
}
}
m_efiComboBox->addItem( tr( "New" ) );
m_efiNewIndex = m_efiComboBox->count() - 1;
m_efiComboBox->show();
// Ensure the combobox has something selected
if ( m_efiComboBox->currentIndex() < 0 )
{
m_efiComboBox->setCurrentIndex( 0 );
}
}
void
ChoicePage::onEficomboTextChanged( const QString& text )
{
if ( m_config->installChoice() == InstallChoice::Replace && !m_inOnReplace )
{
doReplaceSelectedPartition( m_beforePartitionBarsView->selectionModel()->currentIndex() );
} }
} }
@ -1718,6 +1817,29 @@ ChoicePage::shouldShowEncryptWidget( Config::InstallChoice choice ) const
return suitableChoice && m_enableEncryptionWidget && suitableFS; return suitableChoice && m_enableEncryptionWidget && suitableFS;
} }
void
ChoicePage::reset()
{
m_grp->setExclusive( false );
if ( m_alongsideButton->isChecked() )
{
m_alongsideButton->setChecked( false );
}
if ( m_eraseButton->isChecked() )
{
m_eraseButton->setChecked( false );
}
if ( m_replaceButton->isChecked() )
{
m_replaceButton->setChecked( false );
}
if ( m_somethingElseButton->isChecked() )
{
m_somethingElseButton->setChecked( false );
}
m_grp->setExclusive( true );
}
void void
ChoicePage::updateActionDescriptionsTr() ChoicePage::updateActionDescriptionsTr()
{ {
@ -1803,8 +1925,7 @@ ChoicePage::updateActionDescriptionsTr()
"currently present on the selected storage device." ) ); "currently present on the selected storage device." ) );
m_replaceButton->setText( tr( "<strong>Replace a partition</strong><br/>" m_replaceButton->setText( tr( "<strong>Replace a partition</strong><br/>"
"Replaces a partition with %1." ) "Replaces a partition with %1." ) );
.arg( Calamares::Branding::instance()->shortVersionedName() ) );
} }
if ( m_osproberEntriesCount < 0 ) if ( m_osproberEntriesCount < 0 )
{ {

View file

@ -87,6 +87,8 @@ public:
int lastSelectedDeviceIndex(); int lastSelectedDeviceIndex();
void setLastSelectedDeviceIndex( int index ); void setLastSelectedDeviceIndex( int index );
int efiIndex();
void reset();
signals: signals:
void nextStatusChanged( bool ); void nextStatusChanged( bool );
@ -111,6 +113,7 @@ private:
bool calculateNextEnabled() const; bool calculateNextEnabled() const;
void updateNextEnabled(); void updateNextEnabled();
void setupChoices(); void setupChoices();
bool isNewEfiSelected() const;
void checkInstallChoiceRadioButton( Config::InstallChoice choice ); ///< Sets the chosen button to "on" void checkInstallChoiceRadioButton( Config::InstallChoice choice ); ///< Sets the chosen button to "on"
/** @brief Create a panel with "boot loader location:" /** @brief Create a panel with "boot loader location:"
* *
@ -133,6 +136,8 @@ private:
void doAlongsideApply(); void doAlongsideApply();
void setupEfiSystemPartitionSelector(); void setupEfiSystemPartitionSelector();
void onEficomboTextChanged(const QString &text);
// Translations support // Translations support
void updateSwapChoicesTr(); void updateSwapChoicesTr();
void updateChoiceButtonsTr(); void updateChoiceButtonsTr();
@ -173,9 +178,14 @@ private:
QString m_osproberOneEntryName; QString m_osproberOneEntryName;
bool m_enableEncryptionWidget = false; bool m_enableEncryptionWidget = false;
bool m_preCheckActivated = false;
QMutex m_coreMutex; QMutex m_coreMutex;
int m_efiNewIndex = -1;
QString m_bootLoader;
bool m_inOnReplace = false;
}; };
#endif // CHOICEPAGE_H #endif // CHOICEPAGE_H

View file

@ -18,7 +18,6 @@
#include "core/KPMHelpers.h" #include "core/KPMHelpers.h"
#include "core/PartUtils.h" #include "core/PartUtils.h"
#include "core/PartitionInfo.h" #include "core/PartitionInfo.h"
#include "core/PartitionCoreModule.h"
#include "gui/PartitionDialogHelpers.h" #include "gui/PartitionDialogHelpers.h"
#include "gui/PartitionSizeController.h" #include "gui/PartitionSizeController.h"
@ -34,7 +33,6 @@
#include <kpmcore/fs/filesystem.h> #include <kpmcore/fs/filesystem.h>
#include <kpmcore/fs/filesystemfactory.h> #include <kpmcore/fs/filesystemfactory.h>
#include <kpmcore/fs/luks.h> #include <kpmcore/fs/luks.h>
#include <kpmcore/fs/luks2.h>
#include <QComboBox> #include <QComboBox>
#include <QDir> #include <QDir>
@ -47,14 +45,18 @@
using Calamares::Partition::untranslatedFS; using Calamares::Partition::untranslatedFS;
using Calamares::Partition::userVisibleFS; using Calamares::Partition::userVisibleFS;
CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted,
Device* device, FileSystem::LinuxSwap,
FileSystem::Extended,
FileSystem::Unknown,
FileSystem::Lvm2_PV } );
CreatePartitionDialog::CreatePartitionDialog( Device* device,
PartitionNode* parentPartition, PartitionNode* parentPartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget ) QWidget* parentWidget )
: QDialog( parentWidget ) : QDialog( parentWidget )
, m_ui( new Ui_CreatePartitionDialog ) , m_ui( new Ui_CreatePartitionDialog )
, m_core( core )
, m_partitionSizeController( new PartitionSizeController( this ) ) , m_partitionSizeController( new PartitionSizeController( this ) )
, m_device( device ) , m_device( device )
, m_parent( parentPartition ) , m_parent( parentPartition )
@ -79,7 +81,8 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core,
m_ui->lvNameLineEdit->setValidator( validator ); m_ui->lvNameLineEdit->setValidator( validator );
} }
if ( KPMHelpers::isMSDOSPartition( device->partitionTable()->type() ) ) if ( device->partitionTable()->type() == PartitionTable::msdos
|| device->partitionTable()->type() == PartitionTable::msdos_sectorbased )
{ {
initMbrPartitionTypeUi(); initMbrPartitionTypeUi();
} }
@ -125,23 +128,17 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core,
this, this,
&CreatePartitionDialog::checkMountPointSelection ); &CreatePartitionDialog::checkMountPointSelection );
connect( m_ui->fsComboBox,
&QComboBox::currentTextChanged,
this,
&CreatePartitionDialog::checkMountPointSelection );
// Select a default // Select a default
m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); m_ui->fsComboBox->setCurrentIndex( defaultFsIndex );
updateMountPointUi(); updateMountPointUi();
checkMountPointSelection(); checkMountPointSelection();
} }
CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, CreatePartitionDialog::CreatePartitionDialog( Device* device,
Device* device,
const FreeSpace& freeSpacePartition, const FreeSpace& freeSpacePartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget ) QWidget* parentWidget )
: CreatePartitionDialog( core, device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget ) : CreatePartitionDialog( device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget )
{ {
standardMountPoints( *( m_ui->mountPointComboBox ), QString() ); standardMountPoints( *( m_ui->mountPointComboBox ), QString() );
setFlagList( *( m_ui->m_listFlags ), setFlagList( *( m_ui->m_listFlags ),
@ -150,12 +147,11 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core,
initPartResizerWidget( freeSpacePartition.p ); initPartResizerWidget( freeSpacePartition.p );
} }
CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, CreatePartitionDialog::CreatePartitionDialog( Device* device,
Device* device,
const FreshPartition& existingNewPartition, const FreshPartition& existingNewPartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget ) QWidget* parentWidget )
: CreatePartitionDialog( core, device, existingNewPartition.p->parent(), usedMountPoints, parentWidget ) : CreatePartitionDialog( device, existingNewPartition.p->parent(), usedMountPoints, parentWidget )
{ {
standardMountPoints( *( m_ui->mountPointComboBox ), PartitionInfo::mountPoint( existingNewPartition.p ) ); standardMountPoints( *( m_ui->mountPointComboBox ), PartitionInfo::mountPoint( existingNewPartition.p ) );
setFlagList( *( m_ui->m_listFlags ), setFlagList( *( m_ui->m_listFlags ),
@ -324,12 +320,6 @@ CreatePartitionDialog::updateMountPointUi()
m_ui->encryptWidget->show(); m_ui->encryptWidget->show();
m_ui->encryptWidget->reset(); m_ui->encryptWidget->reset();
} }
else if ( FileSystemFactory::map()[ FileSystem::Type::Luks2 ]->supportCreate()
&& FS::luks2::canEncryptType( type ) && !m_role.has( PartitionRole::Extended ) )
{
m_ui->encryptWidget->show();
m_ui->encryptWidget->reset();
}
else else
{ {
m_ui->encryptWidget->reset(); m_ui->encryptWidget->reset();
@ -347,10 +337,8 @@ CreatePartitionDialog::updateMountPointUi()
void void
CreatePartitionDialog::checkMountPointSelection() CreatePartitionDialog::checkMountPointSelection()
{ {
validateMountPoint( m_core, validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ),
selectedMountPoint( m_ui->mountPointComboBox ),
m_usedMountPoints, m_usedMountPoints,
m_ui->fsComboBox->currentText(),
m_ui->mountPointExplanation, m_ui->mountPointExplanation,
m_ui->buttonBox->button( QDialogButtonBox::Ok ) ); m_ui->buttonBox->button( QDialogButtonBox::Ok ) );
} }

View file

@ -19,7 +19,7 @@
#include <QDialog> #include <QDialog>
#include <QScopedPointer> #include <QScopedPointer>
class PartitionCoreModule;
class Device; class Device;
class Partition; class Partition;
class PartitionNode; class PartitionNode;
@ -39,8 +39,7 @@ private:
* *
* This does all the shared UI setup. * This does all the shared UI setup.
*/ */
CreatePartitionDialog( PartitionCoreModule* core, CreatePartitionDialog( Device* device,
Device* device,
PartitionNode* parentPartition, PartitionNode* parentPartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget ); QWidget* parentWidget );
@ -60,8 +59,7 @@ public:
* Creating from free space makes a wholly new partition with * Creating from free space makes a wholly new partition with
* no flags set at all. * no flags set at all.
*/ */
CreatePartitionDialog( PartitionCoreModule* core, CreatePartitionDialog( Device* device,
Device* device,
const FreeSpace& freeSpacePartition, const FreeSpace& freeSpacePartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget = nullptr ); QWidget* parentWidget = nullptr );
@ -70,8 +68,7 @@ public:
* A partition previously newly created (e.g. via this dialog * A partition previously newly created (e.g. via this dialog
* and the constructor above) can be re-edited. * and the constructor above) can be re-edited.
*/ */
CreatePartitionDialog( PartitionCoreModule* core, CreatePartitionDialog( Device* device,
Device* device,
const FreshPartition& existingNewPartition, const FreshPartition& existingNewPartition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget = nullptr ); QWidget* parentWidget = nullptr );
@ -87,7 +84,6 @@ private Q_SLOTS:
private: private:
QScopedPointer< Ui_CreatePartitionDialog > m_ui; QScopedPointer< Ui_CreatePartitionDialog > m_ui;
PartitionCoreModule* m_core;
PartitionSizeController* m_partitionSizeController; PartitionSizeController* m_partitionSizeController;
Device* m_device; Device* m_device;
PartitionNode* m_parent; PartitionNode* m_parent;

View file

@ -73,15 +73,7 @@ DeviceInfoWidget::retranslateUi()
switch ( m_tableType ) switch ( m_tableType )
{ {
case PartitionTable::msdos: case PartitionTable::msdos:
#if WITH_KPMcore > 0x240801
// Pick your warning: either deprecation warning, or unchecked enum-switch
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
#endif
case PartitionTable::msdos_sectorbased: case PartitionTable::msdos_sectorbased:
#if WITH_KPMcore > 0x240801
QT_WARNING_POP
#endif
typeString = "MBR"; typeString = "MBR";
toolTipString += tr( "<br><br>This partition table type is only advisable on older " toolTipString += tr( "<br><br>This partition table type is only advisable on older "
"systems which start from a <strong>BIOS</strong> boot " "systems which start from a <strong>BIOS</strong> boot "

View file

@ -57,14 +57,12 @@ updateLabel( PartitionCoreModule* core, Device* device, Partition* partition, co
} }
} }
EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* core, EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device,
Device* device,
Partition* partition, Partition* partition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget ) QWidget* parentWidget )
: QDialog( parentWidget ) : QDialog( parentWidget )
, m_ui( new Ui_EditExistingPartitionDialog ) , m_ui( new Ui_EditExistingPartitionDialog )
, m_core( core )
, m_device( device ) , m_device( device )
, m_partition( partition ) , m_partition( partition )
, m_partitionSizeController( new PartitionSizeController( this ) ) , m_partitionSizeController( new PartitionSizeController( this ) )
@ -83,11 +81,6 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* c
this, this,
&EditExistingPartitionDialog::checkMountPointSelection ); &EditExistingPartitionDialog::checkMountPointSelection );
connect( m_ui->fileSystemComboBox,
&QComboBox::currentTextChanged,
this,
&EditExistingPartitionDialog::checkMountPointSelection );
// The filesystem label field is always enabled, because we may want to change // The filesystem label field is always enabled, because we may want to change
// the label on the current filesystem without formatting. // the label on the current filesystem without formatting.
m_ui->fileSystemLabelEdit->setText( PartitionInfo::label( m_partition ) ); m_ui->fileSystemLabelEdit->setText( PartitionInfo::label( m_partition ) );
@ -352,10 +345,8 @@ EditExistingPartitionDialog::updateMountPointPicker()
void void
EditExistingPartitionDialog::checkMountPointSelection() EditExistingPartitionDialog::checkMountPointSelection()
{ {
if ( validateMountPoint( m_core, if ( validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ),
selectedMountPoint( m_ui->mountPointComboBox ),
m_usedMountPoints, m_usedMountPoints,
m_ui->fileSystemComboBox->currentText(),
m_ui->mountPointExplanation, m_ui->mountPointExplanation,
m_ui->buttonBox->button( QDialogButtonBox::Ok ) ) ) m_ui->buttonBox->button( QDialogButtonBox::Ok ) ) )
{ {

View file

@ -37,8 +37,7 @@ public:
Partition* p; Partition* p;
}; };
EditExistingPartitionDialog( PartitionCoreModule* core, EditExistingPartitionDialog( Device* device,
Device* device,
Partition* partition, Partition* partition,
const QStringList& usedMountPoints, const QStringList& usedMountPoints,
QWidget* parentWidget = nullptr ); QWidget* parentWidget = nullptr );
@ -51,7 +50,6 @@ private slots:
private: private:
QScopedPointer< Ui_EditExistingPartitionDialog > m_ui; QScopedPointer< Ui_EditExistingPartitionDialog > m_ui;
PartitionCoreModule* m_core;
Device* m_device; Device* m_device;
Partition* m_partition; Partition* m_partition;
PartitionSizeController* m_partitionSizeController; PartitionSizeController* m_partitionSizeController;

View file

@ -60,8 +60,7 @@ EncryptWidget::EncryptWidget( QWidget* parent )
m_ui->m_encryptionUnsupportedLabel->show(); m_ui->m_encryptionUnsupportedLabel->show();
} }
connect( connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged );
m_ui->m_encryptCheckBox, Calamares::checkBoxStateChangedSignal, this, &EncryptWidget::onCheckBoxStateChanged );
connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited );
connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited );
@ -185,10 +184,13 @@ EncryptWidget::updateState( const bool notify )
Encryption newState = state(); Encryption newState = state();
m_state = newState; if ( newState != m_state )
if ( notify )
{ {
Q_EMIT stateChanged( m_state ); m_state = newState;
if ( notify )
{
Q_EMIT stateChanged( m_state );
}
} }
} }
@ -204,12 +206,12 @@ EncryptWidget::onPassphraseEdited()
} }
void void
EncryptWidget::onCheckBoxStateChanged( Calamares::checkBoxStateType checked ) EncryptWidget::onCheckBoxStateChanged( int checked )
{ {
const bool visible = ( checked != Calamares::checkBoxUncheckedValue ); // @p checked is a Qt::CheckState, 0 is "unchecked" and 2 is "checked"
m_ui->m_passphraseLineEdit->setVisible( visible ); m_ui->m_passphraseLineEdit->setVisible( checked );
m_ui->m_confirmLineEdit->setVisible( visible ); m_ui->m_confirmLineEdit->setVisible( checked );
m_ui->m_iconLabel->setVisible( visible ); m_ui->m_iconLabel->setVisible( checked );
m_ui->m_passphraseLineEdit->clear(); m_ui->m_passphraseLineEdit->clear();
m_ui->m_confirmLineEdit->clear(); m_ui->m_confirmLineEdit->clear();
m_ui->m_iconLabel->clear(); m_ui->m_iconLabel->clear();

View file

@ -13,8 +13,6 @@
#ifndef ENCRYPTWIDGET_H #ifndef ENCRYPTWIDGET_H
#define ENCRYPTWIDGET_H #define ENCRYPTWIDGET_H
#include "compat/CheckBox.h"
#include <QWidget> #include <QWidget>
#include <kpmcore/fs/filesystem.h> #include <kpmcore/fs/filesystem.h>
@ -38,7 +36,7 @@ public:
explicit EncryptWidget( QWidget* parent = nullptr ); explicit EncryptWidget( QWidget* parent = nullptr );
void setEncryptionCheckbox( bool preCheckEncrypt = false ); void setEncryptionCheckbox( bool preCheckEncrypt = false);
void reset( bool checkVisible = true ); void reset( bool checkVisible = true );
bool isEncryptionCheckboxChecked(); bool isEncryptionCheckboxChecked();
@ -61,7 +59,7 @@ signals:
private: private:
void updateState( const bool notify = true ); void updateState( const bool notify = true );
void onPassphraseEdited(); void onPassphraseEdited();
void onCheckBoxStateChanged( Calamares::checkBoxStateType checked ); void onCheckBoxStateChanged( int checked );
Ui::EncryptWidget* m_ui; Ui::EncryptWidget* m_ui;
Encryption m_state; Encryption m_state;

View file

@ -12,15 +12,12 @@
#include "PartitionDialogHelpers.h" #include "PartitionDialogHelpers.h"
#include "core/PartUtils.h" #include "core/PartUtils.h"
#include "core/PartitionCoreModule.h"
#include "gui/CreatePartitionDialog.h" #include "gui/CreatePartitionDialog.h"
#include "GlobalStorage.h" #include "GlobalStorage.h"
#include "JobQueue.h" #include "JobQueue.h"
#include "utils/Logger.h" #include "utils/Logger.h"
#include <kpmcore/fs/filesystem.h>
#include <QComboBox> #include <QComboBox>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
@ -84,7 +81,7 @@ setSelectedMountPoint( QComboBox& combo, const QString& selected )
} }
bool bool
validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ) validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button )
{ {
QString msg; QString msg;
bool ok = true; bool ok = true;
@ -98,58 +95,6 @@ validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const
{ {
msg = CreatePartitionDialog::tr( "Mountpoint must start with a <tt>/</tt>.", "@info" ); msg = CreatePartitionDialog::tr( "Mountpoint must start with a <tt>/</tt>.", "@info" );
ok = false; ok = false;
} else {
// Validate the chosen filesystem + mountpoint combination.
FileSystem::Type selectedFsType;
PartUtils::canonicalFilesystemName( fileSystem, &selectedFsType );
bool fsTypeIsAllowed = false;
if ( selectedFsType == FileSystem::Type::Unknown )
{
fsTypeIsAllowed = true;
}
else
{
QList< FileSystem::Type > anyAllowedFsTypes = core->dirFSRestrictLayout().anyAllowedFSTypes();
for ( auto& anyAllowedFsType : anyAllowedFsTypes )
{
if ( selectedFsType == anyAllowedFsType )
{
fsTypeIsAllowed = true;
break;
}
}
}
bool fsTypeIsAllowedForMountPoint = false;
// We allow arbitrary unmountable filesystems here since an
// unmountable filesystem has no mount point associated with it, thus
// any filesystem restriction we'd find at this point would be
// irrelevant.
if ( selectedFsType == FileSystem::Type::Unknown || s_unmountableFS.contains( selectedFsType ) )
{
fsTypeIsAllowedForMountPoint = true;
}
else
{
QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( mountPoint, inUse, false );
for ( auto& allowedFsType : allowedFsTypes )
{
if ( selectedFsType == allowedFsType )
{
fsTypeIsAllowedForMountPoint = true;
break;
}
}
}
if ( !fsTypeIsAllowed ) {
msg = CreatePartitionDialog::tr( "Filesystem is prohibited by this distro. Consider selecting another one.", "@info" );
ok = true;
}
else if ( !fsTypeIsAllowedForMountPoint ) {
msg = CreatePartitionDialog::tr( "Filesystem is prohibited for use on this mountpoint. Consider selecting a different filesystem or mountpoint.", "@info" );
ok = true;
}
} }
if ( label ) if ( label )

View file

@ -13,23 +13,14 @@
#define PARTITION_GUI_PARTITIONDIALOGHELPERS #define PARTITION_GUI_PARTITIONDIALOGHELPERS
#include <kpmcore/core/partitiontable.h> #include <kpmcore/core/partitiontable.h>
#include <kpmcore/fs/filesystem.h>
#include <QStringList> #include <QStringList>
#include <QSet>
class PartitionCoreModule;
class QPushButton; class QPushButton;
class QComboBox; class QComboBox;
class QLabel; class QLabel;
class QListWidget; class QListWidget;
static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted,
FileSystem::LinuxSwap,
FileSystem::Extended,
FileSystem::Unknown,
FileSystem::Lvm2_PV } );
/** /**
* Returns a list of standard mount points (e.g. /, /usr, ...). * Returns a list of standard mount points (e.g. /, /usr, ...).
* This also includes the EFI mount point if that is necessary * This also includes the EFI mount point if that is necessary
@ -77,7 +68,7 @@ setSelectedMountPoint( QComboBox* combo, const QString& selected )
* If it is not valid, returns @c false and sets the UI * If it is not valid, returns @c false and sets the UI
* to explain why. * to explain why.
*/ */
bool validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ); bool validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button );
/** /**
* Get the flags that have been checked in the list widget. * Get the flags that have been checked in the list widget.

View file

@ -360,7 +360,7 @@ PartitionLabelsView::drawLabel( QPainter* painter,
const QPoint& pos, const QPoint& pos,
bool selected ) bool selected )
{ {
painter->setPen( Qt::black ); painter->setPen( Qt::gray );
int vertOffset = 0; int vertOffset = 0;
int width = 0; int width = 0;
for ( const QString& textLine : text ) for ( const QString& textLine : text )

View file

@ -15,7 +15,6 @@
#include "PartitionPage.h" #include "PartitionPage.h"
// Local // Local
#include "Config.h"
#include "core/BootLoaderModel.h" #include "core/BootLoaderModel.h"
#include "core/DeviceModel.h" #include "core/DeviceModel.h"
#include "core/KPMHelpers.h" #include "core/KPMHelpers.h"
@ -40,12 +39,14 @@
#include "utils/Retranslator.h" #include "utils/Retranslator.h"
#include "widgets/TranslationFix.h" #include "widgets/TranslationFix.h"
// KPMcore
#include <kpmcore/core/device.h> #include <kpmcore/core/device.h>
#include <kpmcore/core/partition.h> #include <kpmcore/core/partition.h>
#include <kpmcore/core/softwareraid.h> #include <kpmcore/core/softwareraid.h>
#include <kpmcore/ops/deactivatevolumegroupoperation.h> #include <kpmcore/ops/deactivatevolumegroupoperation.h>
#include <kpmcore/ops/removevolumegroupoperation.h> #include <kpmcore/ops/removevolumegroupoperation.h>
// Qt
#include <QDir> #include <QDir>
#include <QFutureWatcher> #include <QFutureWatcher>
#include <QHeaderView> #include <QHeaderView>
@ -54,17 +55,14 @@
#include <QPointer> #include <QPointer>
#include <QtConcurrent/QtConcurrent> #include <QtConcurrent/QtConcurrent>
PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent ) PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent )
: QWidget( parent ) : QWidget( parent )
, m_ui( new Ui_PartitionPage ) , m_ui( new Ui_PartitionPage )
, m_core( core ) , m_core( core )
, m_lastSelectedBootLoaderIndex( -1 ) , m_lastSelectedBootLoaderIndex( -1 )
, m_isEfi( PartUtils::isEfiSystem() ) , m_isEfi( false )
{ {
if ( config.installChoice() != Config::InstallChoice::Manual ) m_isEfi = PartUtils::isEfiSystem();
{
cWarning() << "Manual partitioning page created without user choosing manual-partitioning.";
}
m_ui->setupUi( this ); m_ui->setupUi( this );
m_ui->partitionLabelsView->setVisible( m_ui->partitionLabelsView->setVisible(
@ -78,8 +76,6 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config,
? PartitionBarsView::DrawNestedPartitions ? PartitionBarsView::DrawNestedPartitions
: PartitionBarsView::NoNestedPartitions; : PartitionBarsView::NoNestedPartitions;
m_ui->partitionBarsView->setNestedPartitionsMode( mode ); m_ui->partitionBarsView->setNestedPartitionsMode( mode );
m_ui->lvmButtonPanel->setVisible( config.isLVMEnabled() );
updateButtons(); updateButtons();
updateBootLoaderInstallPath(); updateBootLoaderInstallPath();
@ -255,7 +251,7 @@ PartitionPage::checkCanCreate( Device* device )
{ {
auto table = device->partitionTable(); auto table = device->partitionTable();
if ( KPMHelpers::isMSDOSPartition( table->type() ) ) if ( table->type() == PartitionTable::msdos || table->type() == PartitionTable::msdos_sectorbased )
{ {
cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries(); cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries();
@ -411,7 +407,7 @@ PartitionPage::onCreateClicked()
} }
QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog(
m_core, model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this ); model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this );
if ( dlg->exec() == QDialog::Accepted ) if ( dlg->exec() == QDialog::Accepted )
{ {
Partition* newPart = dlg->getNewlyCreatedPartition(); Partition* newPart = dlg->getNewlyCreatedPartition();
@ -515,7 +511,7 @@ PartitionPage::updatePartitionToCreate( Device* device, Partition* partition )
mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); mountPoints.removeOne( PartitionInfo::mountPoint( partition ) );
QPointer< CreatePartitionDialog > dlg QPointer< CreatePartitionDialog > dlg
= new CreatePartitionDialog( m_core, device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this ); = new CreatePartitionDialog( device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this );
if ( dlg->exec() == QDialog::Accepted ) if ( dlg->exec() == QDialog::Accepted )
{ {
Partition* newPartition = dlg->getNewlyCreatedPartition(); Partition* newPartition = dlg->getNewlyCreatedPartition();
@ -532,7 +528,7 @@ PartitionPage::editExistingPartition( Device* device, Partition* partition )
mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); mountPoints.removeOne( PartitionInfo::mountPoint( partition ) );
QPointer< EditExistingPartitionDialog > dlg QPointer< EditExistingPartitionDialog > dlg
= new EditExistingPartitionDialog( m_core, device, partition, mountPoints, this ); = new EditExistingPartitionDialog( device, partition, mountPoints, this );
if ( dlg->exec() == QDialog::Accepted ) if ( dlg->exec() == QDialog::Accepted )
{ {
dlg->applyChanges( m_core ); dlg->applyChanges( m_core );

View file

@ -16,7 +16,6 @@
#include <QScopedPointer> #include <QScopedPointer>
#include <QWidget> #include <QWidget>
class Config;
class PartitionCoreModule; class PartitionCoreModule;
class Ui_PartitionPage; class Ui_PartitionPage;
@ -33,7 +32,7 @@ class PartitionPage : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent = nullptr ); explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr );
~PartitionPage() override; ~PartitionPage() override;
void onRevertClicked(); void onRevertClicked();

View file

@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>684</width> <width>684</width>
<height>327</height> <height>304</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -129,38 +129,36 @@ SPDX-License-Identifier: GPL-3.0-or-later
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QWidget" name="lvmButtonPanel" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<layout class="QHBoxLayout" name="lvmButtonLayout"> <item>
<item> <widget class="QPushButton" name="newVolumeGroupButton">
<widget class="QPushButton" name="newVolumeGroupButton"> <property name="text">
<property name="text"> <string>New Volume Group</string>
<string>New Volume Group</string> </property>
</property> </widget>
</widget> </item>
</item> <item>
<item> <widget class="QPushButton" name="resizeVolumeGroupButton">
<widget class="QPushButton" name="resizeVolumeGroupButton"> <property name="text">
<property name="text"> <string>Resize Volume Group</string>
<string>Resize Volume Group</string> </property>
</property> </widget>
</widget> </item>
</item> <item>
<item> <widget class="QPushButton" name="deactivateVolumeGroupButton">
<widget class="QPushButton" name="deactivateVolumeGroupButton"> <property name="text">
<property name="text"> <string>Deactivate Volume Group</string>
<string>Deactivate Volume Group</string> </property>
</property> </widget>
</widget> </item>
</item> <item>
<item> <widget class="QPushButton" name="removeVolumeGroupButton">
<widget class="QPushButton" name="removeVolumeGroupButton"> <property name="text">
<property name="text"> <string>Remove Volume Group</string>
<string>Remove Volume Group</string> </property>
</property> </widget>
</widget> </item>
</item> </layout>
</layout>
</widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">

View file

@ -333,7 +333,7 @@ template < typename F >
void void
apply( const QStringList& paths, F f, QList< MessageAndPath >& news ) apply( const QStringList& paths, F f, QList< MessageAndPath >& news )
{ {
for ( const QString& p : std::as_const( paths ) ) for ( const QString& p : qAsConst( paths ) )
{ {
auto n = f( p ); auto n = f( p );
if ( !n.isEmpty() ) if ( !n.isEmpty() )
@ -347,7 +347,7 @@ STATICTEST QStringList
stringify( const QList< MessageAndPath >& news ) stringify( const QList< MessageAndPath >& news )
{ {
QStringList l; QStringList l;
for ( const auto& m : std::as_const( news ) ) for ( const auto& m : qAsConst( news ) )
{ {
l << QString( m ); l << QString( m );
} }

View file

@ -56,7 +56,7 @@ ClearTempMountsJob::exec()
std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder );
QStringList goodNews; QStringList goodNews;
for ( const auto& m : std::as_const( targetMounts ) ) for ( const auto& m : qAsConst( targetMounts ) )
{ {
cDebug() << o << "Will try to umount path" << m.mountPoint; cDebug() << o << "Will try to umount path" << m.mountPoint;
if ( Calamares::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 ) if ( Calamares::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 )

View file

@ -99,6 +99,7 @@ mapForPartition( Partition* partition, const QString& uuid )
{ {
map[ "fs" ] = untranslatedFS( dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() ); map[ "fs" ] = untranslatedFS( dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() );
} }
if ( partition->fileSystem().type() == FileSystem::Luks2 if ( partition->fileSystem().type() == FileSystem::Luks2
&& dynamic_cast< FS::luks2& >( partition->fileSystem() ).innerFS() ) && dynamic_cast< FS::luks2& >( partition->fileSystem() ).innerFS() )
{ {

View file

@ -20,6 +20,10 @@
# system partition. If nothing is specified, the *recommendedSize* # system partition. If nothing is specified, the *recommendedSize*
# is used instead. # is used instead.
# - *label* # - *label*
# This size is the minimum acceptable efi partition size when using systemd-boot
#
efiSystemPartitionMinSize: 500M
# This optional setting specifies the name of the EFI system partition (see # This optional setting specifies the name of the EFI system partition (see
# PARTLABEL; gpt only; requires KPMCore >= 4.2.0). # PARTLABEL; gpt only; requires KPMCore >= 4.2.0).
# If nothing is specified, the partition name is left unset. # If nothing is specified, the partition name is left unset.
@ -46,6 +50,10 @@ efi:
# Deprecated alias of efi.label # Deprecated alias of efi.label
# efiSystemPartitionName: EFI # efiSystemPartitionName: EFI
# An optional variable from global storage which holds the bootloader and is used to
# override the value of efiSystemPartition
# efiBootLoaderVar: "packagechooser_bootloader"
# In autogenerated partitioning, allow the user to select a swap size? # In autogenerated partitioning, allow the user to select a swap size?
# If there is exactly one choice, no UI is presented, and the user # If there is exactly one choice, no UI is presented, and the user
# cannot make a choice -- this setting is used. If there is more than # cannot make a choice -- this setting is used. If there is more than
@ -86,20 +94,7 @@ userSwapChoices:
# LEGACY SETTINGS (these will generate a warning) # LEGACY SETTINGS (these will generate a warning)
# ensureSuspendToDisk: true # ensureSuspendToDisk: true
# neverCreateSwap: false # neverCreateSwap: false
# This setting specifies the LUKS generation (i.e LUKS1, LUKS2) used internally by
# cryptsetup when creating an encrypted partition.
#
# This option is set to luks1 by default, as grub doesn't support LUKS2 + Argon2id
# currently. On the other hand grub does support LUKS2 with PBKDF2 and could therefore be
# also set to luks2. Also there are some patches for grub and Argon2.
# See: https://aur.archlinux.org/packages/grub-improved-luks2-git
#
# Choices: luks1, luks2 (in addition, "luks" means "luks1") # Choices: luks1, luks2 (in addition, "luks" means "luks1")
#
# The default is luks1
#
luksGeneration: luks1
# This setting determines if encryption should be allowed when using zfs. This # This setting determines if encryption should be allowed when using zfs. This
# setting has no effect unless zfs support is provided. # setting has no effect unless zfs support is provided.
@ -223,49 +218,6 @@ defaultFileSystemType: "ext4"
# warning (this matches traditional no-choice-available behavior best). # warning (this matches traditional no-choice-available behavior best).
# availableFileSystemTypes: ["ext4","f2fs"] # availableFileSystemTypes: ["ext4","f2fs"]
# Per-directory filesystem restrictions.
#
# This optional setting specifies what filesystems the user can and cannot use
# for various directories and mountpoints when using manual partitioning.
#
# If nothing is specified, the only restriction enforced by default is that
# the EFI system partition must use the fat32 filesystem.
#
# Otherwise, the filesystem restrictions are defined as follow:
#
# directoryFilesystemRestrictions:
# - directory: "any"
# allowedFilesystemTypes: ["all"]
# - directory: "/"
# allowedFilesystemTypes: ["ext4","xfs","btrfs","jfs","f2fs"]
# - mountpoint: "efi"
# allowedFilesystemTypes: ["fat32"]
# onlyWhenMountpoint: true
#
# There can be any number of mountpoints listed, each entry having the
# following attributes:
# - mountpoint: mountpoint's full path
# or
# "any" to specify a global whitelist that applies to all
# mountpoints
# or
# "efi" to specify a whitelist specific to the EFI system
# partition, wherever that partition is located
# - allowedFilesystemTypes: the list of all filesystems valid for this
# mountpoint. If the list contains exactly one
# element, and that element is the special value
# "any", all filesystem types recognized by
# Calamares will be allowed.
# - onlyWhenMountpoint: Whether the restriction should apply only when the
# specified directory is a mountpoint. When set to
# true, Calamares will only enforce the listed
# restrictions when the user makes a separate partition
# for this directory and assigns the mountpoint
# accordingly. When set to false, Calamares will
# ensure this directory uses the specified filesystem
# even if the directory is part of a filesystem on a
# different mountpoint. Defaults to false.
# Show/hide LUKS related functionality in automated partitioning modes. # Show/hide LUKS related functionality in automated partitioning modes.
# Disable this if you choose not to deploy early unlocking support in GRUB2 # Disable this if you choose not to deploy early unlocking support in GRUB2
# and/or your distribution's initramfs solution. # and/or your distribution's initramfs solution.
@ -290,13 +242,6 @@ defaultFileSystemType: "ext4"
# to cypher their disk when installing in enterprise (for exemple). # to cypher their disk when installing in enterprise (for exemple).
#preCheckEncryption: false #preCheckEncryption: false
# LVM support
#
# There is only one sub-key available, *enable* (defaults to true)
# which can be used to show (default) or hide the LVM buttons in the partitioning module.
lvm:
enable: true
# Partition layout. # Partition layout.
# #
# This optional setting specifies a custom partition layout. # This optional setting specifies a custom partition layout.

View file

@ -20,12 +20,6 @@ properties:
mountPoint: { type: string } mountPoint: { type: string }
additionalProperties: false additionalProperties: false
lvm:
type: object
properties:
enable: { type: boolean, default: true }
additionalProperties: false
userSwapChoices: { type: array, items: { type: string, enum: [ none, reuse, small, suspend, file ] } } userSwapChoices: { type: array, items: { type: string, enum: [ none, reuse, small, suspend, file ] } }
# ensureSuspendToDisk: { type: boolean, default: true } # Legacy # ensureSuspendToDisk: { type: boolean, default: true } # Legacy
# neverCreateSwap: { type: boolean, default: false } # Legacy # neverCreateSwap: { type: boolean, default: false } # Legacy
@ -37,12 +31,10 @@ properties:
defaultFileSystemType: { type: string } defaultFileSystemType: { type: string }
availableFileSystemTypes: { type: array, items: { type: string } } availableFileSystemTypes: { type: array, items: { type: string } }
mountpointFilesystemRestrictions: { type: array } # TODO: specify items
luksGeneration: { type: string, enum: [luks1, luks2] } # Also allows "luks" as alias of "luks1" luksGeneration: { type: string, enum: [luks1, luks2] } # Also allows "luks" as alias of "luks1"
enableLuksAutomatedPartitioning: { type: boolean, default: false } enableLuksAutomatedPartitioning: { type: boolean, default: false }
preCheckEncryption: { type: boolean, default: false } preCheckEncryption: { type: boolean, default: false }
allowManualPartitioning: { type: boolean, default: true } allowManualPartitioning: { type: boolean, default: true }
showNotEncryptedBootMessage: { type: boolean, default: true } showNotEncryptedBootMessage: { type: boolean, default: true }
partitionLayout: { type: array } # TODO: specify items partitionLayout: { type: array } # TODO: specify items