Merge branch 'calamares' into non-ascii

This commit is contained in:
Adriaan de Groot 2024-04-28 23:17:11 +02:00 committed by GitHub
commit 5a56188a51
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 249 additions and 91 deletions

View File

@ -10,11 +10,23 @@ the history of the 3.2 series (2018-05 - 2022-08).
# 3.3.7 (unreleased) # 3.3.7 (unreleased)
This release contains contributions from (alphabetically by first name): This release contains contributions from (alphabetically by first name):
- Nobody, yet - Adriaan de Groot
- Eugene San
- Evan James
- Vincent Penvern
- Vladislav Nepogodin
## Core ## ## Core ##
- Updated clang-formatting
- Some C++20 future-proofing (thanks Vladislav)
## Modules ## ## Modules ##
- *fstab* module does not add an encryption keyfile if it does
not exist. (thanks Eugene)
- *partition* module did not filter out invalid fstab entries;
they were not written, either, so no net change.
- *partition* module now has a configurable default check-state
for the encryption checkbox. (thanks Vincent)
# 3.3.6 (2024-04-16) # 3.3.6 (2024-04-16)
@ -22,7 +34,7 @@ This release contains contributions from (alphabetically by first name):
This release contains contributions from (alphabetically by first name): This release contains contributions from (alphabetically by first name):
- Adriaan de Groot - Adriaan de Groot
- Anke Boersma - Anke Boersma
- Eugene Sam - Eugene San
- Evan James - Evan James
- Harald Sitter - Harald Sitter
- Mike Stemle - Mike Stemle

View File

@ -22,15 +22,6 @@ static const char s_footer[]
"and the <a href=\"https://app.transifex.com/calamares/calamares/\">Calamares " "and the <a href=\"https://app.transifex.com/calamares/calamares/\">Calamares "
"translators team</a>." ); "translators team</a>." );
#if 0
// Blue Systems sponsored until June 2022
static const char s_sponsor[] = QT_TRANSLATE_NOOP( "AboutData",
"<a href=\"https://calamares.io/\">Calamares</a> "
"development is sponsored by <br/>"
"<a href=\"http://www.blue-systems.com/\">Blue Systems</a> - "
"Liberating Software." );
#endif
struct Maintainer struct Maintainer
{ {
unsigned int start; unsigned int start;
@ -57,14 +48,12 @@ static constexpr const Maintainer maintainers[] = {
static QString static QString
aboutMaintainers() aboutMaintainers()
{ {
return std::accumulate( std::cbegin( maintainers ), QStringList s;
std::cend( maintainers ), for ( const auto& m : maintainers )
QString(), {
[]( QString& s, const Maintainer& m ) s.append( m.text() );
{ }
s += m.text(); return s.join( QString() );
return s;
} );
} }
static QString static QString

View File

@ -0,0 +1,23 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2024 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*
*/
#ifndef CALAMARES_COMPAT_SIZE_H
#define CALAMARES_COMPAT_SIZE_H
#include <QVariant>
namespace Calamares
{
/* Compatibility of size types (e.g. qsizetype, STL sizes, int) between Qt5 and Qt6 */
using NumberForTr = int;
}
#endif

View File

@ -11,6 +11,7 @@
#include "RequirementsChecker.h" #include "RequirementsChecker.h"
#include "compat/Mutex.h" #include "compat/Mutex.h"
#include "compat/Size.h"
#include "modulesystem/Module.h" #include "modulesystem/Module.h"
#include "modulesystem/Requirement.h" #include "modulesystem/Requirement.h"
#include "modulesystem/RequirementsModel.h" #include "modulesystem/RequirementsModel.h"
@ -120,7 +121,7 @@ RequirementsChecker::reportProgress()
{ {
cDebug() << "Remaining modules:" << remaining << Logger::DebugList( remainingNames ); cDebug() << "Remaining modules:" << remaining << Logger::DebugList( remainingNames );
unsigned int posInterval = ( m_progressTimer->interval() < 0 ) ? 1000 : uint( m_progressTimer->interval() ); unsigned int posInterval = ( m_progressTimer->interval() < 0 ) ? 1000 : uint( m_progressTimer->interval() );
QString waiting = tr( "Waiting for %n module(s)…", "@status", remaining ); QString waiting = tr( "Waiting for %n module(s)…", "@status", static_cast<Calamares::NumberForTr>(remaining) );
QString elapsed = tr( "(%n second(s))", "@status", m_progressTimeouts * posInterval / 999 ); QString elapsed = tr( "(%n second(s))", "@status", m_progressTimeouts * posInterval / 999 );
Q_EMIT requirementsProgress( waiting + QString( " " ) + elapsed ); Q_EMIT requirementsProgress( waiting + QString( " " ) + elapsed );
} }

View File

@ -66,7 +66,7 @@ RequirementsModel::reCheckList()
int int
RequirementsModel::rowCount( const QModelIndex& ) const RequirementsModel::rowCount( const QModelIndex& ) const
{ {
return m_requirements.count(); return static_cast< int >( m_requirements.count() ); // TODO 3.4 use qsizetype
} }
QVariant QVariant

View File

@ -61,8 +61,8 @@ public:
QVariant data( const QModelIndex& index, int role ) const override; QVariant data( const QModelIndex& index, int role ) const override;
int rowCount( const QModelIndex& ) const override; int rowCount( const QModelIndex& ) const override; // TODO 3.4 use qsizetype
int count() const { return m_requirements.count(); } int count() const { return static_cast< int >( m_requirements.count() ); } // TODO 3.4 use qsizetype
///@brief Debugging tool, describe the checking-state ///@brief Debugging tool, describe the checking-state
void describe() const; void describe() const;

View File

@ -151,8 +151,12 @@ class FstabGenerator(object):
if not mapper_name or not luks_uuid: if not mapper_name or not luks_uuid:
return None return None
password = "/crypto_keyfile.bin"
crypttab_options = self.crypttab_options crypttab_options = self.crypttab_options
# Make sure to not use missing keyfile
if os.path.isfile(os.path.join(self.root_mount_point, "crypto_keyfile.bin")):
password = "/crypto_keyfile.bin"
else:
password = "none"
# Set crypttab password for partition to none and remove crypttab options # Set crypttab password for partition to none and remove crypttab options
# if root partition was not encrypted # if root partition was not encrypted

View File

@ -11,6 +11,8 @@ he us - he
ar us - ar ar us - ar
ir us - fa ir us - fa
# This list is from /usr/share/X11/xkb/rules/base, all the non-latin
# layouts are collected in $nonlatin . Add us (English) to all of them.
af us - af af us - af
am us - am am us - am
ara us - ara ara us - ara

View File

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

View File

@ -444,6 +444,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
m_allowZfsEncryption = Calamares::getBool( configurationMap, "allowZfsEncryption", true ); m_allowZfsEncryption = Calamares::getBool( configurationMap, "allowZfsEncryption", true );
m_allowManualPartitioning = Calamares::getBool( configurationMap, "allowManualPartitioning", true ); m_allowManualPartitioning = Calamares::getBool( configurationMap, "allowManualPartitioning", true );
m_preCheckEncryption = Calamares::getBool( configurationMap, "preCheckEncryption", false );
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" );

View File

@ -35,7 +35,7 @@ class Config : public QObject
replaceModeFilesystemChanged ) replaceModeFilesystemChanged )
Q_PROPERTY( bool allowManualPartitioning READ allowManualPartitioning CONSTANT FINAL ) Q_PROPERTY( bool allowManualPartitioning READ allowManualPartitioning 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 )
public: public:
@ -148,6 +148,13 @@ public:
/// @brief Is manual partitioning allowed (not explicitly disabled in the config file)? /// @brief Is manual partitioning allowed (not explicitly disabled in the config file)?
bool allowManualPartitioning() const { return m_allowManualPartitioning; } bool allowManualPartitioning() const { return m_allowManualPartitioning; }
/** @brief Pre-check encryption checkbox.
*
* This is meaningful only if enableLuksAutomatedPartitioning is @c true.
* Default value is @c false
*/
bool preCheckEncryption() const { return m_preCheckEncryption; }
/// @brief Show "Boot partition not encrypted" warning (not explicitly disabled in the config file)? /// @brief Show "Boot partition not encrypted" warning (not explicitly disabled in the config file)?
bool showNotEncryptedBootMessage() const { return m_showNotEncryptedBootMessage; } bool showNotEncryptedBootMessage() const { return m_showNotEncryptedBootMessage; }
@ -199,6 +206,7 @@ private:
QStringList m_requiredPartitionTableType; QStringList m_requiredPartitionTableType;
bool m_allowZfsEncryption = true; bool m_allowZfsEncryption = true;
bool m_allowManualPartitioning = true; bool m_allowManualPartitioning = true;
bool m_preCheckEncryption = false;
bool m_showNotEncryptedBootMessage = true; bool m_showNotEncryptedBootMessage = true;
}; };

View File

@ -223,9 +223,15 @@ PartitionViewStep::prettyStatus() const
const QList< PartitionCoreModule::SummaryInfo > list = m_core->createSummaryInfo(); const QList< PartitionCoreModule::SummaryInfo > list = m_core->createSummaryInfo();
cDebug() << "Summary for Partition" << list.length() << choice; cDebug() << "Summary for Partition" << list.length() << choice;
auto joinDiskInfo = [ choice ]( QString& s, const PartitionCoreModule::SummaryInfo& i ) const QString diskInfoLabel = [ &choice, &list ]()
{ return s + diskDescription( 1, i, choice ); }; {
const QString diskInfoLabel = std::accumulate( list.begin(), list.end(), QString(), joinDiskInfo ); QStringList s;
for ( const auto& i : list )
{
s.append( diskDescription( 1, i, choice ) );
}
return s.join( QString() );
}();
const QString jobsLabel = jobDescriptions( jobs() ).join( QStringLiteral( "<br/>" ) ); const QString jobsLabel = jobDescriptions( jobs() ).join( QStringLiteral( "<br/>" ) );
return diskInfoLabel + "<br/>" + jobsLabel; return diskInfoLabel + "<br/>" + jobsLabel;
} }

View File

@ -0,0 +1,63 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
* SPDX-FileCopyrightText: 2018-2019, 2024 Adriaan de Groot <groot@kde.org>
* SPDX-FileCopyrightText: 2019 Collabora Ltd <arnaud.ferraris@collabora.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
#include "OsproberEntry.h"
bool
FstabEntry::isValid() const
{
return !partitionNode.isEmpty() && !mountPoint.isEmpty() && !fsType.isEmpty();
}
FstabEntry
FstabEntry::fromEtcFstab( const QString& rawLine )
{
QString line = rawLine.simplified();
if ( line.startsWith( '#' ) )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
QStringList splitLine = line.split( ' ' );
if ( splitLine.length() != 6 )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
return FstabEntry {
splitLine.at( 0 ), // path, or UUID, or LABEL, etc.
splitLine.at( 1 ), // mount point
splitLine.at( 2 ), // fs type
splitLine.at( 3 ), // options
splitLine.at( 4 ).toInt(), //dump
splitLine.at( 5 ).toInt() //pass
};
}
namespace Calamares
{
FstabEntryList
fromEtcFstabContents( const QStringList& fstabLines )
{
FstabEntryList fstabEntries;
for ( const QString& rawLine : fstabLines )
{
fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) );
}
const auto invalidEntries = std::remove_if(
fstabEntries.begin(), fstabEntries.end(), []( const FstabEntry& x ) { return !x.isValid(); } );
fstabEntries.erase( invalidEntries, fstabEntries.end() );
return fstabEntries;
}
} // namespace Calamares

View File

@ -32,11 +32,24 @@ struct FstabEntry
* If the string isn't valid (e.g. comment-line, or broken * If the string isn't valid (e.g. comment-line, or broken
* fstab entry) then the entry that is returned is invalid. * fstab entry) then the entry that is returned is invalid.
*/ */
static FstabEntry fromEtcFstab( const QString& ); // implemented in Partutils.cpp static FstabEntry fromEtcFstab( const QString& );
}; };
typedef QList< FstabEntry > FstabEntryList; typedef QList< FstabEntry > FstabEntryList;
namespace Calamares
{
/** @brief Returns valid entries from the lines of a fstab file */
FstabEntryList fromEtcFstabContents( const QStringList& fstabLines );
/** @brief Returns valid entries from the byte-contents of a fstab file */
inline FstabEntryList
fromEtcFstabContents( const QByteArray& contents )
{
return fromEtcFstabContents( QString::fromLocal8Bit( contents ).split( '\n' ) );
}
} // namespace Calamares
struct OsproberEntry struct OsproberEntry
{ {
QString prettyName; QString prettyName;

View File

@ -254,30 +254,25 @@ lookForFstabEntries( const QString& partitionPath )
if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
{ {
const QStringList fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ).split( '\n' ); const auto fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ).split( '\n' );
for ( const QString& rawLine : fstabLines )
{
fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) );
}
fstabFile.close(); fstabFile.close();
const int lineCount = fstabEntries.count();
std::remove_if( const auto fstabEntries = Calamares::fromEtcFstabContents( fstabLines );
fstabEntries.begin(), fstabEntries.end(), []( const FstabEntry& x ) { return !x.isValid(); } ); cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries from" << fstabLines.count()
cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries from" << lineCount
<< "lines in" << fstabFile.fileName(); << "lines in" << fstabFile.fileName();
return fstabEntries;
} }
else else
{ {
cWarning() << "Could not read fstab from mounted fs"; cWarning() << "Could not read fstab from mounted fs";
return {};
} }
} }
else else
{ {
cWarning() << "Could not mount existing fs"; cWarning() << "Could not mount existing fs";
return {};
} }
return fstabEntries;
} }
static QString static QString
@ -641,36 +636,3 @@ canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType )
} }
} // namespace PartUtils } // namespace PartUtils
/* Implementation of methods for FstabEntry, from OsproberEntry.h */
bool
FstabEntry::isValid() const
{
return !partitionNode.isEmpty() && !mountPoint.isEmpty() && !fsType.isEmpty();
}
FstabEntry
FstabEntry::fromEtcFstab( const QString& rawLine )
{
QString line = rawLine.simplified();
if ( line.startsWith( '#' ) )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
QStringList splitLine = line.split( ' ' );
if ( splitLine.length() != 6 )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
return FstabEntry {
splitLine.at( 0 ), // path, or UUID, or LABEL, etc.
splitLine.at( 1 ), // mount point
splitLine.at( 2 ), // fs type
splitLine.at( 3 ), // options
splitLine.at( 4 ).toInt(), //dump
splitLine.at( 5 ).toInt() //pass
};
}

View File

@ -185,7 +185,6 @@ ChoicePage::init( PartitionCoreModule* core )
setModelToComboBox( m_drivesCombo, core->deviceModel() ); setModelToComboBox( m_drivesCombo, core->deviceModel() );
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, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged ); connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged );
@ -468,6 +467,8 @@ ChoicePage::onActionChanged()
{ {
m_encryptWidget->setFilesystem( FileSystem::typeForName( m_replaceFsTypesChoiceComboBox->currentText() ) ); m_encryptWidget->setFilesystem( FileSystem::typeForName( m_replaceFsTypesChoiceComboBox->currentText() ) );
} }
m_encryptWidget->setEncryptionCheckbox( m_config->preCheckEncryption() );
} }
Device* currd = selectedDevice(); Device* currd = selectedDevice();
@ -679,7 +680,11 @@ ChoicePage::onLeave()
{ {
if ( m_config->installChoice() == InstallChoice::Alongside ) if ( m_config->installChoice() == InstallChoice::Alongside )
{ {
doAlongsideApply(); if ( m_afterPartitionSplitterWidget->splitPartitionSize() >= 0
&& m_afterPartitionSplitterWidget->newPartitionSize() >= 0 )
{
doAlongsideApply();
}
} }
if ( m_isEfi if ( m_isEfi
@ -1579,7 +1584,10 @@ ChoicePage::calculateNextEnabled() const
} }
} }
if ( m_config->installChoice() != InstallChoice::Manual && m_encryptWidget->isVisible() ) // You can have an invisible encryption checkbox, which is
// still checked -- then do the encryption.
if ( m_config->installChoice() != InstallChoice::Manual
&& ( m_encryptWidget->isVisible() || m_encryptWidget->isEncryptionCheckboxChecked() ) )
{ {
switch ( m_encryptWidget->state() ) switch ( m_encryptWidget->state() )
{ {

View File

@ -70,6 +70,18 @@ EncryptWidget::EncryptWidget( QWidget* parent )
CALAMARES_RETRANSLATE_SLOT( &EncryptWidget::retranslate ); CALAMARES_RETRANSLATE_SLOT( &EncryptWidget::retranslate );
} }
bool
EncryptWidget::isEncryptionCheckboxChecked()
{
return m_ui->m_encryptCheckBox->isChecked();
}
void
EncryptWidget::setEncryptionCheckbox( bool preCheckEncrypt )
{
m_ui->m_encryptCheckBox->setChecked( preCheckEncrypt );
}
void void
EncryptWidget::reset( bool checkVisible ) EncryptWidget::reset( bool checkVisible )
{ {
@ -170,15 +182,10 @@ EncryptWidget::updateState( const bool notify )
} }
} }
Encryption newState = state(); m_state = state();
if ( notify )
if ( newState != m_state )
{ {
m_state = newState; Q_EMIT stateChanged( m_state );
if ( notify )
{
Q_EMIT stateChanged( m_state );
}
} }
} }

