Merge branch 'smooth-partition-crash'

This commit is contained in:
Adriaan de Groot 2019-02-11 19:07:32 -05:00
commit faa3392cc5
9 changed files with 67 additions and 36 deletions

View File

@ -47,7 +47,7 @@ This release contains contributions from (alphabetically by first name):
* The currently-selected disk device is remembered between manual partitioning
and the partitioning-overview pages. (Thanks to Arnaud)
* *partition* There is new support for partitioning layout presets.
See `partitionc.conf` for documentation and details.
See `partition.conf` for documentation and details.
* The *keyboard* module now handles the (bogus) Austrian keymap for
the system console properly. (Thanks to Kevin)
* The *preservefiles* module now has a mechanism for setting the permissions
@ -56,7 +56,8 @@ This release contains contributions from (alphabetically by first name):
for use in OEM installs where an image of fixed size is created,
and then sized to the actual SD card the user has used.
* The *mount* module now handles missing *extraMounts* and *extraMountsEfi*
keys gracefully (this is probably a misconfiguration issue).
keys gracefully (this is probably a misconfiguration, though, and gives a
warning).
* The *packages* module now supports pre- and post-script options
for all operations, not just during install (keep in mind that
these run as three separate shells, though).

View File

@ -880,7 +880,7 @@ PartitionCoreModule::revertAllDevices()
}
}
revertDevice( ( *it )->device.data() );
revertDevice( ( *it )->device.data(), false );
++it;
}
@ -889,7 +889,7 @@ PartitionCoreModule::revertAllDevices()
void
PartitionCoreModule::revertDevice( Device* dev )
PartitionCoreModule::revertDevice( Device* dev, bool individualRevert )
{
QMutexLocker locker( &m_revertMutex );
DeviceInfo* devInfo = infoForDevice( dev );
@ -915,7 +915,8 @@ PartitionCoreModule::revertDevice( Device* dev )
m_bootLoaderModel->init( devices );
refreshAfterModelChange();
if ( individualRevert )
refreshAfterModelChange();
emit deviceReverted( newDev );
}
@ -931,7 +932,7 @@ PartitionCoreModule::asyncRevertDevice( Device* dev, std::function< void() > cal
watcher->deleteLater();
} );
QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev );
QFuture< void > future = QtConcurrent::run( this, &PartitionCoreModule::revertDevice, dev, true );
watcher->setFuture( future );
}

View File

@ -191,7 +191,12 @@ public:
void revert(); // full revert, thread safe, calls doInit
void revertAllDevices(); // convenience function, calls revertDevice
void revertDevice( Device* dev ); // rescans a single Device and updates DeviceInfo
/** @brief rescans a single Device and updates DeviceInfo
*
* When @p individualRevert is true, calls refreshAfterModelChange(),
* used to reduce number of refreshes when calling revertAllDevices().
*/
void revertDevice( Device* dev, bool individualRevert=true );
void asyncRevertDevice( Device* dev, std::function< void() > callback ); //like revertDevice, but asynchronous
void clearJobs(); // only clear jobs, the Device* states are preserved

View File

@ -53,7 +53,7 @@ PartitionLayout::addEntry( PartitionLayout::PartitionEntry entry )
}
static double
parseSizeString( QString sizeString, PartitionLayout::SizeUnit *unit )
parseSizeString( const QString& sizeString, PartitionLayout::SizeUnit* unit )
{
double value;
bool ok;
@ -102,35 +102,32 @@ parseSizeString( QString sizeString, PartitionLayout::SizeUnit *unit )
return value;
}
void
PartitionLayout::addEntry( QString mountPoint, QString size, QString min )
PartitionLayout::PartitionEntry::PartitionEntry(const QString& size, const QString& min)
{
PartitionLayout::PartitionEntry entry;
partSize = parseSizeString( size , &partSizeUnit );
if ( !min.isEmpty() )
partMinSize = parseSizeString( min , &partMinSizeUnit );
}
void
PartitionLayout::addEntry( const QString& mountPoint, const QString& size, const QString& min )
{
PartitionLayout::PartitionEntry entry( size, min );
entry.partMountPoint = mountPoint;
entry.partFileSystem = FileSystem::Ext4;
entry.partSize = parseSizeString( size , &entry.partSizeUnit );
if (min.isEmpty())
entry.partMinSize = 0;
else
entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit );
partLayout.append( entry );
}
void
PartitionLayout::addEntry( QString label, QString mountPoint, QString fs, QString size, QString min )
PartitionLayout::addEntry( const QString& label, const QString& mountPoint, const QString& fs, const QString& size, const QString& min )
{
PartitionLayout::PartitionEntry entry;
PartitionLayout::PartitionEntry entry( size, min );
entry.partLabel = label;
entry.partMountPoint = mountPoint;
entry.partFileSystem = FileSystem::typeForName( fs );
entry.partSize = parseSizeString( size , &entry.partSizeUnit );
if (min.isEmpty())
entry.partMinSize = 0;
else
entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit );
partLayout.append( entry );
}

View File

