diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index c166390e8..b9b2109a3 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -34,6 +34,7 @@ if ( KPMcore_FOUND ) core/PartitionCoreModule.cpp core/PartitionInfo.cpp core/PartitionIterator.cpp + core/PartitionLayout.cpp core/PartitionModel.cpp core/PartUtils.cpp gui/BootInfoWidget.cpp diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp new file mode 100644 index 000000000..02ec29526 --- /dev/null +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -0,0 +1,115 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Collabora Ltd + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "core/PartitionLayout.h" + +#include + +PartitionLayout::PartitionLayout() +{ +} + +PartitionLayout::PartitionLayout( PartitionLayout::PartitionEntry entry ) +{ + partLayout.append( entry ); +} + +PartitionLayout::PartitionLayout( const PartitionLayout& layout ) + : partLayout( layout.partLayout ) +{ +} + +PartitionLayout::~PartitionLayout() +{ +} + +void +PartitionLayout::addEntry( PartitionLayout::PartitionEntry entry ) +{ + partLayout.append( entry ); +} + +static double +parseSizeString( QString sizeString, PartitionLayout::SizeUnit *unit ) +{ + double value; + bool ok; + + QRegExp rx( "[KkMmGg%]" ); + int pos = rx.indexIn( sizeString ); + QString valueString = sizeString.mid( 0, pos ); + QString unitString = sizeString.mid( pos ); + + value = valueString.toDouble( &ok ); + if ( !ok ) + { + /* + * In case the conversion fails, a size of 100% allows a few cases to pass + * anyway (e.g. when it is the last partition of the layout) + */ + *unit = PartitionLayout::SizeUnit::Percent; + return 100; + } + + if ( unitString.length() > 0 ) + { + if ( unitString.at(0) == '%' ) + *unit = PartitionLayout::SizeUnit::Percent; + else if ( unitString.at(0).toUpper() == 'K' ) + *unit = PartitionLayout::SizeUnit::KiB; + else if ( unitString.at(0).toUpper() == 'M' ) + *unit = PartitionLayout::SizeUnit::MiB; + else if ( unitString.at(0).toUpper() == 'G' ) + *unit = PartitionLayout::SizeUnit::GiB; + else + *unit = PartitionLayout::SizeUnit::Byte; + } + else + { + *unit = PartitionLayout::SizeUnit::Byte; + } + + return value; +} + +void +PartitionLayout::addEntry( QString mountPoint, QString size, QString min ) +{ + PartitionLayout::PartitionEntry entry; + + entry.partMountPoint = mountPoint; + entry.partFileSystem = FileSystem::Ext4; + entry.partSize = parseSizeString( size , &entry.partSizeUnit ); + entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit ); + + partLayout.append( entry ); +} + +void +PartitionLayout::addEntry( QString label, QString mountPoint, QString fs, QString size, QString min ) +{ + PartitionLayout::PartitionEntry entry; + + entry.partLabel = label; + entry.partMountPoint = mountPoint; + entry.partFileSystem = FileSystem::typeForName( fs ); + entry.partSize = parseSizeString( size , &entry.partSizeUnit ); + entry.partMinSize = parseSizeString( min , &entry.partMinSizeUnit ); + + partLayout.append( entry ); +} diff --git a/src/modules/partition/core/PartitionLayout.h b/src/modules/partition/core/PartitionLayout.h new file mode 100644 index 000000000..eadb8b012 --- /dev/null +++ b/src/modules/partition/core/PartitionLayout.h @@ -0,0 +1,70 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Collabora Ltd + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PARTITIONLAYOUT_H +#define PARTITIONLAYOUT_H + +#include "Typedefs.h" + +// KPMcore +#include + +// Qt +#include +#include + +class Partition; + +class PartitionLayout +{ +public: + + enum SizeUnit + { + Percent = 0, + Byte, + KiB, + MiB, + GiB + }; + + struct PartitionEntry + { + QString partLabel; + QString partMountPoint; + int partFileSystem; + double partSize; + SizeUnit partSizeUnit; + double partMinSize; + SizeUnit partMinSizeUnit; + }; + + PartitionLayout(); + PartitionLayout( PartitionEntry entry ); + PartitionLayout( const PartitionLayout& layout ); + ~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 = "" ); + +private: + QList< PartitionEntry > partLayout; +}; + +#endif /* PARTITIONLAYOUT_H */ diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 229ffc32c..1c5ece8f8 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -77,3 +77,30 @@ defaultFileSystemType: "ext4" # # If nothing is specified, LUKS is enabled in automated modes. #enableLuksAutomatedPartitioning: true + +# To apply a custom partition layout, it has to be defined this way : +# +# partitionLayout: +# - name: "rootfs" +# filesystem: "ext4" +# mountPoint: "/" +# size: 20% +# minSize: 500M +# - name: "home" +# filesystem: "ext4" +# mountPoint: "/home" +# size: 3G +# minSize: 1.5G +# - name: "data" +# filesystem: "fat32" +# mountPoint: "/data" +# size: 100% +# +# There can be any number of partitions, each entry having the following attributes: +# - name: partition label +# - filesystem: filesystem type +# - mountPoint: partition mount point +# - size: partition size in bytes (append 'K', 'M' or 'G' for KiB, MiB or GiB) +# or +# % of the available drive space if a '%' is appended to the value +# - minSize: minimum partition size (optional parameter)