View File

@ -36,8 +36,10 @@ public:
explicit EncryptWidget( QWidget* parent = nullptr ); explicit EncryptWidget( QWidget* parent = nullptr );
void setEncryptionCheckbox( bool preCheckEncrypt = false);
void reset( bool checkVisible = true ); void reset( bool checkVisible = true );
bool isEncryptionCheckboxChecked();
Encryption state() const; Encryption state() const;
void setText( const QString& text ); void setText( const QString& text );

View File

@ -240,6 +240,11 @@ defaultFileSystemType: "ext4"
# If nothing is specified, LUKS is enabled in automated modes. # If nothing is specified, LUKS is enabled in automated modes.
#enableLuksAutomatedPartitioning: true #enableLuksAutomatedPartitioning: true
# When enableLuksAutomatedPartitioning is true, this option will pre-check
# encryption checkbox. This option is only usefull to help people to not forget
# to cypher their disk when installing in enterprise (for exemple).
#preCheckEncryption: false
# Partition layout. # Partition layout.
# #
# This optional setting specifies a custom partition layout. # This optional setting specifies a custom partition layout.

View File

@ -34,6 +34,7 @@ properties:
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 }
allowManualPartitioning: { type: boolean, default: true } allowManualPartitioning: { type: boolean, default: true }
showNotEncryptedBootMessage: { type: boolean, default: true } showNotEncryptedBootMessage: { type: boolean, default: true }

View File