@ -1,6 +1,7 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2018, Collabora Ltd
* Copyright 2019, Adriaan de Groot <groot@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -47,11 +48,16 @@ public:
{
QString partLabel;
QString partMountPoint;
int partFileSystem;
double partSize;
SizeUnit partSizeUnit;
double partMinSize;
SizeUnit partMinSizeUnit;
int partFileSystem = 0;
double partSize = 0.0L;
SizeUnit partSizeUnit = Percent;
double partMinSize = 0.0L;
SizeUnit partMinSizeUnit = Percent;
/// @brief All-zeroes PartitionEntry
PartitionEntry() {};
/// @brief Parse @p size and @p min to their respective member variables
PartitionEntry( const QString& size, const QString& min );
};
PartitionLayout();
@ -60,8 +66,8 @@ public:
~PartitionLayout();
void addEntry( PartitionEntry entry );
void addEntry( QString mountPoint, QString size, QString min = "" );
void addEntry( QString label, QString mountPoint, QString fs, QString size, QString min = "" );
void addEntry( const QString& mountPoint, const QString& size, const QString& min = QString() );
void addEntry( const QString& label, const QString& mountPoint, const QString& fs, const QString& size, const QString& min = QString() );
/**
* @brief Apply the current partition layout to the selected drive space.

View File

@ -107,9 +107,9 @@ ChoicePage::ChoicePage( const SwapChoiceSet& swapChoices, QWidget* parent )
, m_bootloaderComboBox( nullptr )
, m_lastSelectedDeviceIndex( -1 )
, m_enableEncryptionWidget( true )
, m_allowManualPartitioning( true )
, m_availableSwapChoices( swapChoices )
, m_eraseSwapChoice( pickOne( swapChoices ) )
, m_allowManualPartitioning( true )
{
setupUi( this );
@ -1246,6 +1246,7 @@ ChoicePage::setupActions()
if ( osproberEntriesForCurrentDevice.count() == 0 )
{
CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 0 osprober entries";
m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. "
"What would you like to do?<br/>"
"You will be able to review and confirm your choices "
@ -1278,6 +1279,7 @@ ChoicePage::setupActions()
if ( !osName.isEmpty() )
{
CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 1 non-empty osprober entry";
m_messageLabel->setText( tr( "This storage device has %1 on it. "
"What would you like to do?<br/>"
"You will be able to review and confirm your choices "
@ -1301,6 +1303,7 @@ ChoicePage::setupActions()
else
{
CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for 1 empty osprober entry";
m_messageLabel->setText( tr( "This storage device already has an operating system on it. "
"What would you like to do?<br/>"
"You will be able to review and confirm your choices "
@ -1325,6 +1328,8 @@ ChoicePage::setupActions()
// osproberEntriesForCurrentDevice has at least 2 items.
CALAMARES_RETRANSLATE(
cDebug() << "Setting texts for >= 2 osprober entries";
m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. "
"What would you like to do?<br/>"
"You will be able to review and confirm your choices "

View File

@ -165,9 +165,13 @@ PartitionPage::updateButtons()
if ( m_ui->deviceComboBox->currentIndex() >= 0 )
{
Device* device = nullptr;
QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 );
auto device = m_core->deviceModel()->deviceForIndex( deviceIndex );
if ( device->type() != Device::Type::LVM_Device )
if ( deviceIndex.isValid() )
device = m_core->deviceModel()->deviceForIndex( deviceIndex );
if ( !device )
cWarning() << "Device for updateButtons is nullptr";
else if ( device->type() != Device::Type::LVM_Device )
{
createTable = true;
@ -577,7 +581,7 @@ void
PartitionPage::onPartitionModelReset()
{
m_ui->partitionTreeView->expandAll();
updateButtons();
// updateButtons();
updateBootLoaderIndex();
}

View File

@ -538,7 +538,7 @@ findFS( QString defaultFS )
// This bit is for distro's debugging their settings, and shows
// all the strings that KPMCore is matching against for FS type.
{
Logger::CLog d( Logger::LOGDEBUG );
Logger::CDebug d;
using TR = Logger::DebugRow< int, QString >;
const auto fstypes = FileSystem::types();
d << "Available types (" << fstypes.count() << ')';
@ -612,6 +612,18 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap )
else
choices.insert( PartitionActions::Choices::SwapChoice::SmallSwap );
}
// Not all are supported right now // FIXME
static const char unsupportedSetting[] = "Partition-module does not support *userSwapChoices* setting";
#define COMPLAIN_UNSUPPORTED(x) \
if ( choices.contains( x ) ) \
{ cWarning() << unsupportedSetting << PartitionActions::Choices::choiceToName( x ); choices.remove( x ); }
COMPLAIN_UNSUPPORTED( PartitionActions::Choices::SwapChoice::SwapFile )
COMPLAIN_UNSUPPORTED( PartitionActions::Choices::SwapChoice::ReuseSwap )
#undef COMPLAIN_UNSUPPORTED
m_swapChoices = choices;
// These gs settings seem to be unused (in upstream Calamares) outside of

View File

@ -96,7 +96,7 @@ mapForPartition( Partition* partition, const QString& uuid )
// Debugging for inside the loop in createPartitionList(),
// so indent a bit
Logger::CLog deb = cDebug();
Logger::CDebug deb;
using TR = Logger::DebugRow<const char *const, const QString&>;
deb << " .. mapping for" << partition->partitionPath() << partition->deviceNode()
<< TR( "mtpoint:", PartitionInfo::mountPoint( partition ) )