diff --git a/CMakeLists.txt b/CMakeLists.txt index d430fd2d6..2c70c4538 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,14 +141,14 @@ set( CALAMARES_DESCRIPTION_SUMMARY # `txstats.py -e`. See also # # Total 79 languages -set( _tx_complete az az_AZ ca de fi_FI he hi hr ja ko lt pt_BR sq - sv uk zh_TW ) -set( _tx_good as be ca@valencia cs_CZ da fr fur it_IT ml nl pt_PT - ru sk tg tr_TR vi zh_CN ) -set( _tx_ok ar ast bg bn el en_GB es es_MX es_PR et eu fa gl hu id - is mr nb pl ro si sl sr sr@latin th ) -set( _tx_incomplete eo es_PE fr_CH gu id_ID ie kk kn ko_KR lo lv mk - ne ne_NP ru_RU te ur uz ) +set( _tx_complete az az_AZ ca fi_FI he hi ja ko lt pt_PT sq sv uk + zh_CN zh_TW ) +set( _tx_good as be ca@valencia cs_CZ da de fr fur hr it_IT ml nl + pt_BR ru sk tg tr_TR vi ) +set( _tx_ok ar ast bg bn el en_GB es es_MX et eu fa gl hu id is mr + nb pl ro si sl sr sr@latin th ) +set( _tx_incomplete eo es_PE es_PR fr_CH gu id_ID ie kk kn ko_KR lo + lv mk ne ne_NP ru_RU te ur uz zh zh_HK ) ### Required versions # diff --git a/lang/calamares_cs_CZ.ts b/lang/calamares_cs_CZ.ts index 1c2ed1755..5714c4e31 100644 --- a/lang/calamares_cs_CZ.ts +++ b/lang/calamares_cs_CZ.ts @@ -134,7 +134,7 @@ Widget Tree - Strom widgetu + Strom ovládacích prvků @@ -217,7 +217,7 @@ Working directory %1 for python job %2 is not readable. - Pracovní složku %1 pro Python skript %2 se nedaří otevřít pro čtení. + Pracovní složka %1 pro Python skript %2 není přístupná pro čtení. @@ -227,7 +227,7 @@ Main script file %1 for python job %2 is not readable. - Hlavní soubor s python skriptem %1 pro úlohu %2 se nedaří otevřít pro čtení.. + Hlavní soubor Python skriptu %1 pro úlohu %2 není přístupný pro čtení. @@ -504,7 +504,7 @@ Instalační program bude ukončen a všechny změny ztraceny. %1 Installer - %1 instalátor + Instalátor %1 @@ -660,7 +660,7 @@ Instalační program bude ukončen a všechny změny ztraceny. This storage device is a part of an <strong>inactive RAID</strong> device. - Toto úložné zařízení je součástí <strong>Neaktivního RAID</strong> zařízení. + Toto úložné zařízení je součástí <strong>neaktivního RAID</strong> zařízení. @@ -758,7 +758,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Set keyboard layout to %1/%2. - Nastavit rozložení klávesnice na %1/%2. + Nastavit rozvržení klávesnice na %1/%2. @@ -808,7 +808,7 @@ Instalační program bude ukončen a všechny změny ztraceny. This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - Počítač nesplňuje minimální požadavky pro instalaci %1.<br/>Instalace nemůže pokračovat <a href="#details">Podrobnosti…</a> + Počítač nesplňuje minimální požadavky pro instalaci %1.<br/>Nastavování nemůže pokračovat <a href="#details">Podrobnosti…</a> @@ -953,7 +953,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Install option: <strong>%1</strong> - Možnost instalace: <strong>%1</strong> + Volba instalace: <strong>%1</strong> @@ -1182,7 +1182,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Preserving home directory - Zachování domovské složky + Zachovává se domovská složka @@ -1198,7 +1198,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Setting file permissions - Nastavení oprávnění souboru + Nastavují se přístupová práva k souboru @@ -1755,7 +1755,7 @@ Instalační program bude ukončen a všechny změny ztraceny. System locale setting - Místní a jazykové nastavení systému + Místní a jazyková nastavení systému @@ -1986,7 +1986,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Timezone: %1 - Časová zóna: %1 + Časové pásmo: %1 @@ -2152,12 +2152,12 @@ Instalační program bude ukončen a všechny změny ztraceny. Select your preferred Zone within your Region. - Vyberte preferovanou zónu ve vašem regionu. + Vyberte upřednostňované pásmo ve svém regionu. Zones - Zóny + Pásma @@ -2283,7 +2283,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Heslo obsahuje méně než %1 číslici Heslo obsahuje méně než %1 číslice - Heslo obsahuje méně než %1 číslice + Heslo obsahuje méně než %1 číslic Heslo obsahuje méně než %1 číslice @@ -2463,7 +2463,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Form - Form + Formulář @@ -2724,7 +2724,7 @@ Instalační program bude ukončen a všechny změny ztraceny. Form - Form + Formulář @@ -3609,7 +3609,7 @@ Výstup: These groups are missing in the target system: %1 - Tyto skupiny chybí v cílovém systému chybí: %1 + Tyto skupiny v cílovém systému chybí: %1 @@ -3703,7 +3703,7 @@ Výstup: KDE user feedback - Zpětná vazba uživatele KDE + Zpětná vazba od uživatele pro KDE @@ -3719,12 +3719,12 @@ Výstup: Could not configure KDE user feedback correctly, script error %1. - Nepodařilo se správně nastavit zpětnou vazbu KDE uživatele, chyba ve skriptu %1. + Nepodařilo se správně nastavit zpětnou vazbu od uživatele pro KDE, chyba ve skriptu %1. Could not configure KDE user feedback correctly, Calamares error %1. - Nepodařilo se správně nastavit zpětnou vazbu KDE uživatele, chyba Calamares %1. + Nepodařilo se správně nastavit zpětnou vazbu od uživatel pro KDE, chyba Calamares %1. @@ -3732,28 +3732,28 @@ Výstup: Machine feedback - Zpětná vazba stroje + Zpětná vazba ze stroje Configuring machine feedback. - Nastavování zpětné vazby stroje + Nastavování zpětné vazby ze stroje Error in machine feedback configuration. - Chyba v nastavení zpětné vazby stroje. + Chyba v nastavení zpětné vazby ze stroje. Could not configure machine feedback correctly, script error %1. - Nepodařilo se správně nastavit zpětnou vazbu stroje, chyba skriptu %1. + Nepodařilo se správně nastavit zpětnou vazbu ze stroje, chyba skriptu %1. Could not configure machine feedback correctly, Calamares error %1. - Nepodařilo se správně nastavit zpětnou vazbu stroje, chyba Calamares %1. + Nepodařilo se správně nastavit zpětnou vazbu ze stroje, chyba Calamares %1. @@ -3786,7 +3786,7 @@ Výstup: By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. - Výběrem tohoto pošlete informace o své instalaci a hardware. Tyto údaje budou poslány <b>pouze jednorázově</b> po dokončení instalace. + Výběrem tohoto pošlete informace o své instalaci a hardware. Tyto údaje budou odeslány <b>pouze jednorázově</b> po dokončení instalace. @@ -3975,7 +3975,7 @@ Výstup: <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Vítejte v Calamares, instalačním programu (nejen) pro %1.</h1> + <h1>Vítejte v Calamares, instalačním programu (nejen) pro %1.</h1> @@ -4121,7 +4121,7 @@ Výstup: To activate keyboard preview, select a layout. - + Pokud chcete aktivovat náhled klávesnice, vyberte rozvržení. @@ -4131,7 +4131,7 @@ Výstup: Layouts - Rovzržení + Rozvržení @@ -4179,7 +4179,7 @@ Výstup: If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. - Pokud nechcete nainstalovat žádnou sadu kancelářských aplikací, stačí jen zvolit Žádná sada kancelářských aplikací. V případě potřeby je možné kdykoli nějakou přidat na už nainstalovaný systém. + Pokud nechcete nainstalovat žádnou sadu kancelářských aplikací, stačí jen zvolit Žádná sada kancelářských aplikací. V případě potřeby je možné kdykoli nějakou přidat do už nainstalovaného systému. @@ -4310,7 +4310,7 @@ Výstup: This name will be used if you make the computer visible to others on a network. - Tento název se použije, pokud počítač zviditelníte ostatním v síti. + Pod tímto názvem se bude počítač případně zobrazovat ostatním počítačům v síti. @@ -4335,7 +4335,7 @@ Výstup: Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. - Zadejte dvakrát stejné heslo, aby bylo možné zkontrolovat chyby při psaní. Dobré heslo by mělo obsahovat směs písmen, čísel a interpunkce a mělo by mít alespoň osm znaků. Zvažte také jeho pravidelnou změnu. + Zadání hesla zopakujte i do kontrolní kolonky, abyste měli jistotu, že jste napsali, co zamýšleli (že nedošlo k překlepu). Dobré heslo se bude skládat z písmen, číslic a interpunkce a mělo by být alespoň osm znaků dlouhé. Heslo byste také měli pravidelně měnit (prevence škod z jeho případného prozrazení). @@ -4350,7 +4350,7 @@ Výstup: Log in automatically without asking for the password - Přihlaste se automaticky bez zadávání hesla + Přihlašovat se automaticky bez zadávání hesla @@ -4360,7 +4360,7 @@ Výstup: Reuse user password as root password - Použijte uživatelské heslo zároveň jako heslo root + Použijte heslo uživatele i pro účet správce (root) @@ -4380,12 +4380,12 @@ Výstup: Repeat Root Password - Opakujte root heslo + Zopakujte zadání hesla pro správce systému (root) Enter the same password twice, so that it can be checked for typing errors. - Zadejte dvakrát stejné heslo, aby bylo možné zkontrolovat chyby při psaní. + Zadání hesla zopakujte i do kontrolní kolonky, abyste měli jistotu, že jste napsali, co zamýšleli (že nedošlo k překlepu). diff --git a/lang/calamares_hi.ts b/lang/calamares_hi.ts index 4e7a9b330..a7ce01d65 100644 --- a/lang/calamares_hi.ts +++ b/lang/calamares_hi.ts @@ -949,12 +949,12 @@ The installer will quit and all changes will be lost. Install option: <strong>%1</strong> - + इंस्टॉल विकल्प : <strong>%1</strong> None - + कोई नहीं @@ -2805,37 +2805,37 @@ The installer will quit and all changes will be lost. EFI system partition configured incorrectly - + EFI सिस्टम विभाजन उचित रूप से विन्यस्त नहीं है An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. - + %1 आरंभ करने हेतु EFI सिस्टम विभाजन आवश्यक है। <br/><br/> EFI सिस्टम विभाजन विन्यस्त करने हेतु, वापस जाएँ व एक उपयुक्त फाइल सिस्टम चुनें या बनाएँ। The filesystem must be mounted on <strong>%1</strong>. - + फाइल सिस्टम का <strong>%1</strong> पर माउंट होना आवश्यक है। The filesystem must have type FAT32. - + फाइल सिस्टम का प्रकार FAT32 होना आवश्यक है। The filesystem must be at least %1 MiB in size. - + फाइल सिस्टम का आकार कम-से-कम %1 एमबी होना आवश्यक है। The filesystem must have flag <strong>%1</strong> set. - + फाइल सिस्टम पर <strong>%1</strong> फ्लैग सेट होना आवश्यक है। You can continue without setting up an EFI system partition but your system may fail to start. - + आप बिना EFI सिस्टम विभाजन सेट करें भी प्रक्रिया जारी रख सकते हैं परन्तु सम्भवतः ऐसा करने से आपका सिस्टम आरंभ नहीं होगा। @@ -4099,7 +4099,7 @@ Output: To activate keyboard preview, select a layout. - + कुंजीपटल पूर्वावलोकन सक्रिय करने हेतु एक अभिन्यास चुनें। @@ -4114,7 +4114,7 @@ Output: Type here to test your keyboard - अपना कुंजीपटल जाँचने के लिए यहां टाइप करें + अपना कुंजीपटल जाँचने के लिए यहाँ टाइप करें @@ -4146,37 +4146,38 @@ Output: LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> Default option. - + लिब्रे-ऑफिस एक सशक्त और निःशुल्क ऑफिस सॉफ्टवेयर है जिसका उपयोग दुनिया भर के लाखों लोग करते हैं। इसमें कई अनुप्रयोग सम्मिलित हैं जो इसे उपलब्ध विकल्पों में सबसे बहुमुखी निःशुल्क व मुक्त स्रोत ऑफिस सॉफ्टवेयर बनाते हैं।<br/> +डिफ़ॉल्ट विकल्प। LibreOffice - + लिब्रे-ऑफिस If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. - + यदि आप ऑफिस सॉफ्टवेयर इंस्टॉल नहीं करना चाहते हैं, तो कोई ऑफिस सॉफ्टवेयर नहीं का विकल्प चुनें। आप आवश्यकता अनुसार बाद में अपने इंस्टॉल किए गए सिस्टम पर एक (या अधिक) ऐसे सॉफ्टवेयर जोड़ सकते हैं। No Office Suite - + कोई ऑफिस सॉफ्टवेयर नहीं Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. - + एक संक्षिप्त डेस्कटॉप इंस्टॉल का सृजन करें, सभी अतिरिक्त अनुप्रयोग हटाएँ एवं इंस्टॉल उपरांत तय करें कि आप सिस्टम में कौन से सॉफ्टवेयर जोड़ना चाहते हैं। इस प्रकार के इंस्टॉल में उदाहरण के तौर पर कोई ऑफिस सॉफ्टवेयर, कोई मीडिया प्लेयर, कोई चित्र प्रदर्शक या प्रिंटर समर्थन नहीं होगा। इसमें केवल एक डेस्कटॉप, फाइल प्रबंधक, पैकेज प्रबंधक, लेख संपादक व सरल वेब-ब्राउज़र होगा। Minimal Install - + संक्षिप्त इंस्टॉल Please select an option for your install, or use the default: LibreOffice included. - + कृपया अपने इंस्टॉल हेतु एक विकल्प चुनें या फिर डिफ़ॉल्ट ही उपयोग करें : इसमें लिब्रे-ऑफिस सम्मिलित है। diff --git a/lang/python/az/LC_MESSAGES/python.po b/lang/python/az/LC_MESSAGES/python.po index f4c40e5ab..8ac8172d8 100644 --- a/lang/python/az/LC_MESSAGES/python.po +++ b/lang/python/az/LC_MESSAGES/python.po @@ -4,7 +4,7 @@ # FIRST AUTHOR , YEAR. # # Translators: -# xxmn77 , 2021 +# Xəyyam Qocayev , 2021 # #, fuzzy msgid "" @@ -13,7 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-08 13:31+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: xxmn77 , 2021\n" +"Last-Translator: Xəyyam Qocayev , 2021\n" "Language-Team: Azerbaijani (https://www.transifex.com/calamares/teams/20061/az/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/lang/python/az_AZ/LC_MESSAGES/python.po b/lang/python/az_AZ/LC_MESSAGES/python.po index 2d57f0d4b..0df66e711 100644 --- a/lang/python/az_AZ/LC_MESSAGES/python.po +++ b/lang/python/az_AZ/LC_MESSAGES/python.po @@ -4,7 +4,7 @@ # FIRST AUTHOR , YEAR. # # Translators: -# xxmn77 , 2021 +# Xəyyam Qocayev , 2021 # #, fuzzy msgid "" @@ -13,7 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-08 13:31+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: xxmn77 , 2021\n" +"Last-Translator: Xəyyam Qocayev , 2021\n" "Language-Team: Azerbaijani (Azerbaijan) (https://www.transifex.com/calamares/teams/20061/az_AZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/lang/python/cs_CZ/LC_MESSAGES/python.po b/lang/python/cs_CZ/LC_MESSAGES/python.po index 6305ba7fb..993ed0b3f 100644 --- a/lang/python/cs_CZ/LC_MESSAGES/python.po +++ b/lang/python/cs_CZ/LC_MESSAGES/python.po @@ -206,8 +206,8 @@ msgid "" "The displaymanagers list is empty or undefined in both globalstorage and " "displaymanager.conf." msgstr "" -"Seznam správců displejů je prázdný nebo není definován v jak " -"bothglobalstorage, tak v displaymanager.conf." +"Seznam správců displejů je prázdný nebo není definován v jak globalstorage, " +"tak v displaymanager.conf." #: src/modules/displaymanager/main.py:989 msgid "Display manager configuration was incomplete" @@ -343,7 +343,7 @@ msgid "" "The package manager could not make changes to the installed system. The " "command
{!s}
returned error code {!s}." msgstr "" -"Nástroji pro správu balíčků se nepodařilo udělat změny v nainstalovaném " +"Nástroji pro správu balíčků se nepodařilo udělat změny v instalovaném " "systému. Příkaz
{!s}
vrátil chybový kód {!s}." #: src/modules/bootloader/main.py:43 diff --git a/src/libcalamares/JobQueue.cpp b/src/libcalamares/JobQueue.cpp index 00b30f318..039a28e26 100644 --- a/src/libcalamares/JobQueue.cpp +++ b/src/libcalamares/JobQueue.cpp @@ -112,17 +112,19 @@ public: QString message; ///< Filled in with errors QString details; + Logger::Once o; m_jobIndex = 0; for ( const auto& jobitem : *m_runningJobs ) { if ( failureEncountered && !jobitem.job->isEmergency() ) { - cDebug() << "Skipping non-emergency job" << jobitem.job->prettyName(); + cDebug() << o << "Skipping non-emergency job" << jobitem.job->prettyName(); } else { - cDebug() << "Starting" << ( failureEncountered ? "EMERGENCY JOB" : "job" ) << jobitem.job->prettyName() + cDebug() << o << "Starting" << ( failureEncountered ? "EMERGENCY JOB" : "job" ) << jobitem.job->prettyName() << '(' << ( m_jobIndex + 1 ) << '/' << m_runningJobs->count() << ')'; + o.refresh(); // So next time it shows the function header again emitProgress( 0.0 ); // 0% for *this job* connect( jobitem.job.data(), &Job::progress, this, &JobThread::emitProgress ); auto result = jobitem.job->exec(); diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index d61cfc223..480a115ae 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -16,6 +16,7 @@ #include "partition/Mount.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" +#include "utils/RAII.h" #include "utils/String.h" #include @@ -147,7 +148,7 @@ debug( const std::string& s ) void warning( const std::string& s ) { - Logger::CDebug( Logger::LOGWARNING ) << output_prefix << QString::fromStdString( s ); + Logger::CDebug( Logger::LOGWARNING ) << output_prefix << QString::fromStdString( s ); } PythonJobInterface::PythonJobInterface( Calamares::PythonJob* parent ) @@ -241,6 +242,10 @@ _add_localedirs( QStringList& pathList, const QString& candidate ) bp::object gettext_path() { + // Going to log informatively just once + static bool first_time = true; + cScopedAssignment( &first_time, false ); + // TODO: distinguish between -d runs and normal runs // TODO: can we detect DESTDIR-installs? QStringList candidatePaths @@ -257,21 +262,26 @@ gettext_path() } _add_localedirs( candidatePaths, QDir().canonicalPath() ); // . - cDebug() << "Determining gettext path from" << candidatePaths; + if ( first_time ) + { + cDebug() << "Determining gettext path from" << candidatePaths; + } QStringList candidateLanguages = _gettext_languages(); - for ( const auto& lang : candidateLanguages ) + { for ( auto localedir : candidatePaths ) { QDir ldir( localedir ); if ( ldir.cd( lang ) ) { - cDebug() << Logger::SubEntry << "Found" << lang << "in" << ldir.canonicalPath(); + Logger::CDebug( Logger::LOGDEBUG ) + << output_prefix << "Found gettext" << lang << "in" << ldir.canonicalPath(); return bp::object( localedir.toStdString() ); } } - cDebug() << Logger::SubEntry << "No translation found for languages" << candidateLanguages; + } + cWarning() << "No translation found for languages" << candidateLanguages; return bp::object(); // None } diff --git a/src/libcalamares/modulesystem/Module.cpp b/src/libcalamares/modulesystem/Module.cpp index ff0b20f78..8fbb05300 100644 --- a/src/libcalamares/modulesystem/Module.cpp +++ b/src/libcalamares/modulesystem/Module.cpp @@ -101,7 +101,7 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::E YAML::Node doc = YAML::Load( ba.constData() ); if ( doc.IsNull() ) { - cDebug() << "Found empty module configuration" << path; + cWarning() << "Found empty module configuration" << path; // Special case: empty config files are valid, // but aren't a map. return; @@ -112,14 +112,13 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::E return; } - cDebug() << "Loaded module configuration" << path; m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ); m_emergency = m_maybe_emergency && m_configurationMap.contains( EMERGENCY ) && m_configurationMap[ EMERGENCY ].toBool(); return; } } - cDebug() << "No config file for" << name() << "found anywhere at" << Logger::DebugList( configCandidates ); + cWarning() << "No config file for" << name() << "found anywhere at" << Logger::DebugList( configCandidates ); } diff --git a/src/libcalamares/partition/KPMManager.cpp b/src/libcalamares/partition/KPMManager.cpp index 5f6b87589..ff7701703 100644 --- a/src/libcalamares/partition/KPMManager.cpp +++ b/src/libcalamares/partition/KPMManager.cpp @@ -100,12 +100,10 @@ getInternal() KPMManager::KPMManager() : m_d( getInternal() ) { - cDebug() << "KPMManager" << s_backend.use_count() << "created."; } KPMManager::~KPMManager() { - cDebug() << "KPMManager" << s_backend.use_count() << "being destroyed."; } KPMManager::operator bool() const diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.cpp b/src/libcalamares/utils/CalamaresUtilsSystem.cpp index df578a862..d2c0a6cf1 100644 --- a/src/libcalamares/utils/CalamaresUtilsSystem.cpp +++ b/src/libcalamares/utils/CalamaresUtilsSystem.cpp @@ -169,7 +169,7 @@ System::runCommand( System::RunLocation location, } } - cDebug() << "Running" << program << RedactedList( arguments ); + cDebug() << Logger::SubEntry << "Running" << program << RedactedList( arguments ); process.start(); if ( !process.waitForStarted() ) { @@ -208,10 +208,6 @@ System::runCommand( System::RunLocation location, { cDebug() << Logger::SubEntry << "Finished. Exit code:" << r << "output:\n" << Logger::NoQuote << output; } - else - { - cDebug() << Logger::SubEntry << "Finished. Exit code:" << r; - } } else // if ( r != 0 ) { diff --git a/src/libcalamares/utils/Entropy.cpp b/src/libcalamares/utils/Entropy.cpp index d28230a85..67a0718f5 100644 --- a/src/libcalamares/utils/Entropy.cpp +++ b/src/libcalamares/utils/Entropy.cpp @@ -18,15 +18,17 @@ CalamaresUtils::EntropySource CalamaresUtils::getEntropy( int size, QByteArray& b ) { + constexpr const char filler = char( 0xcb ); + + b.fill( filler ); b.clear(); if ( size < 1 ) { return EntropySource::None; } - b.resize( size ); + b.fill( filler, size ); char* buffer = b.data(); - std::fill( buffer, buffer + size, 0xcb ); qint64 readSize = 0; QFile urandom( "/dev/urandom" ); diff --git a/src/libcalamares/utils/Logger.h b/src/libcalamares/utils/Logger.h index 871cc6fb3..1fd534d04 100644 --- a/src/libcalamares/utils/Logger.h +++ b/src/libcalamares/utils/Logger.h @@ -310,6 +310,14 @@ public: } friend CDebug& operator<<( CDebug&&, const Once& ); + /** @brief Restore the object to "fresh" state + * + * It may be necessary to allow the Once object to stream the + * function header again -- for instance, after logging an error, + * any following debug log might want to re-introduce the header. + */ + void refresh() { m = true; } + private: mutable bool m = false; }; diff --git a/src/libcalamares/utils/RAII.h b/src/libcalamares/utils/RAII.h index 00e276ec6..957e4fe42 100644 --- a/src/libcalamares/utils/RAII.h +++ b/src/libcalamares/utils/RAII.h @@ -42,30 +42,17 @@ struct cqDeleter } }; -/// @brief Sets a bool to @p value and resets to !value on destruction -template < bool value > -struct cBoolSetter -{ - bool& m_b; - - cBoolSetter( bool& b ) - : m_b( b ) - { - m_b = value; - } - ~cBoolSetter() { m_b = !value; } -}; - /// @brief Blocks signals on a QObject until destruction using cSignalBlocker = QSignalBlocker; /** @brief Writes a value on destruction to a pointed-to location. * * If the pointer is non-null, write the last-given-value if there - * is one to the pointed-to object. + * is one to the pointed-to object. This is called the "then-value". + * */ template < typename T > -struct cPointerSetter +struct cScopedAssignment { std::optional< T > m_value; T* m_pointer; @@ -76,22 +63,36 @@ struct cPointerSetter * will do nothing on destruction, leaving the pointed-to * value unchanged. */ - cPointerSetter( T* p ) + cScopedAssignment( T* p ) : m_pointer( p ) { } - /** @brief Create a setter with a value already set + /** @brief Create a setter with a then-value already set * * This ensures that on destruction, the value @p v will be written; * it is equivalent to assigning @p v immediately. The pointed-to * value is **not** changed (until destruction). */ - cPointerSetter( T* p, T v ) - : m_value( v ) + cScopedAssignment( T* p, T then ) + : m_value( then ) , m_pointer( p ) { } - ~cPointerSetter() + /** @brief Create a setter with a then-value and assign a new value now + * + * As above, but also assign @p now to the thing pointed-to. + */ + cScopedAssignment( T* p, T now, T then ) + : m_value( then ) + , m_pointer( p ) + { + if ( p ) + { + *p = now; + } + } + + ~cScopedAssignment() { if ( m_pointer && m_value.has_value() ) { @@ -99,13 +100,13 @@ struct cPointerSetter } } - const T& operator=( const T& v ) + const T& operator=( const T& then ) { - m_value = v; - return v; + m_value = then; + return then; } }; template < typename T > -cPointerSetter( T p )->cPointerSetter< decltype( *p ) >; +cScopedAssignment( T p )->cScopedAssignment< decltype( *p ) >; #endif diff --git a/src/libcalamares/utils/Tests.cpp b/src/libcalamares/utils/Tests.cpp index a689505e9..c652571b4 100644 --- a/src/libcalamares/utils/Tests.cpp +++ b/src/libcalamares/utils/Tests.cpp @@ -55,7 +55,6 @@ private Q_SLOTS: void testOddSizedPrintable(); /** @section Tests the RAII bits. */ - void testBoolSetter(); void testPointerSetter(); /** @section Tests the Traits bits. */ @@ -340,28 +339,6 @@ LibCalamaresTests::testOddSizedPrintable() } } -void -LibCalamaresTests::testBoolSetter() -{ - bool b = false; - - QVERIFY( !b ); - { - QVERIFY( !b ); - cBoolSetter< true > x( b ); - QVERIFY( b ); - } - QVERIFY( !b ); - - QVERIFY( !b ); - { - QVERIFY( !b ); - cBoolSetter< false > x( b ); - QVERIFY( !b ); // Still! - } - QVERIFY( b ); -} - void LibCalamaresTests::testPointerSetter() { @@ -369,35 +346,35 @@ LibCalamaresTests::testPointerSetter() QCOMPARE( special, 17 ); { - cPointerSetter p( &special ); + cScopedAssignment p( &special ); } QCOMPARE( special, 17 ); { - cPointerSetter p( &special ); + cScopedAssignment p( &special ); p = 18; } QCOMPARE( special, 18 ); { - cPointerSetter p( &special ); + cScopedAssignment p( &special ); p = 20; p = 3; } QCOMPARE( special, 3 ); { - cPointerSetter p( nullptr ); + cScopedAssignment< int > p( nullptr ); } QCOMPARE( special, 3 ); { // "don't do this" .. order of destructors is important - cPointerSetter p( &special ); - cPointerSetter q( &special ); + cScopedAssignment p( &special ); + cScopedAssignment q( &special ); p = 17; } QCOMPARE( special, 17 ); { // "don't do this" .. order of destructors is important - cPointerSetter p( &special ); - cPointerSetter q( &special ); + cScopedAssignment p( &special ); + cScopedAssignment q( &special ); p = 34; q = 2; // q destroyed first, then p @@ -490,8 +467,7 @@ LibCalamaresTests::testVariantStringListCode() QStringList { "astring" } ); // A single string **can** be considered a stringlist! m.insert( key, QString( "more strings" ) ); QCOMPARE( getStringList( m, key ).count(), 1 ); - QCOMPARE( getStringList( m, key ), - QStringList { "more strings" } ); + QCOMPARE( getStringList( m, key ), QStringList { "more strings" } ); m.insert( key, QString() ); QCOMPARE( getStringList( m, key ).count(), 1 ); QCOMPARE( getStringList( m, key ), QStringList { QString() } ); diff --git a/src/modules/initcpiocfg/main.py b/src/modules/initcpiocfg/main.py index 029a02195..6247aeccc 100644 --- a/src/modules/initcpiocfg/main.py +++ b/src/modules/initcpiocfg/main.py @@ -27,35 +27,84 @@ def pretty_name(): return _("Configuring mkinitcpio.") -def cpuinfo(): +def detect_plymouth(): """ - Return the information in /proc/cpuinfo as a dictionary in the following - format: + Checks existence (runnability) of plymouth in the target system. - cpu_info['proc0']={...} - cpu_info['proc1']={...} + @return True if plymouth exists in the target, False otherwise """ - cpu_info = OrderedDict() - procinfo = OrderedDict() + # Used to only check existence of path /usr/bin/plymouth in target + return target_env_call(["sh", "-c", "which plymouth"]) == 0 - nprocs = 0 - with open("/proc/cpuinfo") as cpuinfo_file: - for line in cpuinfo_file: - if not line.strip(): - # end of one processor - cpu_info["proc{!s}".format(nprocs)] = procinfo - nprocs += 1 - # Reset - procinfo = OrderedDict() - else: - if len(line.split(":")) == 2: - splitted_line = line.split(":")[1].strip() - procinfo[line.split(":")[0].strip()] = splitted_line +class cpuinfo(object): + """ + Object describing the current CPU's characteristics. It may be + be considered a named tuple, there's no behavior here. + + Fields in the object: + - is_intel (if it's definitely an Intel CPU) + - is_amd (if it's definitely an AMD CPU) + - number_of_cores + It is possible for both is_* fields to be False. + """ + def __init__(self): + self.is_intel = False + self.is_amd = False + self.number_of_cores = 0 + + cpu = self._cpuinfo() + self.is_intel = cpu['proc0']['vendor_id'].lower() == "genuineintel" + self.is_amd = cpu['proc0']['vendor_id'].lower() == "authenticamd" + self.number_of_cores = len(cpu) + + @staticmethod + def _cpuinfo(): + """ + Return the information in /proc/cpuinfo as a dictionary in the following + format: + + cpu_info['proc0']={...} + cpu_info['proc1']={...} + """ + cpu_info = OrderedDict() + procinfo = OrderedDict() + + nprocs = 0 + + with open('/proc/cpuinfo') as cpuinfo_file: + for line in cpuinfo_file: + if not line.strip(): + # end of one processor + cpu_info["proc{!s}".format(nprocs)] = procinfo + nprocs += 1 + # Reset + procinfo = OrderedDict() else: - procinfo[line.split(":")[0].strip()] = "" + if len(line.split(':')) == 2: + splitted_line = line.split(':')[1].strip() + procinfo[line.split(':')[0].strip()] = splitted_line + else: + procinfo[line.split(':')[0].strip()] = '' - return cpu_info + return cpu_info + + +def get_host_initcpio(): + """ + Reads the host system mkinitcpio.conf and returns all + the lines from that file, or an empty list if it does + not exist. + """ + hostfile = "/etc/mkinitcpio.conf" + try: + with open(hostfile, "r") as mkinitcpio_file: + mklins = [x.strip() for x in mkinitcpio_file.readlines()] + except FileNotFoundError: + libcalamares.utils.debug(f"Could not open host file {hostfile}") + mklins = [] + + return mklins def write_mkinitcpio_lines(hooks, modules, files, root_mount_point): @@ -67,52 +116,33 @@ def write_mkinitcpio_lines(hooks, modules, files, root_mount_point): :param files: :param root_mount_point: """ - hostfile = "/etc/mkinitcpio.conf" - try: - with open(hostfile, "r") as mkinitcpio_file: - mklins = [x.strip() for x in mkinitcpio_file.readlines()] - except FileNotFoundError: - libcalamares.utils.debug(f"Could not open host file {hostfile}") - mklins = [] + mklins = get_host_initcpio() - for i in range(len(mklins)): - if mklins[i].startswith("HOOKS"): - joined_hooks = " ".join(hooks) - mklins[i] = 'HOOKS="{!s}"'.format(joined_hooks) - elif mklins[i].startswith("MODULES"): - joined_modules = ' '.join(modules) - mklins[i] = 'MODULES="{!s}"'.format(joined_modules) - elif mklins[i].startswith("FILES"): - joined_files = ' '.join(files) - mklins[i] = 'FILES="{!s}"'.format(joined_files) - - path = os.path.join(root_mount_point, "etc/mkinitcpio.conf") - - with open(path, "w") as mkinitcpio_file: - mkinitcpio_file.write("\n".join(mklins) + "\n") + target_path = os.path.join(root_mount_point, "etc/mkinitcpio.conf") + with open(target_path, "w") as mkinitcpio_file: + for line in mklins: + # Replace HOOKS, MODULES and FILES lines with what we + # have found via find_initcpio_features() + if line.startswith("HOOKS"): + line = 'HOOKS="{!s}"'.format(' '.join(hooks)) + elif line.startswith("MODULES"): + line = 'MODULES="{!s}"'.format(' '.join(modules)) + elif lines.startswith("FILES"): + line = 'FILES="{!s}"'.format(' '.join(files)) + mkinitcpio_file.write(line + "\n") -def detect_plymouth(): +def find_initcpio_features(partitions, root_mount_point): """ - Checks existence (runnability) of plymouth in the target system. + Returns a tuple (hooks, modules, files) needed to support + the given @p partitions (filesystems types, encryption, etc) + in the target. - @return True if plymouth exists in the target, False otherwise + :param partitions: (from GS) + :param root_mount_point: (from GS) + + :return 3-tuple of lists """ - # Used to only check existence of path /usr/bin/plymouth in target - return target_env_call(["sh", "-c", "which plymouth"]) == 0 - - -def modify_mkinitcpio_conf(partitions, root_mount_point): - """ - Modifies mkinitcpio.conf - - :param partitions: - :param root_mount_point: - """ - cpu = cpuinfo() - swap_uuid = "" - btrfs = False - lvm2 = False hooks = [ "base", "udev", @@ -124,10 +154,13 @@ def modify_mkinitcpio_conf(partitions, root_mount_point): ] modules = [] files = [] + + swap_uuid = "" + uses_btrfs = False + uses_lvm2 = False encrypt_hook = False openswap_hook = False unencrypted_separate_boot = False - is_cpu_intel = cpu["proc0"]["vendor_id"].lower() == "genuineintel" # It is important that the plymouth hook comes before any encrypt hook if detect_plymouth(): @@ -146,10 +179,10 @@ def modify_mkinitcpio_conf(partitions, root_mount_point): openswap_hook = True if partition["fs"] == "btrfs": - btrfs = True + uses_btrfs = True if "lvm2" in partition["fs"]: - lvm2 = True + uses_lvm2 = True if partition["mountPoint"] == "/" and "luksMapperName" in partition: encrypt_hook = True @@ -172,7 +205,7 @@ def modify_mkinitcpio_conf(partitions, root_mount_point): ): files.append(f"/{crypto_file}") - if lvm2: + if uses_lvm2: hooks.append("lvm2") if swap_uuid != "": @@ -180,16 +213,12 @@ def modify_mkinitcpio_conf(partitions, root_mount_point): if encrypt_hook and openswap_hook: hooks.extend(["openswap"]) - if btrfs and not is_cpu_intel: - modules.append("crc32c") - - elif btrfs and is_cpu_intel: - modules.append("crc32c-intel") - - elif not btrfs: + if uses_btrfs: + modules.append("crc32c-intel" if cpuinfo().is_intel else "crc32c") + else: hooks.append("fsck") - write_mkinitcpio_lines(hooks, modules, files, root_mount_point) + return (hooks, modules, files) def run(): @@ -210,6 +239,7 @@ def run(): return (_("Configuration Error"), _("No root mount point for
initcpiocfg
.")) - modify_mkinitcpio_conf(partitions, root_mount_point) + hooks, modules, files = find_initcpio_features(partitions, root_mount_point) + write_mkinitcpio_lines(hooks, modules, files, root_mount_point) return None diff --git a/src/modules/initcpiocfg/module.desc b/src/modules/initcpiocfg/module.desc index a4476121b..a64fdf173 100644 --- a/src/modules/initcpiocfg/module.desc +++ b/src/modules/initcpiocfg/module.desc @@ -1,7 +1,13 @@ # SPDX-FileCopyrightText: no # SPDX-License-Identifier: CC0-1.0 +# +# Writes a mkinitcpio.conf into the target system. It copies +# the host system's /etc/mkinitcpio.conf, and replaces any +# HOOKS, MODULES, and FILES lines with calculated values +# based on what the installation (seems to) need. --- type: "job" name: "initcpiocfg" interface: "python" script: "main.py" +noconfig: true diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp index 7140bd790..f1b6efeba 100644 --- a/src/modules/keyboard/Config.cpp +++ b/src/modules/keyboard/Config.cpp @@ -275,7 +275,7 @@ Config::detectCurrentKeyboardLayout() { return; } - cPointerSetter returnToIntial( &m_state, State::Initial ); + cScopedAssignment returnToIntial( &m_state, State::Initial ); m_state = State::Guessing; //### Detect current keyboard layout and variant @@ -427,7 +427,7 @@ Config::guessLocaleKeyboardLayout() { return; } - cPointerSetter returnToIntial( &m_state, State::Initial ); + cScopedAssignment returnToIntial( &m_state, State::Initial ); m_state = State::Guessing; /* Guessing a keyboard layout based on the locale means diff --git a/src/modules/keyboardq/data/Key.qml b/src/modules/keyboardq/data/Key.qml index e85b44f08..e5c766e41 100644 --- a/src/modules/keyboardq/data/Key.qml +++ b/src/modules/keyboardq/data/Key.qml @@ -1,6 +1,7 @@ -/* === This file is part of Calamares - === +/* === This file is part of Calamares - === * - * Copyright 2021, Anke Boersma + * SPDX-FileCopyrightText: 2021 Anke Boersma + * SPDX-License-Identifier: GPL-3.0-or-later * * Calamares is Free Software: see the License-Identifier above. * diff --git a/src/modules/keyboardq/data/Keyboard.qml b/src/modules/keyboardq/data/Keyboard.qml index a804ca9f4..5d1356a82 100644 --- a/src/modules/keyboardq/data/Keyboard.qml +++ b/src/modules/keyboardq/data/Keyboard.qml @@ -1,6 +1,7 @@ -/* === This file is part of Calamares - === +/* === This file is part of Calamares - === * - * Copyright 2021, Anke Boersma + * SPDX-FileCopyrightText: 2021 Anke Boersma + * SPDX-License-Identifier: GPL-3.0-or-later * * Calamares is Free Software: see the License-Identifier above. * diff --git a/src/modules/keyboardq/data/afgani.xml b/src/modules/keyboardq/data/afgani.xml index 356e393f7..8b445b2eb 100644 --- a/src/modules/keyboardq/data/afgani.xml +++ b/src/modules/keyboardq/data/afgani.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/ar.xml b/src/modules/keyboardq/data/ar.xml index 07bd9b087..a0e5ad0c6 100644 --- a/src/modules/keyboardq/data/ar.xml +++ b/src/modules/keyboardq/data/ar.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/de.xml b/src/modules/keyboardq/data/de.xml index 55513157e..883d4dddf 100644 --- a/src/modules/keyboardq/data/de.xml +++ b/src/modules/keyboardq/data/de.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/empty.xml b/src/modules/keyboardq/data/empty.xml index 74e913a07..a8afccb11 100644 --- a/src/modules/keyboardq/data/empty.xml +++ b/src/modules/keyboardq/data/empty.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/en.xml b/src/modules/keyboardq/data/en.xml index 2ab9a344d..3602f1d94 100644 --- a/src/modules/keyboardq/data/en.xml +++ b/src/modules/keyboardq/data/en.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/es.xml b/src/modules/keyboardq/data/es.xml index 6f69c9cbe..3cac9be1c 100644 --- a/src/modules/keyboardq/data/es.xml +++ b/src/modules/keyboardq/data/es.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/fr.xml b/src/modules/keyboardq/data/fr.xml index 0f77c3f06..5328c49a7 100644 --- a/src/modules/keyboardq/data/fr.xml +++ b/src/modules/keyboardq/data/fr.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/generic.xml b/src/modules/keyboardq/data/generic.xml index 7304626c4..1be4ec4c8 100644 --- a/src/modules/keyboardq/data/generic.xml +++ b/src/modules/keyboardq/data/generic.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/generic_qz.xml b/src/modules/keyboardq/data/generic_qz.xml index c896f59ff..b8e36cd79 100644 --- a/src/modules/keyboardq/data/generic_qz.xml +++ b/src/modules/keyboardq/data/generic_qz.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/pt.xml b/src/modules/keyboardq/data/pt.xml index 0142260ee..fa883f04d 100644 --- a/src/modules/keyboardq/data/pt.xml +++ b/src/modules/keyboardq/data/pt.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/ru.xml b/src/modules/keyboardq/data/ru.xml index 38f2b6836..729ff6971 100644 --- a/src/modules/keyboardq/data/ru.xml +++ b/src/modules/keyboardq/data/ru.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/scan.xml b/src/modules/keyboardq/data/scan.xml index 76981f3c1..efdb01de0 100644 --- a/src/modules/keyboardq/data/scan.xml +++ b/src/modules/keyboardq/data/scan.xml @@ -1,10 +1,10 @@ - - - diff --git a/src/modules/keyboardq/data/shift.license b/src/modules/keyboardq/data/shift.svg.license similarity index 100% rename from src/modules/keyboardq/data/shift.license rename to src/modules/keyboardq/data/shift.svg.license diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index f63aed10d..236f63ec3 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -174,7 +174,7 @@ LocalePage::locationChanged( const CalamaresUtils::Locale::TimeZoneData* locatio { return; } - cBoolSetter< true > b( m_blockTzWidgetSet ); + cScopedAssignment b( &m_blockTzWidgetSet, true, false ); // Set region index int index = m_regionCombo->findData( location->region() ); diff --git a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp index 075dadafe..43da3971a 100644 --- a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp +++ b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp @@ -8,7 +8,9 @@ #include "LuksBootKeyFileJob.h" #include "utils/CalamaresUtilsSystem.h" +#include "utils/Entropy.h" #include "utils/Logger.h" +#include "utils/NamedEnum.h" #include "utils/UMask.h" #include "utils/Variant.h" @@ -102,15 +104,29 @@ static bool generateTargetKeyfile() { CalamaresUtils::UMask m( CalamaresUtils::UMask::Safe ); - auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "dd", "bs=512", "count=4", "if=/dev/urandom", QString( "of=%1" ).arg( keyfile ) } ); - if ( r.getExitCode() != 0 ) + + // Get the data + QByteArray entropy; + auto entropySource = CalamaresUtils::getEntropy( 2048, entropy ); + if ( entropySource != CalamaresUtils::EntropySource::URandom ) { - cWarning() << "Could not create LUKS keyfile:" << r.getOutput() << "(exit code" << r.getExitCode() << ')'; + cWarning() << "Could not get entropy from /dev/urandom for LUKS."; return false; } - // Give ample time to check that the file was created correctly - r = CalamaresUtils::System::instance()->targetEnvCommand( { "ls", "-la", "/" } ); + + auto fileResult = CalamaresUtils::System::instance()->createTargetFile( + keyfile, entropy, CalamaresUtils::System::WriteMode::Overwrite ); + entropy.fill( 'A' ); + if ( !fileResult ) + { + cWarning() << "Could not create LUKS keyfile:" << smash( fileResult.code() ); + return false; + } + + // Give ample time to check that the file was created correctly; + // we actually expect ls to return pretty-much-instantly. + auto r = CalamaresUtils::System::instance()->targetEnvCommand( + { "ls", "-la", "/" }, QString(), QString(), std::chrono::seconds( 5 ) ); cDebug() << "In target system after creating LUKS file" << r.getOutput(); return true; } @@ -118,8 +134,10 @@ generateTargetKeyfile() static bool setupLuks( const LuksDevice& d ) { + // Adding the key can take some times, measured around 15 seconds with + // a HDD (spinning rust) and a slow-ish computer. Give it a minute. auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "cryptsetup", "luksAddKey", d.device, keyfile }, QString(), d.passphrase, std::chrono::seconds( 15 ) ); + { "cryptsetup", "luksAddKey", d.device, keyfile }, QString(), d.passphrase, std::chrono::seconds( 60 ) ); if ( r.getExitCode() != 0 ) { cWarning() << "Could not configure LUKS keyfile on" << d.device << ':' << r.getOutput() << "(exit code" diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 54f971f4e..806c0ceb3 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -126,23 +126,22 @@ canBeResized( Partition* candidate, const Logger::Once& o ) return false; } - cDebug() << o << "Checking if" << convenienceName( candidate ) << "can be resized."; if ( !candidate->fileSystem().supportGrow() || !candidate->fileSystem().supportShrink() ) { - cDebug() << Logger::SubEntry << "NO, filesystem" << candidate->fileSystem().name() - << "does not support resize."; + cDebug() << o << "Can not resize" << convenienceName( candidate ) << ", filesystem" + << candidate->fileSystem().name() << "does not support resize."; return false; } if ( isPartitionFreeSpace( candidate ) ) { - cDebug() << Logger::SubEntry << "NO, partition is free space"; + cDebug() << o << "Can not resize" << convenienceName( candidate ) << ", partition is free space"; return false; } if ( candidate->isMounted() ) { - cDebug() << Logger::SubEntry << "NO, partition is mounted"; + cDebug() << o << "Can not resize" << convenienceName( candidate ) << ", partition is mounted"; return false; } @@ -151,14 +150,14 @@ canBeResized( Partition* candidate, const Logger::Once& o ) PartitionTable* table = dynamic_cast< PartitionTable* >( candidate->parent() ); if ( !table ) { - cDebug() << Logger::SubEntry << "NO, no partition table found"; + cDebug() << o << "Can not resize" << convenienceName( candidate ) << ", no partition table found"; return false; } if ( table->numPrimaries() >= table->maxPrimaries() ) { - cDebug() << Logger::SubEntry << "NO, partition table already has" << table->maxPrimaries() - << "primary partitions."; + cDebug() << o << "Can not resize" << convenienceName( candidate ) << ", partition table already has" + << table->maxPrimaries() << "primary partitions."; return false; } } @@ -167,7 +166,8 @@ canBeResized( Partition* candidate, const Logger::Once& o ) double requiredStorageGiB = getRequiredStorageGiB( ok ); if ( !ok ) { - cDebug() << Logger::SubEntry << "NO, requiredStorageGiB is not set correctly."; + cDebug() << o << "Can not resize" << convenienceName( candidate ) + << ", requiredStorageGiB is not set correctly."; return false; } @@ -200,24 +200,25 @@ canBeResized( Partition* candidate, const Logger::Once& o ) bool canBeResized( DeviceModel* dm, const QString& partitionPath, const Logger::Once& o ) { - cDebug() << o << "Checking if" << partitionPath << "can be resized."; - QString partitionWithOs = partitionPath; - if ( partitionWithOs.startsWith( "/dev/" ) ) + if ( partitionPath.startsWith( "/dev/" ) ) { for ( int i = 0; i < dm->rowCount(); ++i ) { Device* dev = dm->deviceForIndex( dm->index( i ) ); - Partition* candidate = CalamaresUtils::Partition::findPartitionByPath( { dev }, partitionWithOs ); + Partition* candidate = CalamaresUtils::Partition::findPartitionByPath( { dev }, partitionPath ); if ( candidate ) { return canBeResized( candidate, o ); } } - cDebug() << Logger::SubEntry << "no Partition* found for" << partitionWithOs; + cWarning() << "Can not resize" << partitionPath << ", no Partition* found."; + return false; + } + else + { + cWarning() << "Can not resize" << partitionPath << ", does not start with /dev"; + return false; } - - cDebug() << Logger::SubEntry << "Partition" << partitionWithOs << "CANNOT BE RESIZED FOR AUTOINSTALL."; - return false; } @@ -250,8 +251,6 @@ lookForFstabEntries( const QString& partitionPath ) { QFile fstabFile( mount.path() + "/etc/fstab" ); - cDebug() << Logger::SubEntry << "reading" << fstabFile.fileName(); - if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { const QStringList fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ).split( '\n' ); @@ -261,10 +260,11 @@ lookForFstabEntries( const QString& partitionPath ) fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) ); } fstabFile.close(); - cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "lines."; + const int lineCount = fstabEntries.count(); std::remove_if( fstabEntries.begin(), fstabEntries.end(), []( const FstabEntry& x ) { return !x.isValid(); } ); - cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries."; + cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries from" << lineCount + << "lines in" << fstabFile.fileName(); } else { @@ -529,7 +529,7 @@ efiFilesystemMinimumSize() QString canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType ) { - cPointerSetter type( fsType ); + cScopedAssignment type( fsType ); if ( fsName.isEmpty() ) { type = FileSystem::Ext4;