@ -14,6 +14,12 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
) )
set(PartitionModule_basic_SRC
${PartitionModule_SOURCE_DIR}/core/OsproberEntry.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
)
calamares_add_test( calamares_add_test(
partitionjobtest partitionjobtest
SOURCES SOURCES
@ -40,10 +46,9 @@ calamares_add_test(
partitioncreatelayoutstest partitioncreatelayoutstest
SOURCES SOURCES
CreateLayoutsTests.cpp CreateLayoutsTests.cpp
${PartitionModule_basic_SRC}
${PartitionModule_SOURCE_DIR}/core/KPMHelpers.cpp ${PartitionModule_SOURCE_DIR}/core/KPMHelpers.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionLayout.cpp ${PartitionModule_SOURCE_DIR}/core/PartitionLayout.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp ${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp
LIBRARIES calamares::kpmcore Calamares::calamaresui LIBRARIES calamares::kpmcore Calamares::calamaresui
DEFINITIONS ${_partition_defs} DEFINITIONS ${_partition_defs}
@ -66,9 +71,8 @@ calamares_add_test(
partitionconfigtest partitionconfigtest
SOURCES SOURCES
ConfigTests.cpp ConfigTests.cpp
${PartitionModule_basic_SRC}
${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp ${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
${PartitionModule_SOURCE_DIR}/Config.cpp ${PartitionModule_SOURCE_DIR}/Config.cpp
LIBRARIES calamares::kpmcore Calamares::calamaresui LIBRARIES calamares::kpmcore Calamares::calamaresui
DEFINITIONS DEFINITIONS

View File

@ -9,6 +9,7 @@
#include "Config.h" #include "Config.h"
#include "core/OsproberEntry.h"
#include "core/PartUtils.h" #include "core/PartUtils.h"
#include "GlobalStorage.h" #include "GlobalStorage.h"
@ -17,6 +18,7 @@
#include "utils/System.h" #include "utils/System.h"
#include "utils/Yaml.h" #include "utils/Yaml.h"
#include <QByteArray>
#include <QObject> #include <QObject>
#include <QtTest/QtTest> #include <QtTest/QtTest>
@ -35,6 +37,9 @@ private Q_SLOTS:
void testLegacySize(); void testLegacySize();
void testAll(); void testAll();
void testWeirdConfig(); void testWeirdConfig();
void testNormalFstab();
void testWeirdFstab();
}; };
ConfigTests::ConfigTests() = default; ConfigTests::ConfigTests() = default;
@ -222,6 +227,48 @@ ConfigTests::testWeirdConfig()
} }
} }
void
ConfigTests::testNormalFstab()
{
const auto contents
= QByteArrayLiteral( "# A FreeBSD fstab\n"
"/dev/nvd0p3 none swap sw 0 0\n" );
const auto entries = Calamares::fromEtcFstabContents( contents );
for ( const auto& e : entries )
{
QVERIFY( e.isValid() );
}
QCOMPARE( entries.count(), 1 );
}
void
ConfigTests::testWeirdFstab()
{
const auto contents
= QByteArrayLiteral( "# <file system> <mount point> <type> <options> <dump> <pass>\n"
"UUID=dae80d0a-f6c7-46f4-a04a-6761f2cfd9b6 / ext4 defaults,noatime 0 1\n"
"UUID=423892d5-a929-41a9-a846-f410cf3fe25b swap swap defaults,noatime 0 2\n"
"# another comment\n"
"borked 2\n"
"ok /dev1 ext4 none 0 0\n"
"bogus /dev2 ext4 none no later\n"
"# comment\n" );
const auto entries = Calamares::fromEtcFstabContents( contents );
QCOMPARE( entries.count(), 4 );
QStringList mountPoints;
for ( const auto& e : entries )
{
mountPoints.append( e.mountPoint );
}
mountPoints.sort();
QCOMPARE( mountPoints,
QStringList() << "/"
<< "/dev1"
<< "/dev2"
<< "swap" );
}
QTEST_GUILESS_MAIN( ConfigTests ) QTEST_GUILESS_MAIN( ConfigTests )

View File

@ -51,7 +51,6 @@ ActiveDirectoryJob::exec()
if ( !m_ip.isEmpty() ) if ( !m_ip.isEmpty() )
{ {
const QString hostsFilePath = Calamares::System::instance()->targetPath( QStringLiteral( "/etc/hosts" ) ); const QString hostsFilePath = Calamares::System::instance()->targetPath( QStringLiteral( "/etc/hosts" ) );
;
QFile hostsFile( hostsFilePath ); QFile hostsFile( hostsFilePath );
if ( hostsFile.open( QIODevice::Append | QIODevice::Text ) ) if ( hostsFile.open( QIODevice::Append | QIODevice::Text ) )
{ {

View File

@ -35,7 +35,7 @@ paintRequirement( QPainter* painter, const QStyleOptionViewItem& option, const Q
Calamares::ImageType statusImage = Calamares::StatusOk; Calamares::ImageType statusImage = Calamares::StatusOk;
painter->setPen( QColorConstants::Black ); painter->setPen( Qt::black );
if ( index.data( Calamares::RequirementsModel::Satisfied ).toBool() ) if ( index.data( Calamares::RequirementsModel::Satisfied ).toBool() )
{ {
painter->fillRect( textRect, option.palette.window().color() ); painter->fillRect( textRect, option.palette.window().color() );