From 7fd0ad57956f55176df610e91617eda1676f84e7 Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Mon, 13 Aug 2018 09:51:35 -0300 Subject: [PATCH 01/54] [partition] Disabling partition buttons for inactive RAID. --- src/modules/partition/gui/PartitionPage.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 994adc3e8..f23eecd6e 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -4,6 +4,7 @@ * Copyright 2015-2016, Teo Mrnjavac * Copyright 2018, Adriaan de Groot * Copyright 2018, Andrius Štikonas + * Copyright 2018, Caio Jordão Carvalho * * 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,6 +48,7 @@ // KPMcore #include #include +#include #include #include @@ -146,6 +148,7 @@ PartitionPage::updateButtons() bool isInVG = m_core->isInVG( partition ); create = isFree; + // Keep it simple for now: do not support editing extended partitions as // it does not work with our current edit implementation which is // actually remove + add. This would not work with extended partitions @@ -160,8 +163,17 @@ PartitionPage::updateButtons() if ( m_ui->deviceComboBox->currentIndex() >= 0 ) { QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); - if ( m_core->deviceModel()->deviceForIndex( deviceIndex )->type() != Device::Type::LVM_Device ) + auto device = m_core->deviceModel()->deviceForIndex( deviceIndex ); + if ( device->type() != Device::Type::LVM_Device ) + { createTable = true; + + if ( device->type() == Device::Type::SoftwareRAID_Device && + static_cast< SoftwareRAID* >(device)->status() == SoftwareRAID::Status::Inactive ) { + createTable = false; + create = false; + } + } else { currentDeviceIsVG = true; From b5a2a5bbdd8020fd4f9663c02a5382ea9d74a4ef Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Mon, 13 Aug 2018 12:26:00 -0300 Subject: [PATCH 02/54] [partition] Don't show erase button for inactive RAID. --- src/modules/partition/gui/ChoicePage.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index bef6e4966..17f0a95ea 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -1182,6 +1183,11 @@ ChoicePage::setupActions() bool atLeastOneCanBeResized = false; bool atLeastOneCanBeReplaced = false; bool atLeastOneIsMounted = false; // Suppress 'erase' if so + bool isInactiveRAID = false; + + if ( currentDevice->type() == Device::Type::SoftwareRAID_Device && + static_cast< SoftwareRAID* >(currentDevice)->status() == SoftwareRAID::Status::Inactive ) + isInactiveRAID = true; for ( auto it = PartitionIterator::begin( currentDevice ); it != PartitionIterator::end( currentDevice ); ++it ) @@ -1305,7 +1311,7 @@ ChoicePage::setupActions() else force_uncheck( m_grp, m_alongsideButton ); - if ( !atLeastOneIsMounted ) + if ( !atLeastOneIsMounted && !isInactiveRAID ) m_eraseButton->show(); // None mounted else force_uncheck( m_grp, m_eraseButton ); From 01a972c6ea6704c1c2f0f252f7ff4c2296029e07 Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Mon, 13 Aug 2018 13:05:41 -0300 Subject: [PATCH 03/54] [partition] Fixing LVM LV name line edit visibility. --- src/modules/partition/gui/CreatePartitionDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp index 0e7602c08..7823d743d 100644 --- a/src/modules/partition/gui/CreatePartitionDialog.cpp +++ b/src/modules/partition/gui/CreatePartitionDialog.cpp @@ -72,7 +72,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par m_ui->encryptWidget->setText( tr( "En&crypt" ) ); m_ui->encryptWidget->hide(); - if (m_device->type() == Device::Type::Disk_Device) { + if (m_device->type() != Device::Type::LVM_Device) { m_ui->lvNameLabel->hide(); m_ui->lvNameLineEdit->hide(); } From 649a1407cb799d0ced273fa3f02f2402011cdd3b Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Wed, 12 Sep 2018 05:01:23 -0400 Subject: [PATCH 04/54] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_bg.ts | 154 ++++++++++++++++++++-------------------- lang/calamares_id.ts | 10 +-- lang/calamares_tr_TR.ts | 2 +- 3 files changed, 84 insertions(+), 82 deletions(-) diff --git a/lang/calamares_bg.ts b/lang/calamares_bg.ts index f9dc45c36..d75f03746 100644 --- a/lang/calamares_bg.ts +++ b/lang/calamares_bg.ts @@ -50,7 +50,7 @@ Blank Page - + Празна страница @@ -192,22 +192,22 @@ Calamares Initialization Failed - + Инициализацията на Calamares се провали %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + %1 не може да се инсталира. Calamares не можа да зареди всичките конфигурирани модули. Това е проблем с начина, по който Calamares е използван от дистрибуцията. <br/>The following modules could not be loaded: - + <br/>Следните модули не могат да се заредят: &Install - + &Инсталирай @@ -287,17 +287,17 @@ The installer will quit and all changes will be lost. unparseable Python error - неанализируема Python грешка + неанализируема грешка на Python unparseable Python traceback - неанализируемо Python проследяване + неанализируемо проследяване на Python Unfetchable Python error. - Недостъпна Python грешка. + Недостъпна грешка на Python. @@ -504,17 +504,17 @@ The installer will quit and all changes will be lost. Could not run command. - + Командата не може да се изпълни. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Командата се изпълнява в средата на хоста и трябва да установи местоположението на основния дял, но rootMountPoint не е определен. The command needs to know the user's name, but no username is defined. - + Командата трябва да установи потребителското име на профила, но такова не е определено. @@ -522,7 +522,7 @@ The installer will quit and all changes will be lost. Contextual Processes Job - + Задача с контекстуални процеси @@ -580,7 +580,7 @@ The installer will quit and all changes will be lost. En&crypt - En%crypt + Ши&фриране @@ -784,12 +784,12 @@ The installer will quit and all changes will be lost. Write LUKS configuration for Dracut to %1 - + Запиши LUKS конфигурация за Dracut на %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted - + Пропусни записването на LUKS конфигурация за Dracut: "/" дял не е шифриран @@ -939,7 +939,7 @@ The installer will quit and all changes will be lost. <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style=" font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>Когато тази опция е избрана, Вашата система ще се рестартира незабавно при натискане на <span style=" font-style:italic;">Готово</span> или при затваряне на инсталатора.</p></body></html> @@ -954,7 +954,7 @@ The installer will quit and all changes will be lost. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - + <h1>Инсталацията е неуспешна</h1><br/>%1 не е инсталиран на Вашия компютър.<br/>Съобщението с грешката е: %2. @@ -967,12 +967,12 @@ The installer will quit and all changes will be lost. Installation Complete - + Инсталацията е завършена The installation of %1 is complete. - + Инсталацията на %1 е завършена. @@ -1156,7 +1156,7 @@ The installer will quit and all changes will be lost. The numbers and dates locale will be set to %1. - + Форматът на цифрите и датата ще бъде %1. @@ -1214,12 +1214,12 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - + Мрежова инсталация. (Изключена: Списъкът с пакети не може да бъде извлечен, проверете Вашата Интернет връзка) Network Installation. (Disabled: Received invalid groups data) - + Мрежова инсталация. (Изключена: Получени са данни за невалидни групи) @@ -1250,12 +1250,12 @@ The installer will quit and all changes will be lost. Memory allocation error when setting '%1' - + Грешка при разпределяне на паметта по време на настройването на '%1' Memory allocation error - + Грешка при разпределяне на паметта @@ -1270,7 +1270,7 @@ The installer will quit and all changes will be lost. The password differs with case changes only - + Паролата се различава само със смяна на главни и малки букви @@ -1280,62 +1280,62 @@ The installer will quit and all changes will be lost. The password contains the user name in some form - + Паролата съдържа потребителското име под някаква форма The password contains words from the real name of the user in some form - + Паролата съдържа думи от истинското име на потребителя под някаква форма The password contains forbidden words in some form - + Паролата съдържа забранени думи под някаква форма The password contains less than %1 digits - + Паролата съдържа по-малко от %1 цифри The password contains too few digits - + Паролата съдържа твърде малко цифри The password contains less than %1 uppercase letters - + Паролата съдържа по-малко от %1 главни букви The password contains too few uppercase letters - + Паролата съдържа твърде малко главни букви The password contains less than %1 lowercase letters - + Паролата съдържа по-малко от %1 малки букви The password contains too few lowercase letters - + Паролата съдържа твърде малко малки букви The password contains less than %1 non-alphanumeric characters - + Паролата съдържа по-малко от %1 знаци, които не са букви или цифри The password contains too few non-alphanumeric characters - + Паролата съдържа твърде малко знаци, които не са букви или цифри The password is shorter than %1 characters - + Паролата е по-малка от %1 знаци @@ -1345,47 +1345,47 @@ The installer will quit and all changes will be lost. The password is just rotated old one - + Паролата е обърнат вариант на старата The password contains less than %1 character classes - + Паролата съдържа по-малко от %1 видове знаци The password does not contain enough character classes - + Паролата не съдържа достатъчно видове знаци The password contains more than %1 same characters consecutively - + Паролата съдържа повече от %1 еднакви знаци последователно The password contains too many same characters consecutively - + Паролата съдържа твърде много еднакви знаци последователно The password contains more than %1 characters of the same class consecutively - + Паролата съдържа повече от %1 еднакви видове знаци последователно The password contains too many characters of the same class consecutively - + Паролата съдържа твърде много еднакви видове знаци последователно The password contains monotonic sequence longer than %1 characters - + Паролата съдържа монотонна последователност, по-дълга от %1 знаци The password contains too long of a monotonic character sequence - + Паролата съдържа твърде дълга монотонна последователност от знаци @@ -1395,77 +1395,77 @@ The installer will quit and all changes will be lost. Cannot obtain random numbers from the RNG device - + Получаването на произволни числа от RNG устройството е неуспешно Password generation failed - required entropy too low for settings - + Генерирането на парола е неуспешно - необходимата ентропия е твърде ниска за настройки The password fails the dictionary check - %1 - + Паролата не издържа проверката на речника - %1 The password fails the dictionary check - + Паролата не издържа проверката на речника Unknown setting - %1 - + Неизвестна настройка - %1 Unknown setting - + Неизвестна настройка Bad integer value of setting - %1 - + Невалидна числена стойност на настройката - %1 Bad integer value - + Невалидна числена стойност на настройката Setting %1 is not of integer type - + Настройката %1 не е от числов вид Setting is not of integer type - + Настройката не е от числов вид Setting %1 is not of string type - + Настройката %1 не е от текстов вид Setting is not of string type - + Настройката не е от текстов вид Opening the configuration file failed - + Отварянето на файла с конфигурацията е неуспешно The configuration file is malformed - + Файлът с конфигурацията е деформиран Fatal failure - + Фатална повреда @@ -1664,7 +1664,7 @@ The installer will quit and all changes will be lost. Cre&ate - + Съз&дай @@ -1689,12 +1689,12 @@ The installer will quit and all changes will be lost. Can not create new partition - + Не може да се създаде нов дял The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - + Таблицата на дяловете на %1 вече има %2 главни дялове, повече не може да се добавят. Моля, премахнете един главен дял и добавете разширен дял, на негово място. @@ -1787,7 +1787,7 @@ The installer will quit and all changes will be lost. Boot partition not encrypted - + Липсва криптиране на дял за начално зареждане @@ -1819,7 +1819,7 @@ The installer will quit and all changes will be lost. Placeholder - + Заместител @@ -1866,7 +1866,9 @@ There was no output from the command. Output: - + +Резултат: + @@ -2088,7 +2090,7 @@ Output: The screen is too small to display the installer. - + Екранът е твърде малък за инсталатора. @@ -2290,7 +2292,7 @@ Output: rootMountPoint is %1 - root точка на монтиране е %1 + rootMountPoint е %1 @@ -2328,7 +2330,7 @@ Output: Bad path: %1 - Лош път: %1 + Невалиден път: %1 @@ -2365,7 +2367,7 @@ Output: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2446,7 +2448,7 @@ Output: Placeholder - + Заместител @@ -2458,7 +2460,7 @@ Output: TextLabel - + TextLabel @@ -2498,7 +2500,7 @@ Output: Feedback - + Обратна връзка @@ -2583,7 +2585,7 @@ Output: <h1>Welcome to the Calamares installer for %1.</h1> - + <h1>Добре дошли при инсталатора Calamares на %1.</h1> @@ -2593,7 +2595,7 @@ Output: <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>за %3</strong><br/><br/>Авторско право 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Авторско право 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Благодарности към: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg и <a href="https://www.transifex.com/calamares/calamares/">преводачите на Calamares</a>.<br/><br/>Разработката на <a href="https://calamares.io/">Calamares</a> е спонсорирана от <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. diff --git a/lang/calamares_id.ts b/lang/calamares_id.ts index 194f9f004..5dfe06b9e 100644 --- a/lang/calamares_id.ts +++ b/lang/calamares_id.ts @@ -50,7 +50,7 @@ Blank Page - + Halaman Kosong @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Inisialisasi Calamares Gagal %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + %1 tidak dapat terpasang. Calamares tidak dapat memuat seluruh modul konfigurasi. Terdapat masalah dengan Calamares karena sedang digunakan oleh distribusi. <br/>The following modules could not be loaded: - + <br/>Modul berikut tidak dapat dimuat. @@ -1665,7 +1665,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Cre&ate - + Mem&buat diff --git a/lang/calamares_tr_TR.ts b/lang/calamares_tr_TR.ts index 11476558b..7acd733f0 100644 --- a/lang/calamares_tr_TR.ts +++ b/lang/calamares_tr_TR.ts @@ -1696,7 +1696,7 @@ Kuruluma devam edebilirsiniz fakat bazı özellikler devre dışı kalabilir. The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - % 1 üzerindeki bölüm tablosu zaten% 2 birincil bölüme sahip ve artık eklenemiyor. Lütfen bir birincil bölümü kaldırın ve bunun yerine genişletilmiş bir bölüm ekleyin. + %1 üzerindeki disk bölümü tablosu zaten %2 birincil disk bölümüne sahip ve artık eklenemiyor. Lütfen bir birincil disk bölümü kaldırın ve bunun yerine uzatılmış bir disk bölümü ekleyin. From 9055a55e23e2731768f79476b7afaac2c52e5c01 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Wed, 12 Sep 2018 05:01:23 -0400 Subject: [PATCH 05/54] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calamares.desktop b/calamares.desktop index 5b73cecf3..3cdce6888 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -21,7 +21,7 @@ Name[be]=Усталяваць сістэму Icon[bg]=calamares GenericName[bg]=Системен Инсталатор Comment[bg]=Calamares — Системен Инсталатор -Name[bg]=Инсталирай система +Name[bg]=Инсталирай системата Icon[ca]=calamares GenericName[ca]=Instal·lador de sistema Comment[ca]=Calamares — Instal·lador de sistema From 5291072cbca30ea53c22362b1a7818a7ffd75413 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Wed, 12 Sep 2018 05:01:25 -0400 Subject: [PATCH 06/54] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/bg/LC_MESSAGES/dummypythonqt.mo | Bin 585 -> 1099 bytes .../lang/bg/LC_MESSAGES/dummypythonqt.po | 10 +++++----- .../lang/tr_TR/LC_MESSAGES/dummypythonqt.mo | Bin 997 -> 982 bytes .../lang/tr_TR/LC_MESSAGES/dummypythonqt.po | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.mo index 348cc26294c8cb7f4ad5b1d04b0a3c36757650f5..a0e18658239166305fff5dcecc7d58ea6501b460 100644 GIT binary patch delta 685 zcmb7=zb`{k6vuC=U!jIZ7#L1XNZPcClynm&F=&* z(v}w`bQQ6jw;K94m`%R7jiy6G+`P~Io*(zTbI*OVzISFScI$<}>HtF^0J^~mkgEi2 z;1P^~SI`AM!2tLI{lIP!!V4XR-hx%o3%{pTh!yA{v=5qw4nxnNV?t!a9gGM96)0+| zs|7n;VXe9Ky&aakXq${oQA|yee@+Ri5f?m7SM-ENQB~8FO_es{yEK!CMpHDO(nIl> zU#Ho4&?TlL;k9j?atN7K8q!N)HMyXxJ0cKLo0K9P)(D^8H0>f;wqEVH6%Uf8q%zd0LB0n_wb$ zh;vWyOI(xzSovxd-@`eA^E0SR@MSe$GPCk8#LsLv1mDzukSWT(^#ZDo-f-rRCW5aq bK~dhp_|M%)w($HuhZa&Bu%_uVW!iI}Y7j|51ys-De4uuPQE^Jj~006n%BQO8} diff --git a/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.po index 011a2294f..9a404c31a 100644 --- a/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/bg/LC_MESSAGES/dummypythonqt.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-07 18:58+0100\n" +"POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Georgi Georgiev , 2018\n" "Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n" @@ -28,16 +28,16 @@ msgstr "Нов QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "" +msgstr "Фиктивен PythonQt ViewStep" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" -msgstr "" +msgstr "Фиктивната задача PythonQt" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" -msgstr "" +msgstr "Това е фиктивната задача PythonQt. Фиктивната задача заявява: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." -msgstr "" +msgstr "Съобщение за състоянието на фиктивната задача PythonQt." diff --git a/src/modules/dummypythonqt/lang/tr_TR/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/tr_TR/LC_MESSAGES/dummypythonqt.mo index 57e8ac336a81599713f72037dedeced41d905e6a..6d0fa216869f1c784bc91d70ae934b332f6f25f4 100644 GIT binary patch delta 87 zcmaFLevN%Xi0Kwa28IM67GPjt5M^dyFa^?TK$;Io#{g+*Ae{}Q#ej4>kTwU>^EP&B dGxD108d@kAm|K~c=^B_!KFH{@S%m2#BLFFC4jBLd delta 102 zcmcb{{*-+}i0NTQ28IM67GPjtP+?|ZFa^@4K$;IoX9H, 2016\n" +"Last-Translator: Demiray Muhterem , 2016\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" From 94c244eef8b098bb33f3eb2244bafb399f8d14ee Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Wed, 12 Sep 2018 05:01:25 -0400 Subject: [PATCH 07/54] i18n: [python] Automatic merge of Transifex translations --- lang/python/bg/LC_MESSAGES/python.mo | Bin 894 -> 1371 bytes lang/python/bg/LC_MESSAGES/python.po | 10 +++++----- lang/python/tr_TR/LC_MESSAGES/python.mo | Bin 1192 -> 1177 bytes lang/python/tr_TR/LC_MESSAGES/python.po | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lang/python/bg/LC_MESSAGES/python.mo b/lang/python/bg/LC_MESSAGES/python.mo index f646fe6c351cae23c71cd30292ad61e924fd4c07..3198676e176cc2ee5099b14ef4aafc1643acc9a9 100644 GIT binary patch delta 626 zcmZ{f%_{_99LFClmU8fRTia7w?S>^O?zT9(xXSF#U@$YAnLTXU##<>T+fq(0T*P5k zHf!0H@(29p!a<3Pe?YGCeReiU`PKLNJkRg_`D%J@wO=}X2MpE%1t1w}gU%sguTVSm z26aInHTvs3e-Ahc-w@aj%HS}#2X=$^;2HD;h49{LU~B+91%r&)>=BnfI6lER81OL` z18r~?d;rJ5-bTjIgZZI)NSIi<8A9mCkX|*kV@=`~OKDn~C)3uVq4Omp9{ueJ>fE%H zBwx$0NkvyyB}?I&lvq@CWl)u)+2mCJ^s13iOjFetcv4C%OACt0!=Z4(NaC$e~Me+#Ni;?V^nS zX1N>grn^gbR1zhkuJ#cuOgSpRRdCm-2sw29dv!*KR2Jn3+)y!hT%VaZqI@+mPZjtt z5J9=u79$)CDTocB!hc`P1smqZX&;ksse%C_-J9)hixn`dg3ewKcLNu(g2*mL**AAW B;voP4 delta 157 zcmcc3^^dLoo)F7a1|VPoVi_Q|0b*7ljsap2C;(zXAT9)A6CiE|Vgn%F0mQ2r85mvy zX*D38%EZ8s1f=%>={O)Q&&A!85P8BrzvPp&&6iJ28E-HlyX_ Z35# X!4^o{0cjZ^U9)lJWya0jOtMS>JRuDi delta 100 zcmbQqxq@>-itAxU28QcEEXcsXFq@fyK?F#z1=5m0`Vf#70Md7Wv@wu=3#7Gyv?2=w ngDsHu1=2D=x_jfw%Zz-F8s?Og=Hz51<|RIAn7g@}Nsb8sXQ~wR diff --git a/lang/python/tr_TR/LC_MESSAGES/python.po b/lang/python/tr_TR/LC_MESSAGES/python.po index cfcb8b328..4b2baad96 100644 --- a/lang/python/tr_TR/LC_MESSAGES/python.po +++ b/lang/python/tr_TR/LC_MESSAGES/python.po @@ -10,7 +10,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Demiray “tulliana” Muhterem , 2017\n" +"Last-Translator: Demiray Muhterem , 2017\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" From f6aaa4b73a3eb74f454eb75ef4570f8631be8350 Mon Sep 17 00:00:00 2001 From: Alf Gaida Date: Thu, 13 Sep 2018 17:16:35 +0200 Subject: [PATCH 08/54] .gitattributes sorted and completed --- .gitattributes | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.gitattributes b/.gitattributes index d7a0364e1..772fc7ad3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,13 @@ -.tx/* export-ignore -hacking/* export-ignore -HACKING.md export-ignore -.editorconfig export-ignore -src/modules/testmodule.py export-ignore +.editorconfig export-ignore +.gitattributes export-ignore +.github export-ignore +.gitignore export-ignore +.gitmodules export-ignore +.travis.yml export-ignore +.tx export-ignore + +hacking export-ignore +HACKING.md export-ignore +src/modules/testmodule.py export-ignore src/modules/globalStorage.yaml export-ignore + From 82c51dec370521d50e7452508057d5c819f6ecd3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 05:33:04 -0400 Subject: [PATCH 09/54] CMake: don't change cmake logging on release builds - There is no real need to reduce the logging on release builds, it's just confusing that all the cmake-time output changes in a non-meaningful way. --- .../CalamaresAddBrandingSubdirectory.cmake | 6 +-- .../CalamaresAddModuleSubdirectory.cmake | 20 +++++----- CMakeModules/CalamaresAddPlugin.cmake | 39 +++++++++---------- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake index f4eb349f2..78330e245 100644 --- a/CMakeModules/CalamaresAddBrandingSubdirectory.cmake +++ b/CMakeModules/CalamaresAddBrandingSubdirectory.cmake @@ -79,10 +79,8 @@ function( calamares_add_branding NAME ) endforeach() message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} branding component: ${BoldRed}${NAME}${ColorReset}" ) - if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) - message( " ${Green}TYPE:${ColorReset} branding component" ) - message( " ${Green}BRANDING_COMPONENT_DESTINATION:${ColorReset} ${BRANDING_COMPONENT_DESTINATION}" ) - endif() + message( " ${Green}TYPE:${ColorReset} branding component" ) + message( " ${Green}BRANDING_COMPONENT_DESTINATION:${ColorReset} ${BRANDING_COMPONENT_DESTINATION}" ) endfunction() # Usage calamares_add_branding_translations( [DIRECTORY ]) diff --git a/CMakeModules/CalamaresAddModuleSubdirectory.cmake b/CMakeModules/CalamaresAddModuleSubdirectory.cmake index 0b417bdf3..74ff640d9 100644 --- a/CMakeModules/CalamaresAddModuleSubdirectory.cmake +++ b/CMakeModules/CalamaresAddModuleSubdirectory.cmake @@ -99,19 +99,17 @@ function( calamares_add_module_subdirectory ) endforeach() message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) - if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) - message( " ${Green}TYPE:${ColorReset} jobmodule" ) - message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) - if( MODULE_CONFIG_FILES ) - if ( INSTALL_CONFIG ) - set( _destination "${MODULE_DATA_DESTINATION}" ) - else() - set( _destination "[Build directory only]" ) - endif() - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${_destination}" ) + message( " ${Green}TYPE:${ColorReset} jobmodule" ) + message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) + if( MODULE_CONFIG_FILES ) + if ( INSTALL_CONFIG ) + set( _destination "${MODULE_DATA_DESTINATION}" ) + else() + set( _destination "[Build directory only]" ) endif() - message( "" ) + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${_destination}" ) endif() + message( "" ) # We copy over the lang directory, if any if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) install_calamares_gettext_translations( diff --git a/CMakeModules/CalamaresAddPlugin.cmake b/CMakeModules/CalamaresAddPlugin.cmake index 1bf20e4ca..886501a56 100644 --- a/CMakeModules/CalamaresAddPlugin.cmake +++ b/CMakeModules/CalamaresAddPlugin.cmake @@ -62,28 +62,27 @@ function( calamares_add_plugin ) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${PLUGIN_NAME}${ColorReset}" ) - if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" ) - message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" ) - message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" ) - message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) - message( " ${Green}PLUGIN_DESTINATION:${ColorReset} ${PLUGIN_DESTINATION}" ) - if( PLUGIN_CONFIG_FILES ) - set( _destination "(unknown)" ) - if ( INSTALL_CONFIG AND NOT PLUGIN_NO_INSTALL ) - set( _destination "${PLUGIN_DATA_DESTINATION}" ) - elseif( NOT PLUGIN_NO_INSTALL ) - # Not INSTALL_CONFIG - set( _destination "[Build directory only]" ) - else() - set( _destination "[Skipping installation]" ) - endif() - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => ${_destination}" ) + message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" ) + message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" ) + message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) + message( " ${Green}PLUGIN_DESTINATION:${ColorReset} ${PLUGIN_DESTINATION}" ) + if( PLUGIN_CONFIG_FILES ) + set( _destination "(unknown)" ) + if ( INSTALL_CONFIG AND NOT PLUGIN_NO_INSTALL ) + set( _destination "${PLUGIN_DATA_DESTINATION}" ) + elseif( NOT PLUGIN_NO_INSTALL ) + # Not INSTALL_CONFIG + set( _destination "[Build directory only]" ) + else() + set( _destination "[Skipping installation]" ) endif() - if( PLUGIN_RESOURCES ) - message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" ) - endif() - message( "" ) + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => ${_destination}" ) endif() + if( PLUGIN_RESOURCES ) + message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" ) + endif() + message( "" ) + # create target name once for convenience set( target "calamares_${PLUGIN_TYPE}_${PLUGIN_NAME}" ) From 4d5eb90a04a175adb3d2e9493bd754cbdd4411f6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 07:56:18 -0400 Subject: [PATCH 10/54] [fsresize] Add new module fsresizer - Non-functional as yet, WIP - Intended for use on SBC images and similar, which need to resize the root partition to the size of the SD card they're on. FIXES #921 --- src/modules/fsresizer/CMakeLists.txt | 27 +++++++ src/modules/fsresizer/ResizeFSJob.cpp | 104 ++++++++++++++++++++++++++ src/modules/fsresizer/ResizeFSJob.h | 75 +++++++++++++++++++ src/modules/fsresizer/fsresizer.conf | 30 ++++++++ 4 files changed, 236 insertions(+) create mode 100644 src/modules/fsresizer/CMakeLists.txt create mode 100644 src/modules/fsresizer/ResizeFSJob.cpp create mode 100644 src/modules/fsresizer/ResizeFSJob.h create mode 100644 src/modules/fsresizer/fsresizer.conf diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt new file mode 100644 index 000000000..7d1760cc4 --- /dev/null +++ b/src/modules/fsresizer/CMakeLists.txt @@ -0,0 +1,27 @@ +find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) + +find_package( KPMcore 3.3 ) +find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore +find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore + +if ( KPMcore_FOUND ) + if ( KPMcore_VERSION VERSION_GREATER "3.3.0") + add_definitions(-DWITH_KPMCOREGT33) # kpmcore greater than 3.3 + endif() + + include_directories( ${KPMCORE_INCLUDE_DIR} ) + include_directories( ${PROJECT_BINARY_DIR}/src/libcalamares ) + + calamares_add_plugin( fsresizer + TYPE job + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + ResizeFSJob.cpp + LINK_PRIVATE_LIBRARIES + kpmcore + calamares + SHARED_LIB + ) +else() + calamares_skip_module( "fsresizer (missing suitable KPMcore)" ) +endif() diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp new file mode 100644 index 000000000..4a7b0da59 --- /dev/null +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -0,0 +1,104 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Adriaan de Groot + * + * 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 "ResizeFSJob.h" + +#include +#include +#include + +#include "CalamaresVersion.h" +#include "JobQueue.h" +#include "GlobalStorage.h" + +#include "utils/Logger.h" + +ResizeFSJob::RelativeSize::RelativeSize() + : m_unit( None ) + , m_value( 0 ) +{ +} + + +ResizeFSJob::RelativeSize::RelativeSize( const QString& s) + : m_unit( None ) + , m_value( 0 ) +{ + QString valuePart; + + if ( s.endsWith( '%' ) ) + { + valuePart = s.left( s.length() - 1 ); + m_unit = Percent; + } + if ( s.endsWith( "MiB" ) ) + { + valuePart = s.left( s.length() - 3 ); + m_unit = Absolute; + } + + if ( ( m_unit != None ) && !valuePart.isEmpty() ) + m_value = valuePart.toInt(); + + if ( !m_value ) + m_unit = None; +} + + +ResizeFSJob::ResizeFSJob( QObject* parent ) + : Calamares::CppJob( parent ) +{ +} + + +ResizeFSJob::~ResizeFSJob() +{ +} + + +QString +ResizeFSJob::prettyName() const +{ + return tr( "Resize Filesystem Job" ); +} + + +Calamares::JobResult +ResizeFSJob::exec() +{ + return Calamares::JobResult::ok(); +} + + +void +ResizeFSJob::setConfigurationMap( const QVariantMap& configurationMap ) +{ + m_fsname = configurationMap["fs"].toString(); + m_devicename = configurationMap["dev"].toString(); + + if ( m_fsname.isEmpty() && m_devicename.isEmpty() ) + { + cWarning() << "No fs or dev configured for resize."; + return; + } + + m_size = RelativeSize( configurationMap["size"].toString() ); + m_atleast = RelativeSize( configurationMap["atleast"].toString() ); +} + +CALAMARES_PLUGIN_FACTORY_DEFINITION( ResizeFSJobFactory, registerPlugin(); ) diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h new file mode 100644 index 000000000..681328f81 --- /dev/null +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -0,0 +1,75 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Adriaan de Groot + * + * 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 RESIZEFSJOB_H +#define RESIZEFSJOB_H + +#include +#include + +#include + +#include + +#include + +class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob +{ + Q_OBJECT + + class RelativeSize + { + public: + RelativeSize(); + RelativeSize( const QString& ); + + enum Unit + { + None, + Percent, + Absolute + }; + + quint64 value() const { return m_value; } + Unit unit() const { return m_unit; } + + private: + quint64 m_value; + Unit m_unit; + } ; + +public: + explicit ResizeFSJob( QObject* parent = nullptr ); + virtual ~ResizeFSJob() override; + + QString prettyName() const override; + + Calamares::JobResult exec() override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; + +private: + RelativeSize m_size; + RelativeSize m_atleast; + QString m_fsname; // Either this, or devicename, is set, not both + QString m_devicename; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( ResizeFSJobFactory ) + +#endif // RESIZEFSJOB_H diff --git a/src/modules/fsresizer/fsresizer.conf b/src/modules/fsresizer/fsresizer.conf new file mode 100644 index 000000000..1539a7751 --- /dev/null +++ b/src/modules/fsresizer/fsresizer.conf @@ -0,0 +1,30 @@ +# Module that resizes a single FS to fill the entire (rest) of +# a device. This is used in OEM situations where an image is +# flashed onto an SD card (or similar) and used to boot a device, +# after which the FS should expand to fill the SD card. +# +# Example: a distro produces a 6GiB large image that is +# written to an 8GiB SD card; the FS should expand to take +# advantage of the unused 2GiB. The FS should expand much +# more if the same image is written to a 16GiB card. +-- + +# Which FS needs to be grown? Choose one way to identify it: +# - *fs* names a mount point which should already be mounted +# in the system. +# - *dev* names a device +fs: / +# dev: /dev/mmcblk0p1 + +# How much of the total remaining space should the FS use? +# The only sensible amount is "all of it". The value is +# in percent, so set it to 100. Perhaps a fixed size is +# needed (that would be weird though, since you don't know +# how big the card is), use MiB as suffix in that case. +size: 100% + +# Resizing might not be worth it, though. Set the minimum +# that it must grow; if it cannot grow that much, the +# resizing is skipped. Can be in percentage or absolute +# size, as above. +atleast: 1000MiB From fa567f917af80653f4c5aaa35b994590a766f344 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 16:45:24 +0200 Subject: [PATCH 11/54] Changelog: explain new module --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 56526aad2..f4d86a0e2 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,11 @@ This release contains contributions from (alphabetically by first name): ## Modules ## + - New module *fsresizer* can be used to resize filesystems. It is intended + 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. + + # 3.2.2 (2018-09-04) # This release contains contributions from (alphabetically by first name): From cdfb55e5cf70c098c83245761bc79f84b4626f71 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 16:49:07 +0200 Subject: [PATCH 12/54] [fsresizer] Just right now it doesn't need KPMCore - Drop the dependency while developing the configuration parser part of the module and writing initial tests. --- src/modules/fsresizer/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index 7d1760cc4..5097c53b0 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -4,7 +4,7 @@ find_package( KPMcore 3.3 ) find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore -if ( KPMcore_FOUND ) +if ( 1 ) # KPMcore_FOUND ) if ( KPMcore_VERSION VERSION_GREATER "3.3.0") add_definitions(-DWITH_KPMCOREGT33) # kpmcore greater than 3.3 endif() @@ -18,7 +18,7 @@ if ( KPMcore_FOUND ) SOURCES ResizeFSJob.cpp LINK_PRIVATE_LIBRARIES - kpmcore + # kpmcore calamares SHARED_LIB ) From a81588190a161b7232690717db8ee6dcbffe8e9f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 16:51:09 +0200 Subject: [PATCH 13/54] [fsresizer] Simplify and make safer - Make RelativeSize public so we can use it in non-member functions - Make a template out of matching the string suffixes; this is safer because the length of the suffix can be computed at compile-time (+1 for the trailing NUL) rather than writing it out in boilerplate. --- src/modules/fsresizer/ResizeFSJob.cpp | 42 +++++++++++++++------------ src/modules/fsresizer/ResizeFSJob.h | 6 ++-- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 4a7b0da59..e10894c30 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -29,32 +29,36 @@ #include "utils/Logger.h" ResizeFSJob::RelativeSize::RelativeSize() - : m_unit( None ) - , m_value( 0 ) + : m_value( 0 ) + , m_unit( None ) { } -ResizeFSJob::RelativeSize::RelativeSize( const QString& s) - : m_unit( None ) - , m_value( 0 ) +template +void matchUnitSuffix( + const QString& s, + const char (&suffix)[N], + ResizeFSJob::RelativeSize::Unit matchedUnit, + int& value, + ResizeFSJob::RelativeSize::Unit& unit + ) { - QString valuePart; - - if ( s.endsWith( '%' ) ) + if ( s.endsWith( suffix ) ) { - valuePart = s.left( s.length() - 1 ); - m_unit = Percent; + value = s.left( s.length() - N + 1 ).toInt(); + unit = matchedUnit; } - if ( s.endsWith( "MiB" ) ) - { - valuePart = s.left( s.length() - 3 ); - m_unit = Absolute; - } - - if ( ( m_unit != None ) && !valuePart.isEmpty() ) - m_value = valuePart.toInt(); - +} + + +ResizeFSJob::RelativeSize::RelativeSize( const QString& s) + : m_value( 0 ) + , m_unit( None ) +{ + matchUnitSuffix( s, "%", Percent, m_value, m_unit ); + matchUnitSuffix( s, "MiB", Absolute, m_value, m_unit ); + if ( !m_value ) m_unit = None; } diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 681328f81..415d04c81 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -32,6 +32,7 @@ class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob { Q_OBJECT +public: class RelativeSize { public: @@ -45,15 +46,14 @@ class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob Absolute }; - quint64 value() const { return m_value; } + int value() const { return m_value; } Unit unit() const { return m_unit; } private: - quint64 m_value; + int m_value; Unit m_unit; } ; -public: explicit ResizeFSJob( QObject* parent = nullptr ); virtual ~ResizeFSJob() override; From a6c3899e10c28a366e6b27ae4b5bcce33f4a1e1f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 17:59:50 +0200 Subject: [PATCH 14/54] [fsresizer] Add tests - Test the parsing of configuration values, that it gets the right values when given correct(-ish) configurations. Doesn't test any situations with bad config. --- src/modules/fsresizer/CMakeLists.txt | 22 ++++- src/modules/fsresizer/Tests.cpp | 126 +++++++++++++++++++++++++++ src/modules/fsresizer/Tests.h | 39 +++++++++ 3 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 src/modules/fsresizer/Tests.cpp create mode 100644 src/modules/fsresizer/Tests.h diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index 5097c53b0..c3585bbcd 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE) - find_package( KPMcore 3.3 ) find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore @@ -22,6 +20,26 @@ if ( 1 ) # KPMcore_FOUND ) calamares SHARED_LIB ) + + if( ECM_FOUND ) + find_package( Qt5 COMPONENTS Test REQUIRED ) + include( ECMAddTests ) + + ecm_add_test( + Tests.cpp + TEST_NAME + fsresizertest + LINK_LIBRARIES + ${CALAMARES_LIBRARIES} + calamares + calamares_job_fsresizer # From above + ${YAMLCPP_LIBRARY} + Qt5::Core + Qt5::Test + ) + set_target_properties( fsresizertest PROPERTIES AUTOMOC TRUE ) + target_include_directories(fsresizertest PRIVATE /usr/local/include ) + endif() else() calamares_skip_module( "fsresizer (missing suitable KPMcore)" ) endif() diff --git a/src/modules/fsresizer/Tests.cpp b/src/modules/fsresizer/Tests.cpp new file mode 100644 index 000000000..255153fa2 --- /dev/null +++ b/src/modules/fsresizer/Tests.cpp @@ -0,0 +1,126 @@ +/* === This file is part of Calamares - === + * + * Copyright 2017-2018, Adriaan de Groot + * + * 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 "Tests.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" +#include "Settings.h" + +#include "utils/Logger.h" +#include "utils/YamlUtils.h" + +#include + +#include + +#include +#include + +#define private public +#include "ResizeFSJob.h" +#undef private + +QTEST_GUILESS_MAIN( FSResizerTests ) + +FSResizerTests::FSResizerTests() +{ +} + +FSResizerTests::~FSResizerTests() +{ +} + +void +FSResizerTests::initTestCase() +{ +} + +void FSResizerTests::testConfigurationRobust() +{ + ResizeFSJob j; + + // Empty config + j.setConfigurationMap( QVariantMap() ); + QVERIFY( j.m_fsname.isEmpty() ); + QVERIFY( j.m_devicename.isEmpty() ); + QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::None ); + QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None ); + + // Config is missing fs and dev, so it isn't valid + YAML::Node doc0 = YAML::Load( R"(--- +size: 100% +atleast: 600MiB +)" ); + j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() ); + QVERIFY( j.m_fsname.isEmpty() ); + QVERIFY( j.m_devicename.isEmpty() ); + QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::None ); + QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None ); + QCOMPARE( j.m_size.value(), 0 ); + QCOMPARE( j.m_atleast.value(), 0 ); +} + +void FSResizerTests::testConfigurationValues() +{ + ResizeFSJob j; + + // Check both + YAML::Node doc0 = YAML::Load( R"(--- +fs: / +size: 100% +atleast: 600MiB +)" ); + j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() ); + QVERIFY( !j.m_fsname.isEmpty() ); + QVERIFY( j.m_devicename.isEmpty() ); + QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Percent ); + QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::Absolute ); + QCOMPARE( j.m_size.value(), 100 ); + QCOMPARE( j.m_atleast.value(), 600 ); + + // Silly config + doc0 = YAML::Load( R"(--- +fs: / +dev: /dev/m00 +size: 72 MiB +atleast: 127 % +)" ); + j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() ); + QVERIFY( !j.m_fsname.isEmpty() ); + QVERIFY( !j.m_devicename.isEmpty() ); + QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Absolute ); + QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::Percent ); + QCOMPARE( j.m_size.value(), 72 ); + QCOMPARE( j.m_atleast.value(), 127 ); + + // Silly config + doc0 = YAML::Load( R"(--- +fs: / +# dev: /dev/m00 +size: 71MiB +# atleast: 127% +)" ); + j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() ); + QVERIFY( !j.m_fsname.isEmpty() ); + QVERIFY( j.m_devicename.isEmpty() ); + QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Absolute ); + QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None ); + QCOMPARE( j.m_size.value(), 71 ); + QCOMPARE( j.m_atleast.value(), 0 ); +} diff --git a/src/modules/fsresizer/Tests.h b/src/modules/fsresizer/Tests.h new file mode 100644 index 000000000..958c0e655 --- /dev/null +++ b/src/modules/fsresizer/Tests.h @@ -0,0 +1,39 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Adriaan de Groot + * + * 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 TESTS_H +#define TESTS_H + +#include + +class FSResizerTests : public QObject +{ + Q_OBJECT +public: + FSResizerTests(); + ~FSResizerTests() override; + +private Q_SLOTS: + void initTestCase(); + // Can handle missing values + void testConfigurationRobust(); + // Can parse % and MiB values + void testConfigurationValues(); +}; + +#endif From 4b87bb6f280507944dfc39f18e9ec1a21d7f9d82 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Sep 2018 18:07:09 +0200 Subject: [PATCH 15/54] Git: drop non-existent files from .gitattributes --- .gitattributes | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 772fc7ad3..3b8a7f1e8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,8 +6,6 @@ .travis.yml export-ignore .tx export-ignore -hacking export-ignore -HACKING.md export-ignore src/modules/testmodule.py export-ignore src/modules/globalStorage.yaml export-ignore From 745629b659997f15f272cc6bfa2d31ea7a3b284c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Sep 2018 06:58:18 -0400 Subject: [PATCH 16/54] [fsresizer] Turn on KPMCore requirement again --- src/modules/fsresizer/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index c3585bbcd..ae87de160 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -2,7 +2,7 @@ find_package( KPMcore 3.3 ) find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore -if ( 1 ) # KPMcore_FOUND ) +if ( KPMcore_FOUND ) if ( KPMcore_VERSION VERSION_GREATER "3.3.0") add_definitions(-DWITH_KPMCOREGT33) # kpmcore greater than 3.3 endif() @@ -16,7 +16,7 @@ if ( 1 ) # KPMcore_FOUND ) SOURCES ResizeFSJob.cpp LINK_PRIVATE_LIBRARIES - # kpmcore + kpmcore calamares SHARED_LIB ) From 40e031411c50e35ce54af3adc26c68e59fce9881 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 07:01:27 -0400 Subject: [PATCH 17/54] [calamares] Improve debug log in module test-loader --- src/calamares/testmain.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp index c22342f9a..86f971462 100644 --- a/src/calamares/testmain.cpp +++ b/src/calamares/testmain.cpp @@ -158,7 +158,7 @@ main( int argc, char* argv[] ) std::unique_ptr< Calamares::Settings > settings_p( new Calamares::Settings( QString(), true ) ); std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) ); - cDebug() << "Calamares test module-loader" << module.moduleName(); + cDebug() << "Calamares module-loader testing" << module.moduleName(); Calamares::Module* m = load_module( module ); if ( !m ) { @@ -175,13 +175,19 @@ main( int argc, char* argv[] ) return 1; } - cDebug() << "Module" << m->name() << m->typeString() << m->interfaceString(); + using TR = Logger::DebugRow; + cDebug() << "Module metadata" + << TR( "name", m->name() ) + << TR( "type", m->typeString() ) + << TR( "interface", m->interfaceString() ); + + cDebug() << "Job outputs:"; Calamares::JobList jobList = m->jobs(); unsigned int count = 1; for ( const auto& p : jobList ) { - cDebug() << count << p->prettyName(); + cDebug() << "Job #" << count << "name" << p->prettyName(); Calamares::JobResult r = p->exec(); if ( !r ) cDebug() << count << ".. failed" << r; From c6e8cdf65b2de2f148ee4e82817149848fd09326 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 07:07:17 -0400 Subject: [PATCH 18/54] [calamares] Better command-line help in module test-loader --- src/calamares/testmain.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp index 86f971462..8efdfd80d 100644 --- a/src/calamares/testmain.cpp +++ b/src/calamares/testmain.cpp @@ -59,6 +59,7 @@ handle_args( QCoreApplication& a ) parser.addOption( debugLevelOption ); parser.addPositionalArgument( "module", "Path or name of module to run." ); + parser.addPositionalArgument( "config", "Path of job-config file to use.", "[config]"); parser.process( a ); @@ -140,6 +141,8 @@ load_module( const ModuleConfig& moduleConfig ) ? moduleDirectory + '/' + name + ".conf" : moduleConfig.configFile() ); + cDebug() << "Module" << moduleName << "job-configuration:" << configFile; + Calamares::Module* module = Calamares::Module::fromDescriptor( descriptor, name, configFile, moduleDirectory ); From 39a0d2315b2a31f22242bbfb3622636bd8d5c028 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 07:39:43 -0400 Subject: [PATCH 19/54] [calamares] Better config-loading diagnostics - Be more verbose when things go wrong while loading module- configuration files. - Allow more forms of paths to be specified. In debug mode, this is mostyle helpful for the module test-loader. --- src/libcalamaresui/modulesystem/Module.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libcalamaresui/modulesystem/Module.cpp b/src/libcalamaresui/modulesystem/Module.cpp index 8d92c37ad..a1349c280 100644 --- a/src/libcalamaresui/modulesystem/Module.cpp +++ b/src/libcalamaresui/modulesystem/Module.cpp @@ -145,8 +145,15 @@ moduleConfigurationCandidates( bool assumeBuildDir, const QString& moduleName, c paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); else { + // If an absolute path is given, in debug mode, look for it + // first. The case contains('/'), below, will add the absolute + // path a second time, though. + if ( assumeBuildDir && configFileName.startsWith( '/' ) ) + paths << configFileName; if ( assumeBuildDir ) paths << QDir().absoluteFilePath(QString( "src/modules/%1/%2" ).arg( moduleName ).arg( configFileName ) ); + if ( assumeBuildDir && configFileName.contains( '/' ) ) + paths << QDir().absoluteFilePath( configFileName ); paths << QString( "/etc/calamares/modules/%1" ).arg( configFileName ); paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); @@ -168,6 +175,7 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex YAML::Node doc = YAML::Load( ba.constData() ); if ( doc.IsNull() ) { + cDebug() << "Found empty module configuration" << path; // Special case: empty config files are valid, // but aren't a map. return; @@ -178,14 +186,13 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex return; } + cDebug() << "Loaded module configuration" << path; m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ).toMap(); m_emergency = m_maybe_emergency && m_configurationMap.contains( EMERGENCY ) && m_configurationMap[ EMERGENCY ].toBool(); return; } - else - continue; } } From bf092de76fdc913e718620c2b7acf7d946848e23 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 07:48:06 -0400 Subject: [PATCH 20/54] [calamares] Explain config-file failures better --- src/modules/test_conf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/test_conf.cpp b/src/modules/test_conf.cpp index b5362d25a..ca6b72cc7 100644 --- a/src/modules/test_conf.cpp +++ b/src/modules/test_conf.cpp @@ -87,7 +87,7 @@ int main(int argc, char** argv) if ( !doc.IsMap() ) { cerr << "WARNING:" << filename << '\n'; - cerr << "WARNING: not-a-YAML-map\n"; + cerr << "WARNING: not-a-YAML-map (type=" << doc.Type() << ")\n"; return 1; } From 3b8fa187e1679a0b7134e6e2df969d17f3c7cfff Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 07:49:49 -0400 Subject: [PATCH 21/54] [fsresizer] Fix syntax error in YAML --- src/modules/fsresizer/fsresizer.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/fsresizer/fsresizer.conf b/src/modules/fsresizer/fsresizer.conf index 1539a7751..5a5700a79 100644 --- a/src/modules/fsresizer/fsresizer.conf +++ b/src/modules/fsresizer/fsresizer.conf @@ -7,7 +7,7 @@ # written to an 8GiB SD card; the FS should expand to take # advantage of the unused 2GiB. The FS should expand much # more if the same image is written to a 16GiB card. --- +--- # Which FS needs to be grown? Choose one way to identify it: # - *fs* names a mount point which should already be mounted From a32149bd927a2c138e0f46d7df6d5ba495528ce7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 08:02:43 -0400 Subject: [PATCH 22/54] CI: run tests after build as well --- ci/travis-continuous.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index eccb6743e..e0bbf1351 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -51,4 +51,6 @@ df -h echo "# Install results" install_debugging "$DESTDIR" -$result # Result of make install, above +$result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above + +make test From b0db4780bfb09716b31cf293ac3fe7af1de5c810 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 15:13:43 +0200 Subject: [PATCH 23/54] CI: be more chatty while running tests --- ci/travis-continuous.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index e0bbf1351..647d460b8 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -53,4 +53,8 @@ install_debugging "$DESTDIR" $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above -make test +echo "# Running tests" +find . -name test_conf +find . -name loadmodule +ctest -V + From 499dd2ce838a330b8f0f01aad7d24a24547622e0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 15:38:26 +0200 Subject: [PATCH 24/54] [fsresizer] Document configuration - Add some notes on configuration of fsresizer - Convenience methods for checking validity. --- src/modules/fsresizer/ResizeFSJob.cpp | 5 +++++ src/modules/fsresizer/ResizeFSJob.h | 17 +++++++++++++++++ src/modules/fsresizer/fsresizer.conf | 5 ++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index e10894c30..925301e42 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -85,6 +85,11 @@ ResizeFSJob::prettyName() const Calamares::JobResult ResizeFSJob::exec() { + if ( !isValid() ) + return Calamares::JobResult::error( + tr( "Invalid configuration" ), + tr( "The file-system resize job has an invalid configuration " + "and will not run." ) ); return Calamares::JobResult::ok(); } diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 415d04c81..6308f12ed 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -33,6 +33,12 @@ class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob Q_OBJECT public: + /** @brief Size expressions + * + * Sizes can be specified in MiB or percent (of the device they + * are on). This class handles parsing of such strings from the + * config file. + */ class RelativeSize { public: @@ -49,6 +55,11 @@ public: int value() const { return m_value; } Unit unit() const { return m_unit; } + constexpr bool isValid() const + { + return ( unit() != None ) && ( value() > 0 ); + } + private: int m_value; Unit m_unit; @@ -63,6 +74,12 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ) override; + constexpr bool isValid() const + { + return ( !m_fsname.isEmpty() || !m_devicename.isEmpty() ) && + m_size.isValid(); + } + private: RelativeSize m_size; RelativeSize m_atleast; diff --git a/src/modules/fsresizer/fsresizer.conf b/src/modules/fsresizer/fsresizer.conf index 5a5700a79..f02983e45 100644 --- a/src/modules/fsresizer/fsresizer.conf +++ b/src/modules/fsresizer/fsresizer.conf @@ -21,10 +21,13 @@ fs: / # in percent, so set it to 100. Perhaps a fixed size is # needed (that would be weird though, since you don't know # how big the card is), use MiB as suffix in that case. +# If missing, then it's assumed to be 0, and no resizing +# will happen. size: 100% # Resizing might not be worth it, though. Set the minimum # that it must grow; if it cannot grow that much, the # resizing is skipped. Can be in percentage or absolute -# size, as above. +# size, as above. If missing, then it's assumed to be 0, +# which means resizing is always worthwhile. atleast: 1000MiB From a40864f70974d4bd8f22ca1118d98621bfb61b32 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 15:40:26 +0200 Subject: [PATCH 25/54] CI: mess around with running tests --- ci/travis-continuous.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index 647d460b8..b8a1c8548 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -56,5 +56,10 @@ $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, abov echo "# Running tests" find . -name test_conf find . -name loadmodule +./test_conf --help +$BUILDDIR/test_conf --help +/build/test_conf --help + +echo "# Running ctest" ctest -V From 45195b9f7ed17b508d662bfa2887a81fd4c1136e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 10:34:46 -0400 Subject: [PATCH 26/54] [fsresizer] Remove over-enthusiastic constexpr --- src/modules/fsresizer/ResizeFSJob.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 6308f12ed..85ed98cdc 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -34,7 +34,7 @@ class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob public: /** @brief Size expressions - * + * * Sizes can be specified in MiB or percent (of the device they * are on). This class handles parsing of such strings from the * config file. @@ -55,11 +55,11 @@ public: int value() const { return m_value; } Unit unit() const { return m_unit; } - constexpr bool isValid() const + bool isValid() const { return ( unit() != None ) && ( value() > 0 ); } - + private: int m_value; Unit m_unit; @@ -74,12 +74,12 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ) override; - constexpr bool isValid() const + bool isValid() const { return ( !m_fsname.isEmpty() || !m_devicename.isEmpty() ) && m_size.isValid(); } - + private: RelativeSize m_size; RelativeSize m_atleast; From bc732ccbc70420cc7d023b90defc53ac81dafdab Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 10:53:46 -0400 Subject: [PATCH 27/54] CI: mess around with test-application permissions --- ci/travis-continuous.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index b8a1c8548..04e8c2ca2 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -54,11 +54,10 @@ install_debugging "$DESTDIR" $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above echo "# Running tests" -find . -name test_conf -find . -name loadmodule -./test_conf --help +ls -la $BUILDDIR/test_conf +chmod 755 $BUILDDIR/test_conf $BUILDDIR/test_conf --help -/build/test_conf --help +ls -la $BUILDDIR/test_conf echo "# Running ctest" ctest -V From 579f1dfee7fa6e8cce272be24b85b95acf253caa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Sep 2018 11:07:56 -0400 Subject: [PATCH 28/54] CI: don't try to run tests. - permissions on the tmpfs where everything is built, prevents the test-applications from running. --- ci/travis-continuous.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index 04e8c2ca2..1b3841e54 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -52,13 +52,3 @@ echo "# Install results" install_debugging "$DESTDIR" $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above - -echo "# Running tests" -ls -la $BUILDDIR/test_conf -chmod 755 $BUILDDIR/test_conf -$BUILDDIR/test_conf --help -ls -la $BUILDDIR/test_conf - -echo "# Running ctest" -ctest -V - From e3bf9fc2204427b1a2060043d6919aa001f15326 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 21 Sep 2018 16:19:05 -0400 Subject: [PATCH 29/54] [partition] Fix build with KPMCore <= 3.3.0 - Reported by Philip Mueller --- src/modules/partition/gui/ChoicePage.cpp | 4 ++++ src/modules/partition/gui/PartitionPage.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 17f0a95ea..abe7795c0 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -48,7 +48,9 @@ #include #include +#ifdef WITH_KPMCOREGT33 #include +#endif #include #include @@ -1185,9 +1187,11 @@ ChoicePage::setupActions() bool atLeastOneIsMounted = false; // Suppress 'erase' if so bool isInactiveRAID = false; +#ifdef WITH_KPMCOREGT33 if ( currentDevice->type() == Device::Type::SoftwareRAID_Device && static_cast< SoftwareRAID* >(currentDevice)->status() == SoftwareRAID::Status::Inactive ) isInactiveRAID = true; +#endif for ( auto it = PartitionIterator::begin( currentDevice ); it != PartitionIterator::end( currentDevice ); ++it ) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index f23eecd6e..9d972c8fd 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -48,7 +48,9 @@ // KPMcore #include #include +#ifdef WITH_KPMCOREGT33 #include +#endif #include #include @@ -168,11 +170,14 @@ PartitionPage::updateButtons() { createTable = true; +#ifdef WITH_KPMCOREGT33 if ( device->type() == Device::Type::SoftwareRAID_Device && - static_cast< SoftwareRAID* >(device)->status() == SoftwareRAID::Status::Inactive ) { + static_cast< SoftwareRAID* >(device)->status() == SoftwareRAID::Status::Inactive ) + { createTable = false; create = false; } +#endif } else { From 8178c82d11b0aa52c9e8ec2aeae797dc2462361c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 21 Sep 2018 16:21:30 -0400 Subject: [PATCH 30/54] Changelog: update with names & partition module --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 56526aad2..8c56b4023 100644 --- a/CHANGES +++ b/CHANGES @@ -6,11 +6,17 @@ website will have to do for older versions. # 3.2.3 (unreleased) # This release contains contributions from (alphabetically by first name): + - Alf Gaida + - Caio Carvalho + - Philip Mueller ## Core ## ## Modules ## + * The *partition* module supports RAID devices, but only when Calamares + is compiled with the newest KPMCore release. + # 3.2.2 (2018-09-04) # This release contains contributions from (alphabetically by first name): From 428929b64f1059ed44fba3fb470ddbb8dc9e03f0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 22 Sep 2018 11:11:19 -0400 Subject: [PATCH 31/54] [fsresizer] Tiny step towards getting data from KPMcore --- src/modules/fsresizer/ResizeFSJob.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 925301e42..490010e0c 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -22,6 +22,9 @@ #include #include +#include +#include + #include "CalamaresVersion.h" #include "JobQueue.h" #include "GlobalStorage.h" @@ -36,8 +39,8 @@ ResizeFSJob::RelativeSize::RelativeSize() template -void matchUnitSuffix( - const QString& s, +void matchUnitSuffix( + const QString& s, const char (&suffix)[N], ResizeFSJob::RelativeSize::Unit matchedUnit, int& value, @@ -50,15 +53,15 @@ void matchUnitSuffix( unit = matchedUnit; } } - - + + ResizeFSJob::RelativeSize::RelativeSize( const QString& s) : m_value( 0 ) , m_unit( None ) { matchUnitSuffix( s, "%", Percent, m_value, m_unit ); matchUnitSuffix( s, "MiB", Absolute, m_value, m_unit ); - + if ( !m_value ) m_unit = None; } @@ -85,11 +88,18 @@ ResizeFSJob::prettyName() const Calamares::JobResult ResizeFSJob::exec() { + auto backend_p = CoreBackendManager::self()->backend(); + if ( backend_p ) + cDebug() << "KPMCore backend @" << (void *)backend_p << backend_p->id() << backend_p->version(); + else + cDebug() << "No KPMCore backend"; + if ( !isValid() ) return Calamares::JobResult::error( tr( "Invalid configuration" ), tr( "The file-system resize job has an invalid configuration " "and will not run." ) ); + return Calamares::JobResult::ok(); } From 88c973f7cc09f891c56ea0c81558c414f6c53c83 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Sep 2018 05:33:39 -0400 Subject: [PATCH 32/54] [partition] Simplify space calculations - Q_ASSERT doesn't work in constexpr functions because it's not - May as well calculate bytes at compile-time, no need to give the runaround via number-of-MiB --- src/modules/partition/core/PartitionActions.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index d35345424..677c3778d 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -104,10 +104,7 @@ swapSuggestion( const qint64 availableSpaceB ) constexpr qint64 alignBytesToBlockSize( qint64 bytes, qint64 blocksize ) { - Q_ASSERT( bytes >= 0 ); - Q_ASSERT( blocksize > 0 ); qint64 blocks = bytes / blocksize; - Q_ASSERT( blocks >= 0 ); if ( blocks * blocksize != bytes ) ++blocks; @@ -135,17 +132,17 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass // the logical sector size (usually 512B). EFI starts with 2MiB // empty and a 300MiB EFI boot partition, while BIOS starts at // the 1MiB boundary (usually sector 2048). - int uefisys_part_size = isEfi ? 300 : 0; - int empty_space_size = isEfi ? 2 : 1; + int uefisys_part_sizeB = isEfi ? 300_MiB : 0_MiB; + int empty_space_sizeB = isEfi ? 2_MiB : 1_MiB; // Since sectors count from 0, if the space is 2048 sectors in size, // the first free sector has number 2048 (and there are 2048 sectors // before that one, numbered 0..2047). - qint64 firstFreeSector = bytesToSectors( MiBtoBytes(empty_space_size), dev->logicalSize() ); + qint64 firstFreeSector = bytesToSectors( empty_space_sizeB, dev->logicalSize() ); if ( isEfi ) { - qint64 efiSectorCount = bytesToSectors( MiBtoBytes(uefisys_part_size), dev->logicalSize() ); + qint64 efiSectorCount = bytesToSectors( uefisys_part_sizeB, dev->logicalSize() ); Q_ASSERT( efiSectorCount > 0 ); // Since sectors count from 0, and this partition is created starting From 0396ed28b7c65325aafd67296ca2509175da0dbd Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Sep 2018 17:05:36 +0200 Subject: [PATCH 33/54] [keyboard] Update some origin information for the keyboard map --- src/modules/keyboard/kbd-model-map | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/modules/keyboard/kbd-model-map b/src/modules/keyboard/kbd-model-map index 8555adfdf..68c8baf72 100644 --- a/src/modules/keyboard/kbd-model-map +++ b/src/modules/keyboard/kbd-model-map @@ -1,6 +1,11 @@ # Copied from systemd-localed -# http://cgit.freedesktop.org/systemd/systemd/log/src/locale/kbd-model-map +# +# https://cgit.freedesktop.org/systemd/systemd/log/src/locale/kbd-model-map # (originally under LGPLv2.1+, used under the LGPL to GPL conversion clause) +# +# This is the version from 534644b7be7b240eb0fbbe06e20cbecbe8206767, +# committed 2015-01-22 01:07:24 . +# # Generated from system-config-keyboard's model list # consolelayout xlayout xmodel xvariant xoptions sg ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp From d752223d0bc72adcce8f1db8473570253bb91651 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Sep 2018 17:58:22 +0200 Subject: [PATCH 34/54] [libcalamaresui] When reporting failure, use full product name. --- src/libcalamaresui/ViewManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 2b9f87db8..4d1f3591e 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -191,7 +191,7 @@ ViewManager::onInitFailed( const QStringList& modules) detailString = details.join( QString() ); } - insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), detailString ) ); + insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ProductName ), detailString ) ); } ViewStepList From 35ca813064ce9ad76045ee01e0e0cc632ea0f108 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 25 Sep 2018 06:34:03 -0400 Subject: [PATCH 35/54] [partition] Use "" for including from current directory --- src/modules/partition/core/PartitionIterator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/core/PartitionIterator.cpp b/src/modules/partition/core/PartitionIterator.cpp index 5ed48fd91..8301835c6 100644 --- a/src/modules/partition/core/PartitionIterator.cpp +++ b/src/modules/partition/core/PartitionIterator.cpp @@ -18,7 +18,7 @@ * along with Calamares. If not, see . */ -#include +#include "PartitionIterator.h" // KPMcore #include From 06a00a15c68c9711f72ccbb2a357b61b0c1b2725 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 25 Sep 2018 06:39:14 -0400 Subject: [PATCH 36/54] [fsresizer] Scan for devices, list partitions - The is just debugging output, but it's the start of what needs to happen to find the FS that needs resizing. --- src/modules/fsresizer/CMakeLists.txt | 5 +++- src/modules/fsresizer/ResizeFSJob.cpp | 39 ++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index ae87de160..9f0234406 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -10,17 +10,20 @@ if ( KPMcore_FOUND ) include_directories( ${KPMCORE_INCLUDE_DIR} ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamares ) + # The PartitionIterator is a small class, and it's easiest -- but also a + # gross hack -- to just compile it again from the partition module tree. calamares_add_plugin( fsresizer TYPE job EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES ResizeFSJob.cpp + ${PROJECT_SOURCE_DIR}/src/modules/partition/core/PartitionIterator.cpp LINK_PRIVATE_LIBRARIES kpmcore calamares SHARED_LIB ) - + if( ECM_FOUND ) find_package( Qt5 COMPONENTS Test REQUIRED ) include( ECMAddTests ) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 490010e0c..e3820e535 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -24,6 +24,8 @@ #include #include +#include +#include #include "CalamaresVersion.h" #include "JobQueue.h" @@ -31,6 +33,8 @@ #include "utils/Logger.h" +#include "modules/partition/core/PartitionIterator.h" + ResizeFSJob::RelativeSize::RelativeSize() : m_value( 0 ) , m_unit( None ) @@ -92,7 +96,40 @@ ResizeFSJob::exec() if ( backend_p ) cDebug() << "KPMCore backend @" << (void *)backend_p << backend_p->id() << backend_p->version(); else - cDebug() << "No KPMCore backend"; + { + cDebug() << "No KPMCore backend loaded yet"; + QByteArray backendName = qgetenv( "KPMCORE_BACKEND" ); + if ( !CoreBackendManager::self()->load( backendName.isEmpty() ? CoreBackendManager::defaultBackendName() : backendName ) ) + { + cWarning() << "Could not load KPMCore backend."; + return Calamares::JobResult::error( + tr( "KPMCore not Available" ), + tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); + } + + backend_p = CoreBackendManager::self()->backend(); + } + if ( !backend_p ) + { + cWarning() << "Could not load KPMCore backend (2)."; + return Calamares::JobResult::error( + tr( "KPMCore not Available" ), + tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); + } + + using DeviceList = QList< Device* >; + DeviceList devices = backend_p->scanDevices( false ); + cDebug() << "ResizeFSJob found" << devices.count() << "devices."; + for ( DeviceList::iterator it = devices.begin(); it != devices.end(); ) + { + if ( ! (*it) ) + continue; + cDebug() << "ResizeFSJob found" << ( *it )->deviceNode(); + for ( auto pit = PartitionIterator::begin( *it); pit != PartitionIterator::end( *it); ++pit ) + { + cDebug() << ".." << ( *pit )->mountPoint(); + } + } if ( !isValid() ) return Calamares::JobResult::error( From 3ab891793a87fddf38a96286b4913c73a22c9da6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 26 Sep 2018 16:54:39 +0200 Subject: [PATCH 37/54] [keyboard] Add Austrian keyboard layout - Map xkb 'at' to 'de' on the text console - Thanks Philip Mueller, Kevin Kofler FIXES #1035 --- src/modules/keyboard/kbd-model-map | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/keyboard/kbd-model-map b/src/modules/keyboard/kbd-model-map index 68c8baf72..49ec4ad75 100644 --- a/src/modules/keyboard/kbd-model-map +++ b/src/modules/keyboard/kbd-model-map @@ -6,6 +6,9 @@ # This is the version from 534644b7be7b240eb0fbbe06e20cbecbe8206767, # committed 2015-01-22 01:07:24 . # +# Updates: +# - 2018-09-26 Added "Austrian" keyboard (de at). Issue #1035 +# # Generated from system-config-keyboard's model list # consolelayout xlayout xmodel xvariant xoptions sg ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp @@ -15,6 +18,7 @@ trq tr pc105 - terminate:ctrl_alt_bksp uk gb pc105 - terminate:ctrl_alt_bksp is-latin1 is pc105 - terminate:ctrl_alt_bksp de de pc105 - terminate:ctrl_alt_bksp +de at pc105 - terminate:ctrl_alt_bksp la-latin1 latam pc105 - terminate:ctrl_alt_bksp us us pc105+inet - terminate:ctrl_alt_bksp ko kr pc105 - terminate:ctrl_alt_bksp From aae4b38e6979c84ac888d7cde3f68533199f47e0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 03:44:39 -0400 Subject: [PATCH 38/54] [fsresizer] Fix endless loop - Improve variable names - Missing iterator++ --- src/modules/fsresizer/ResizeFSJob.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index e3820e535..06429699b 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -120,14 +120,14 @@ ResizeFSJob::exec() using DeviceList = QList< Device* >; DeviceList devices = backend_p->scanDevices( false ); cDebug() << "ResizeFSJob found" << devices.count() << "devices."; - for ( DeviceList::iterator it = devices.begin(); it != devices.end(); ) + for ( DeviceList::iterator dev_it = devices.begin(); dev_it != devices.end(); ++dev_it ) { - if ( ! (*it) ) + if ( ! (*dev_it) ) continue; - cDebug() << "ResizeFSJob found" << ( *it )->deviceNode(); - for ( auto pit = PartitionIterator::begin( *it); pit != PartitionIterator::end( *it); ++pit ) + cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode(); + for ( auto part_it = PartitionIterator::begin( *dev_it); part_it != PartitionIterator::end( *dev_it ); ++part_it ) { - cDebug() << ".." << ( *pit )->mountPoint(); + cDebug() << ".." << ( *part_it )->mountPoint(); } } From 1c2714d832ac832fff008f4615e92c66f9db595a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 03:56:57 -0400 Subject: [PATCH 39/54] [fsresizer] Match configuration to system - Bail out earlier before doing any work if the configuration is invalid. - If it's valid, look for a matching device. --- src/modules/fsresizer/ResizeFSJob.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 06429699b..cf2ea47f6 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -92,6 +92,13 @@ ResizeFSJob::prettyName() const Calamares::JobResult ResizeFSJob::exec() { + if ( !isValid() ) + return Calamares::JobResult::error( + tr( "Invalid configuration" ), + tr( "The file-system resize job has an invalid configuration " + "and will not run." ) ); + + // Get KPMCore auto backend_p = CoreBackendManager::self()->backend(); if ( backend_p ) cDebug() << "KPMCore backend @" << (void *)backend_p << backend_p->id() << backend_p->version(); @@ -117,6 +124,9 @@ ResizeFSJob::exec() tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); } + Device* resize_this_device = nullptr; + Partition* resize_this_partition = nullptr; + using DeviceList = QList< Device* >; DeviceList devices = backend_p->scanDevices( false ); cDebug() << "ResizeFSJob found" << devices.count() << "devices."; @@ -127,16 +137,18 @@ ResizeFSJob::exec() cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode(); for ( auto part_it = PartitionIterator::begin( *dev_it); part_it != PartitionIterator::end( *dev_it ); ++part_it ) { - cDebug() << ".." << ( *part_it )->mountPoint(); + cDebug() << ".." << ( *part_it )->mountPoint() << "on" << ( *part_it )->deviceNode(); + if ( ( !m_fsname.isEmpty() && ( *part_it )->mountPoint() == m_fsname ) || + ( !m_devicename.isEmpty() && ( *part_it )->deviceNode() == m_devicename ) ) + { + resize_this_device = ( *dev_it ); + resize_this_partition = ( *part_it ); + cDebug() << ".. matched configuration dev=" << m_devicename << "fs=" << m_fsname; + break; + } } } - if ( !isValid() ) - return Calamares::JobResult::error( - tr( "Invalid configuration" ), - tr( "The file-system resize job has an invalid configuration " - "and will not run." ) ); - return Calamares::JobResult::ok(); } From 9e1c95ad056f4794b7e73bd4b9e09d7dad79bd38 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 04:10:25 -0400 Subject: [PATCH 40/54] [fsresizer] Refactor finding device - Find device in separate function - If device isn't found, bail out --- src/modules/fsresizer/ResizeFSJob.cpp | 56 +++++++++++++++------------ src/modules/fsresizer/ResizeFSJob.h | 9 +++++ 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index cf2ea47f6..68fd166e7 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -88,6 +88,32 @@ ResizeFSJob::prettyName() const return tr( "Resize Filesystem Job" ); } +ResizeFSJob::PartitionMatch +ResizeFSJob::findPartition( CoreBackend* backend ) +{ + using DeviceList = QList< Device* >; + DeviceList devices = backend->scanDevices( false ); + cDebug() << "ResizeFSJob found" << devices.count() << "devices."; + for ( DeviceList::iterator dev_it = devices.begin(); dev_it != devices.end(); ++dev_it ) + { + if ( ! (*dev_it) ) + continue; + cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode(); + for ( auto part_it = PartitionIterator::begin( *dev_it); part_it != PartitionIterator::end( *dev_it ); ++part_it ) + { + cDebug() << ".." << ( *part_it )->mountPoint() << "on" << ( *part_it )->deviceNode(); + if ( ( !m_fsname.isEmpty() && ( *part_it )->mountPoint() == m_fsname ) || + ( !m_devicename.isEmpty() && ( *part_it )->deviceNode() == m_devicename ) ) + { + cDebug() << ".. matched configuration dev=" << m_devicename << "fs=" << m_fsname; + return PartitionMatch( *dev_it, *part_it ); + } + } + } + + cDebug() << "No match for configuration dev=" << m_devicename << "fs=" << m_fsname; + return PartitionMatch( nullptr, nullptr ); +} Calamares::JobResult ResizeFSJob::exec() @@ -124,30 +150,12 @@ ResizeFSJob::exec() tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); } - Device* resize_this_device = nullptr; - Partition* resize_this_partition = nullptr; - - using DeviceList = QList< Device* >; - DeviceList devices = backend_p->scanDevices( false ); - cDebug() << "ResizeFSJob found" << devices.count() << "devices."; - for ( DeviceList::iterator dev_it = devices.begin(); dev_it != devices.end(); ++dev_it ) - { - if ( ! (*dev_it) ) - continue; - cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode(); - for ( auto part_it = PartitionIterator::begin( *dev_it); part_it != PartitionIterator::end( *dev_it ); ++part_it ) - { - cDebug() << ".." << ( *part_it )->mountPoint() << "on" << ( *part_it )->deviceNode(); - if ( ( !m_fsname.isEmpty() && ( *part_it )->mountPoint() == m_fsname ) || - ( !m_devicename.isEmpty() && ( *part_it )->deviceNode() == m_devicename ) ) - { - resize_this_device = ( *dev_it ); - resize_this_partition = ( *part_it ); - cDebug() << ".. matched configuration dev=" << m_devicename << "fs=" << m_fsname; - break; - } - } - } + PartitionMatch m = findPartition( backend_p ); + if ( !m.first || !m.second ) + return Calamares::JobResult::error( + tr( "Resize Failed" ), + m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname) + : tr( "The device %1 could not be found in this system, and can not be resized." ).arg(m_devicename) ); return Calamares::JobResult::ok(); } diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 85ed98cdc..72b28e690 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -28,6 +28,10 @@ #include +class CoreBackend; // From KPMCore +class Device; // From KPMCore +class Partition; + class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob { Q_OBJECT @@ -74,6 +78,7 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ) override; + /** @brief Is the configuration of this job valid? */ bool isValid() const { return ( !m_fsname.isEmpty() || !m_devicename.isEmpty() ) && @@ -85,6 +90,10 @@ private: RelativeSize m_atleast; QString m_fsname; // Either this, or devicename, is set, not both QString m_devicename; + + using PartitionMatch = QPair; + /** @brief Find the configured FS using KPMCore @p backend */ + PartitionMatch findPartition( CoreBackend* backend ); }; CALAMARES_PLUGIN_FACTORY_DECLARATION( ResizeFSJobFactory ) From 9124281bcbe6addaf7da5546d1639a09f61a4fd5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 05:28:20 -0400 Subject: [PATCH 41/54] [fsresizer] Calculate resize parameters - apply() a relativesize to a device to find out how much it means in sectors - find the space into which the configured FS can grow. --- src/modules/fsresizer/ResizeFSJob.cpp | 82 ++++++++++++++++++++++++++- src/modules/fsresizer/ResizeFSJob.h | 12 ++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 68fd166e7..e3744661d 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -26,12 +26,14 @@ #include #include #include +#include #include "CalamaresVersion.h" #include "JobQueue.h" #include "GlobalStorage.h" #include "utils/Logger.h" +#include "utils/Units.h" #include "modules/partition/core/PartitionIterator.h" @@ -70,6 +72,26 @@ ResizeFSJob::RelativeSize::RelativeSize( const QString& s) m_unit = None; } +qint64 +ResizeFSJob::RelativeSize::apply( Device* d ) +{ + if ( !isValid() ) + return -1; + + switch( m_unit ) + { + case None: + return -1; + case Absolute: + return CalamaresUtils::MiBtoBytes( value() ) / d->logicalSize(); + case Percent: + return d->logicalSize() * value() / 100; + } + + // notreached + return -1; +} + ResizeFSJob::ResizeFSJob( QObject* parent ) : Calamares::CppJob( parent ) @@ -99,7 +121,7 @@ ResizeFSJob::findPartition( CoreBackend* backend ) if ( ! (*dev_it) ) continue; cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode(); - for ( auto part_it = PartitionIterator::begin( *dev_it); part_it != PartitionIterator::end( *dev_it ); ++part_it ) + for ( auto part_it = PartitionIterator::begin( *dev_it ); part_it != PartitionIterator::end( *dev_it ); ++part_it ) { cDebug() << ".." << ( *part_it )->mountPoint() << "on" << ( *part_it )->deviceNode(); if ( ( !m_fsname.isEmpty() && ( *part_it )->mountPoint() == m_fsname ) || @@ -115,6 +137,51 @@ ResizeFSJob::findPartition( CoreBackend* backend ) return PartitionMatch( nullptr, nullptr ); } +qint64 +ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) +{ + if ( !m.first || !m.second ) + return -1; + if ( !ResizeOperation::canGrow( m.second ) ) + return -1; + + qint64 last_available = m.first->totalLogical(); + cDebug() << "Containing device size" << last_available; + qint64 last_currently = m.second->lastSector(); + cDebug() << "Growing partition" << m.second->firstSector() << '-' << last_currently; + + for ( auto part_it = PartitionIterator::begin( m.first ); part_it != PartitionIterator::end( m.first ); ++part_it ) + { + qint64 next_start = ( *part_it )->firstSector(); + cDebug() << ".. comparing" << next_start << '-' << ( *part_it )->lastSector(); + if ( (next_start > last_currently) && (next_start < last_available) ) + { + cDebug() << " .. shrunk last available to" << next_start; + last_available = next_start - 1; // Before that one starts + } + } + + if ( !( last_available > last_currently ) ) + { + cDebug() << "Partition can not grow larger."; + return -1; + } + + qint64 expand = last_available - last_currently; // number of sectors + if ( m_atleast.isValid() ) + { + qint64 required = m_atleast.apply( m.first ); + if ( expand < required ) + { + cDebug() << ".. need to expand by" << required << "but only" << expand << "is available."; + return -1; + } + } + + return last_available; +} + + Calamares::JobResult ResizeFSJob::exec() { @@ -157,6 +224,19 @@ ResizeFSJob::exec() m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname) : tr( "The device %1 could not be found in this system, and can not be resized." ).arg(m_devicename) ); + if ( !ResizeOperation::canGrow( m.second ) ) + { + cDebug() << "canGrow() returned false."; + return Calamares::JobResult::error( + tr( "Resize Failed" ), + m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname) + : tr( "The device %1 can not be resized." ).arg(m_devicename) ); + } + + cDebug() << "Resize from" << m.second->firstSector() + << '+' << m.second->length() << '=' << m.second->lastSector() + << "to" << findGrownEnd( m ); + return Calamares::JobResult::ok(); } diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 72b28e690..36527ab56 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -64,6 +64,15 @@ public: return ( unit() != None ) && ( value() > 0 ); } + /** @brief Apply this size to the given device @p d + * + * For invalid sizes, returns -1. + * For absolute sizes, returns the number of sectors needed. + * For percent sizes, returns the number of sectors matching + * that percentage of the device size. + */ + qint64 apply( Device* d ); + private: int m_value; Unit m_unit; @@ -94,6 +103,9 @@ private: using PartitionMatch = QPair; /** @brief Find the configured FS using KPMCore @p backend */ PartitionMatch findPartition( CoreBackend* backend ); + + /** @brief Return a new end-sector for the given dev-part pair. */ + qint64 findGrownEnd( PartitionMatch ); }; CALAMARES_PLUGIN_FACTORY_DECLARATION( ResizeFSJobFactory ) From 427c142182de90a9b47b92c6e092e872e98ffd26 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 12:51:32 +0200 Subject: [PATCH 42/54] Changelog: credits and mark fixed --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 8c56b4023..e6a16fac8 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ website will have to do for older versions. This release contains contributions from (alphabetically by first name): - Alf Gaida - Caio Carvalho + - Kevin Kofler - Philip Mueller ## Core ## @@ -16,6 +17,8 @@ This release contains contributions from (alphabetically by first name): * The *partition* module supports RAID devices, but only when Calamares is compiled with the newest KPMCore release. + * The *keyboard* module now handles the (bogus) Austrian keymap for + the system console properly. # 3.2.2 (2018-09-04) # From e7c62c114f9e88aeca32fc719fa7478421144075 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 13:35:33 +0200 Subject: [PATCH 43/54] [keyboard] Improve debugging output --- src/modules/keyboard/SetKeyboardLayoutJob.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp index 02d807045..75c52bb51 100644 --- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp +++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp @@ -65,6 +65,8 @@ SetKeyboardLayoutJob::prettyName() const QString SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) const { + cDebug() << "Looking for converted keymap in" << convertedKeymapPath; + // No search path supplied, assume the distribution does not provide // converted keymaps if ( convertedKeymapPath.isEmpty() ) @@ -76,8 +78,7 @@ SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) if ( convertedKeymapDir.exists( name + ".map" ) || convertedKeymapDir.exists( name + ".map.gz" ) ) { - cDebug() << "Found converted keymap" << name; - + cDebug() << ".. Found converted keymap" << name; return name; } @@ -88,6 +89,8 @@ SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) QString SetKeyboardLayoutJob::findLegacyKeymap() const { + cDebug() << "Looking for legacy keymap in QRC"; + int bestMatching = 0; QString name; @@ -137,7 +140,7 @@ SetKeyboardLayoutJob::findLegacyKeymap() const // The best matching entry so far, then let's save that if ( matching >= qMax( bestMatching, 1 ) ) { - cDebug() << "Found legacy keymap" << mapping[0] + cDebug() << ".. Found legacy keymap" << mapping[0] << "with score" << matching; if ( matching > bestMatching ) From a749f041f016b9386a32cf72b183d48fb7b15c2b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 20:45:13 +0200 Subject: [PATCH 44/54] [calamares] More verbose failure in test-loader --- src/calamares/testmain.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp index c22342f9a..e1d934b54 100644 --- a/src/calamares/testmain.cpp +++ b/src/calamares/testmain.cpp @@ -184,7 +184,12 @@ main( int argc, char* argv[] ) cDebug() << count << p->prettyName(); Calamares::JobResult r = p->exec(); if ( !r ) - cDebug() << count << ".. failed" << r; + { + using TR = Logger::DebugRow; + cDebug() << count << ".. failed" + << TR( "summary", r.message() ) + << TR( "details", r.details() ); + } ++count; } From 2556891e390ea27e932844f8d855fec549b5c480 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 20:49:28 +0200 Subject: [PATCH 45/54] [fsresizer] Fix backwards logic in error message --- src/modules/fsresizer/ResizeFSJob.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index e3744661d..d501ba4f1 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -221,7 +221,7 @@ ResizeFSJob::exec() if ( !m.first || !m.second ) return Calamares::JobResult::error( tr( "Resize Failed" ), - m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname) + !m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname) : tr( "The device %1 could not be found in this system, and can not be resized." ).arg(m_devicename) ); if ( !ResizeOperation::canGrow( m.second ) ) @@ -229,7 +229,7 @@ ResizeFSJob::exec() cDebug() << "canGrow() returned false."; return Calamares::JobResult::error( tr( "Resize Failed" ), - m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname) + !m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname) : tr( "The device %1 can not be resized." ).arg(m_devicename) ); } From e627633c444061f8490f8a6a23ad7af2acf9aafd Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 21:39:22 +0200 Subject: [PATCH 46/54] [fsresizer] initialize FS support --- src/modules/fsresizer/ResizeFSJob.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index d501ba4f1..b68485815 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -216,7 +216,9 @@ ResizeFSJob::exec() tr( "KPMCore not Available" ), tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); } + backend_p->initFSSupport(); + // Now get the partition and FS we want to work on PartitionMatch m = findPartition( backend_p ); if ( !m.first || !m.second ) return Calamares::JobResult::error( From 14b675571437353b0c1555154ef0741557b5c5d2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 27 Sep 2018 21:47:54 +0200 Subject: [PATCH 47/54] [fsresizer] Initialize harder --- src/modules/fsresizer/ResizeFSJob.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index b68485815..8f5bce917 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -216,7 +216,7 @@ ResizeFSJob::exec() tr( "KPMCore not Available" ), tr( "Calamares cannot start KPMCore for the file-system resize job." ) ); } - backend_p->initFSSupport(); + backend_p->initFSSupport(); // Might not be enough, see below // Now get the partition and FS we want to work on PartitionMatch m = findPartition( backend_p ); @@ -226,6 +226,7 @@ ResizeFSJob::exec() !m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname) : tr( "The device %1 could not be found in this system, and can not be resized." ).arg(m_devicename) ); + m.second->fileSystem().init(); // Initialize support for specific FS if ( !ResizeOperation::canGrow( m.second ) ) { cDebug() << "canGrow() returned false."; From 5dc11b223a29c7e7cd15cf07b444f2c237f13174 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 11:55:16 +0200 Subject: [PATCH 48/54] [fsresizer] Do the resize itself - handle weird partition tables - ignore unallocated space -- that's what we want to expand into - use ResizeOperation for the actual work --- src/modules/fsresizer/ResizeFSJob.cpp | 41 +++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 8f5bce917..e5b3c0afc 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "CalamaresVersion.h" #include "JobQueue.h" @@ -145,15 +146,26 @@ ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) if ( !ResizeOperation::canGrow( m.second ) ) return -1; - qint64 last_available = m.first->totalLogical(); - cDebug() << "Containing device size" << last_available; + cDebug() << "Containing device size" << m.first->totalLogical(); + qint64 last_available = m.first->totalLogical() - 1; // Numbered from 0 qint64 last_currently = m.second->lastSector(); cDebug() << "Growing partition" << m.second->firstSector() << '-' << last_currently; for ( auto part_it = PartitionIterator::begin( m.first ); part_it != PartitionIterator::end( m.first ); ++part_it ) { qint64 next_start = ( *part_it )->firstSector(); - cDebug() << ".. comparing" << next_start << '-' << ( *part_it )->lastSector(); + qint64 next_end = ( *part_it )->lastSector(); + if ( next_start > next_end ) + { + cWarning() << "Corrupt partition has end" << next_end << " < start" << next_start; + std::swap( next_start, next_end ); + } + if ( ( *part_it )->roles().has( PartitionRole::Unallocated ) ) + { + cDebug() << ".. ignoring unallocated" << next_start << '-' << next_end; + continue; + } + cDebug() << ".. comparing" << next_start << '-' << next_end; if ( (next_start > last_currently) && (next_start < last_available) ) { cDebug() << " .. shrunk last available to" << next_start; @@ -236,9 +248,26 @@ ResizeFSJob::exec() : tr( "The device %1 can not be resized." ).arg(m_devicename) ); } - cDebug() << "Resize from" << m.second->firstSector() - << '+' << m.second->length() << '=' << m.second->lastSector() - << "to" << findGrownEnd( m ); + qint64 new_end = findGrownEnd( m ); + cDebug() << "Resize from" + << m.second->firstSector() << '-' << m.second->lastSector() + << '(' << m.second->length() << ')' + << "to -" << new_end; + + if ( ( new_end > 0 ) && ( new_end > m.second->lastSector() ) ) + { + ResizeOperation op( *m.first, *m.second, m.second->firstSector(), new_end ); + Report op_report( nullptr ); + if ( op.execute( op_report ) ) + cDebug() << "Resize operation OK."; + else + { + cDebug() << "Resize failed." << op_report.output(); + return Calamares::JobResult::error( + tr( "Resize Failed" ), + report.toText() ); + } + } return Calamares::JobResult::ok(); } From c725f6b55263bf00f60be04fc23a9c4301eec38c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 12:05:41 +0200 Subject: [PATCH 49/54] [fsresizer] Distinguish error from no-useful-resize --- src/modules/fsresizer/ResizeFSJob.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index e5b3c0afc..0d10c5583 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -138,6 +138,14 @@ ResizeFSJob::findPartition( CoreBackend* backend ) return PartitionMatch( nullptr, nullptr ); } +/** @brief Returns the last sector the matched partition should occupy. + * + * Returns a sector number. Returns -1 if something is wrong (e.g. + * can't resize at all, or missing data). Returns 0 if the resize + * won't fit because it doesn't satisfy the settings for atleast + * and size (or won't grow at all because the partition is blocked + * by occupied space after it). + */ qint64 ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) { @@ -176,7 +184,7 @@ ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) if ( !( last_available > last_currently ) ) { cDebug() << "Partition can not grow larger."; - return -1; + return 0; } qint64 expand = last_available - last_currently; // number of sectors @@ -186,7 +194,7 @@ ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) if ( expand < required ) { cDebug() << ".. need to expand by" << required << "but only" << expand << "is available."; - return -1; + return 0; } } @@ -254,6 +262,19 @@ ResizeFSJob::exec() << '(' << m.second->length() << ')' << "to -" << new_end; + if ( new_end < 0 ) + return Calamares::JobResult::error( + tr( "Resize Failed" ), + !m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname) + : tr( "The device %1 can not be resized." ).arg(m_devicename) ); + if ( new_end == 0 ) + { + // TODO: is that a bad thing? is the resize required? + cWarning() << "Resize operation on" << m_fsname << m_devicename + << "skipped as not-useful."; + return Calamares::JobResult::ok(); + } + if ( ( new_end > 0 ) && ( new_end > m.second->lastSector() ) ) { ResizeOperation op( *m.first, *m.second, m.second->firstSector(), new_end ); From aaf27ac2ab63cc4a302dc40d54debfce000a0d22 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 12:32:08 +0200 Subject: [PATCH 50/54] [fsresizer] Apply sizes properly - Distinguish size and atleast; in percentages they mean different things (atleast is a bit weird as a percentage, but hey). - Fix bug in percentage calculation. - Avoid percentage above 100. - Add documentation in config-file. --- src/modules/fsresizer/ResizeFSJob.cpp | 38 ++++++++++++++++++++++----- src/modules/fsresizer/ResizeFSJob.h | 16 ++++++++--- src/modules/fsresizer/fsresizer.conf | 4 +++ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index 0d10c5583..f71f010bd 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -68,31 +68,48 @@ ResizeFSJob::RelativeSize::RelativeSize( const QString& s) { matchUnitSuffix( s, "%", Percent, m_value, m_unit ); matchUnitSuffix( s, "MiB", Absolute, m_value, m_unit ); + + if ( ( unit() == Percent ) && ( value() > 100 ) ) + { + cDebug() << "Percent value" << value() << "is not valid."; + m_value = 0; + m_unit = None; + } if ( !m_value ) m_unit = None; } qint64 -ResizeFSJob::RelativeSize::apply( Device* d ) +ResizeFSJob::RelativeSize::apply( qint64 totalSectors , qint64 sectorSize ) { if ( !isValid() ) return -1; - + if ( sectorSize < 1 ) + return -1; + switch( m_unit ) { case None: return -1; case Absolute: - return CalamaresUtils::MiBtoBytes( value() ) / d->logicalSize(); + return CalamaresUtils::MiBtoBytes( value() ) / sectorSize; case Percent: - return d->logicalSize() * value() / 100; + if ( value() == 100 ) + return totalSectors; // Common-case, avoid futzing around + else + return totalSectors * value() / 100; } // notreached return -1; } +qint64 +ResizeFSJob::RelativeSize::apply( Device* d ) +{ + return apply( d->totalLogical(), d->logicalSize() ); +} ResizeFSJob::ResizeFSJob( QObject* parent ) : Calamares::CppJob( parent ) @@ -150,9 +167,11 @@ qint64 ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) { if ( !m.first || !m.second ) - return -1; + return -1; // Missing device data if ( !ResizeOperation::canGrow( m.second ) ) - return -1; + return -1; // Operation is doomed + if ( !m_size.isValid() ) + return -1; // Must have a grow-size cDebug() << "Containing device size" << m.first->totalLogical(); qint64 last_available = m.first->totalLogical() - 1; // Numbered from 0 @@ -198,6 +217,13 @@ ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m) } } + qint64 wanted = m_size.apply( expand, m.first->logicalSize() ); + if ( wanted < expand ) + { + cDebug() << ".. only growing by" << wanted << "instead of full" << expand; + last_available -= ( expand - wanted ); + } + return last_available; } diff --git a/src/modules/fsresizer/ResizeFSJob.h b/src/modules/fsresizer/ResizeFSJob.h index 36527ab56..063495e7d 100644 --- a/src/modules/fsresizer/ResizeFSJob.h +++ b/src/modules/fsresizer/ResizeFSJob.h @@ -64,15 +64,23 @@ public: return ( unit() != None ) && ( value() > 0 ); } - /** @brief Apply this size to the given device @p d + /** @brief Apply this size to the number of sectors @p totalSectors . * + * Each sector has size @p sectorSize , for converting absolute + * sizes in MiB to sector counts. + * * For invalid sizes, returns -1. * For absolute sizes, returns the number of sectors needed. - * For percent sizes, returns the number of sectors matching - * that percentage of the device size. + * For percent sizes, returns that percent of the number of sectors. + */ + qint64 apply( qint64 totalSectors, qint64 sectorSize ); + + /** @brief Apply this size to the given device. + * + * Equivalent to apply( d->totalLogical(), d->logicalSize() ) */ qint64 apply( Device* d ); - + private: int m_value; Unit m_unit; diff --git a/src/modules/fsresizer/fsresizer.conf b/src/modules/fsresizer/fsresizer.conf index f02983e45..06141fc7d 100644 --- a/src/modules/fsresizer/fsresizer.conf +++ b/src/modules/fsresizer/fsresizer.conf @@ -23,6 +23,8 @@ fs: / # how big the card is), use MiB as suffix in that case. # If missing, then it's assumed to be 0, and no resizing # will happen. +# +# Percentages apply to **available space**. size: 100% # Resizing might not be worth it, though. Set the minimum @@ -30,4 +32,6 @@ size: 100% # resizing is skipped. Can be in percentage or absolute # size, as above. If missing, then it's assumed to be 0, # which means resizing is always worthwhile. +# +# Percentages apply to **total device size**. atleast: 1000MiB From ed841d16747bb0528099254704ab52af9e318d2e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 12:34:40 +0200 Subject: [PATCH 51/54] [fsresizer] Typo --- src/modules/fsresizer/ResizeFSJob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/fsresizer/ResizeFSJob.cpp b/src/modules/fsresizer/ResizeFSJob.cpp index f71f010bd..0589e1866 100644 --- a/src/modules/fsresizer/ResizeFSJob.cpp +++ b/src/modules/fsresizer/ResizeFSJob.cpp @@ -312,7 +312,7 @@ ResizeFSJob::exec() cDebug() << "Resize failed." << op_report.output(); return Calamares::JobResult::error( tr( "Resize Failed" ), - report.toText() ); + op_report.toText() ); } } From f1ab363f603c35986ef0fae3f1cc3eb58f0f7060 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 12:56:06 +0200 Subject: [PATCH 52/54] Changelog: MD styling FIXES #921 --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index a996526a3..c7e5432ce 100644 --- a/CHANGES +++ b/CHANGES @@ -19,7 +19,7 @@ This release contains contributions from (alphabetically by first name): is compiled with the newest KPMCore release. * The *keyboard* module now handles the (bogus) Austrian keymap for the system console properly. - - New module *fsresizer* can be used to resize filesystems. It is intended + * New module *fsresizer* can be used to resize filesystems. It is intended 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. From b42a36e5ade669d03321e10d12c3d827f4213220 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 28 Sep 2018 14:24:25 +0200 Subject: [PATCH 53/54] [fsresizer] Don't need to check KPMCore version --- src/modules/fsresizer/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index 9f0234406..5de329cad 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -3,10 +3,6 @@ find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore if ( KPMcore_FOUND ) - if ( KPMcore_VERSION VERSION_GREATER "3.3.0") - add_definitions(-DWITH_KPMCOREGT33) # kpmcore greater than 3.3 - endif() - include_directories( ${KPMCORE_INCLUDE_DIR} ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamares ) From 7e88f637b15822a6ed9e5166d28cfccb4d880ce9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 30 Sep 2018 18:56:48 +0200 Subject: [PATCH 54/54] [localecfg] Fix error in string-formatting. --- src/modules/localecfg/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/localecfg/main.py b/src/modules/localecfg/main.py index 62a00b738..713b1e321 100644 --- a/src/modules/localecfg/main.py +++ b/src/modules/localecfg/main.py @@ -134,7 +134,7 @@ def run(): if os.path.exists(target_locale_gen_bak): shutil.copy2(target_locale_gen_bak, target_locale_gen) libcalamares.utils.debug("Restored backup {!s} -> {!s}" - .format(target_locale_gen_bak).format(target_locale_gen)) + .format(target_locale_gen_bak, target_locale_gen)) # run locale-gen if detected; this *will* cause an exception # if the live system has locale.gen, but the target does not: