Merge branch 'master' of https://github.com/calamares/calamares into development

This commit is contained in:
Philip Müller 2019-06-08 09:48:05 +02:00
commit b2533793c7
17 changed files with 263 additions and 214 deletions

20
CHANGES
View File

@ -3,6 +3,26 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.2.0. The release notes on the changelog -- this log starts with version 3.2.0. The release notes on the
website will have to do for older versions. website will have to do for older versions.
# 3.2.10 (unreleased) #
This release contains contributions from (alphabetically by first name):
## Core ##
- With this release, option *WITH_PYTHONQT* changes default to **off**.
There does not seem to be any serious use of the PythonQt API and
the UI opportunities it offers, so begin the process of deprecating
and removing that. Sometime in the future, QML pages will fill the
gap for easily-prototyped-yet-slick UI elements.
- A crash when no *finished* page (or rather, no page at all) is
configured after the last *exec* section of the sequence has been
solved. The *finished* page can be left out (but then you don't get
the restart-now functionality).
## Modules ##
# 3.2.9 (2019-06-03) # # 3.2.9 (2019-06-03) #
This release contains contributions from (alphabetically by first name): This release contains contributions from (alphabetically by first name):

View File

@ -37,10 +37,10 @@
cmake_minimum_required( VERSION 3.2 FATAL_ERROR ) cmake_minimum_required( VERSION 3.2 FATAL_ERROR )
project( CALAMARES project( CALAMARES
VERSION 3.2.9 VERSION 3.2.10
LANGUAGES C CXX ) LANGUAGES C CXX )
set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development
### OPTIONS ### OPTIONS
# #
@ -48,7 +48,7 @@ option( INSTALL_CONFIG "Install configuration files" OFF )
option( INSTALL_POLKIT "Install Polkit configuration" ON ) option( INSTALL_POLKIT "Install Polkit configuration" ON )
option( BUILD_TESTING "Build the testing tree." ON ) option( BUILD_TESTING "Build the testing tree." ON )
option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON )
option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." ON ) option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." OFF )
option( WITH_KF5Crash "Enable crash reporting with KCrash." ON ) option( WITH_KF5Crash "Enable crash reporting with KCrash." ON )

View File

@ -854,17 +854,17 @@ El instalador terminará y se perderán todos los cambios.</translation>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="34"/> <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="34"/>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/> <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/>
<source>Deactivate volume group named %1.</source> <source>Deactivate volume group named %1.</source>
<translation type="unfinished"/> <translation>Desactivar el grupo de volúmenes llamado%1.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="41"/> <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="41"/>
<source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source> <source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/> <translation>Desactivar el grupo de volúmenes llamado&lt;strong&gt;% 1&lt;/strong&gt;.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="61"/> <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="61"/>
<source>The installer failed to deactivate a volume group named %1.</source> <source>The installer failed to deactivate a volume group named %1.</source>
<translation type="unfinished"/> <translation>El instalador no pudo desactivar un grupo de volúmenes llamado%1.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1098,7 +1098,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.ui" line="95"/> <location filename="../src/modules/finished/FinishedPage.ui" line="95"/>
<source>&lt;Restart checkbox tooltip&gt;</source> <source>&lt;Restart checkbox tooltip&gt;</source>
<translation type="unfinished"/> <translation>&lt;Restart checkbox tooltip&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.ui" line="98"/> <location filename="../src/modules/finished/FinishedPage.ui" line="98"/>
@ -1108,12 +1108,12 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="54"/> <location filename="../src/modules/finished/FinishedPage.cpp" line="54"/>
<source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been set up on your computer.&lt;br/&gt;You may now start using your new system.</source> <source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been set up on your computer.&lt;br/&gt;You may now start using your new system.</source>
<translation type="unfinished"/> <translation>&lt;h1&gt;Todo listo.&lt;/h1&gt;&lt;br/&gt;% 1 se ha configurado en su computadora. &lt;br/&gt;Ahora puede comenzar a usar su nuevo sistema.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="58"/> <location filename="../src/modules/finished/FinishedPage.cpp" line="58"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style=&quot;font-style:italic;&quot;&gt;Done&lt;/span&gt; or close the setup program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style=&quot;font-style:italic;&quot;&gt;Done&lt;/span&gt; or close the setup program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/> <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cuando esta casilla está marcada, su sistema se reiniciará inmediatamente cuando haga clic en &lt;span style=&quot;font-style:italic;&quot;&gt;Listo&lt;/span&gt; o cierre el programa de instalación.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="66"/> <location filename="../src/modules/finished/FinishedPage.cpp" line="66"/>

View File

@ -63,7 +63,7 @@
<message> <message>
<location filename="../src/libcalamaresui/utils/DebugWindow.ui" line="24"/> <location filename="../src/libcalamaresui/utils/DebugWindow.ui" line="24"/>
<source>GlobalStorage</source> <source>GlobalStorage</source>
<translation type="unfinished"/> <translation>Globaali-tallennus</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/utils/DebugWindow.ui" line="34"/> <location filename="../src/libcalamaresui/utils/DebugWindow.ui" line="34"/>
@ -1392,63 +1392,63 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<location filename="../src/modules/license/LicenseWidget.cpp" line="122"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="122"/>
<source>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</source> <source>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</source>
<extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment> <extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1 ajuri&lt;/strong&gt;&lt;br/&gt;- %2</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="129"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="129"/>
<source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source> <source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment> <extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1 näytönohjaimet&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;- %2&lt;/font&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="135"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="135"/>
<source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source> <source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1 selaimen laajennus&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;- %2&lt;/font&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="141"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="141"/>
<source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source> <source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1 kodekki&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;- %2&lt;/font&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="147"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="147"/>
<source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source> <source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1 paketti&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;- %2&lt;/font&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="153"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="153"/>
<source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source> <source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/> <translation>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;- %2&lt;/font&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="191"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="191"/>
<source>Shows the complete license text</source> <source>Shows the complete license text</source>
<translation type="unfinished"/> <translation>Näyttää täydellisen lisenssin tekstin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="192"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="192"/>
<source>Hide license text</source> <source>Hide license text</source>
<translation type="unfinished"/> <translation>Piilota lisenssin teksti</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="196"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="196"/>
<source>Show license agreement</source> <source>Show license agreement</source>
<translation type="unfinished"/> <translation>Näytä lisenssisopimus</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="197"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="197"/>
<source>Hide license agreement</source> <source>Hide license agreement</source>
<translation type="unfinished"/> <translation>Piilota lisenssisopimus</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="201"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="201"/>
<source>Opens the license agreement in a browser window.</source> <source>Opens the license agreement in a browser window.</source>
<translation type="unfinished"/> <translation>Avaa lisenssisopimus selaimessa.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="202"/> <location filename="../src/modules/license/LicenseWidget.cpp" line="202"/>
<source>&lt;a href=&quot;%1&quot;&gt;View license agreement&lt;/a&gt;</source> <source>&lt;a href=&quot;%1&quot;&gt;View license agreement&lt;/a&gt;</source>
<translation type="unfinished"/> <translation>&lt;a href=&quot;%1&quot;&gt;Näytä lisenssisopimus&lt;/a&gt;</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1456,12 +1456,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/locale/LocalePage.cpp" line="396"/> <location filename="../src/modules/locale/LocalePage.cpp" line="396"/>
<source>The system language will be set to %1.</source> <source>The system language will be set to %1.</source>
<translation type="unfinished"/> <translation>Järjestelmän kielen asetuksena on %1.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/locale/LocalePage.cpp" line="397"/> <location filename="../src/modules/locale/LocalePage.cpp" line="397"/>
<source>The numbers and dates locale will be set to %1.</source> <source>The numbers and dates locale will be set to %1.</source>
<translation type="unfinished"/> <translation>Numerot ja päivämäärät, paikallinen asetus on %1.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/locale/LocalePage.cpp" line="219"/> <location filename="../src/modules/locale/LocalePage.cpp" line="219"/>
@ -1513,12 +1513,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/netinstall/NetInstallPage.cpp" line="84"/> <location filename="../src/modules/netinstall/NetInstallPage.cpp" line="84"/>
<source>Network Installation. (Disabled: Unable to fetch package lists, check your network connection)</source> <source>Network Installation. (Disabled: Unable to fetch package lists, check your network connection)</source>
<translation type="unfinished"/> <translation>Verkkoasennus. (Ei käytössä: Pakettiluetteloita ei voi hakea, tarkista verkkoyhteys)</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/netinstall/NetInstallPage.cpp" line="94"/> <location filename="../src/modules/netinstall/NetInstallPage.cpp" line="94"/>
<source>Network Installation. (Disabled: Received invalid groups data)</source> <source>Network Installation. (Disabled: Received invalid groups data)</source>
<translation type="unfinished"/> <translation>Verkkoasennus. (Ei käytössä: Vastaanotettiin virheellisiä ryhmän tietoja)</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1534,17 +1534,17 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/oemid/OEMPage.ui" line="28"/> <location filename="../src/modules/oemid/OEMPage.ui" line="28"/>
<source>Ba&amp;tch:</source> <source>Ba&amp;tch:</source>
<translation type="unfinished"/> <translation>Ba&amp;tch:</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/oemid/OEMPage.ui" line="38"/> <location filename="../src/modules/oemid/OEMPage.ui" line="38"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a batch-identifier here. This will be stored in the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a batch-identifier here. This will be stored in the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/> <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Syötä erän tunniste tähän. Tämä tallennetaan kohdejärjestelmään.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/oemid/OEMPage.ui" line="48"/> <location filename="../src/modules/oemid/OEMPage.ui" line="48"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM Configuration&lt;/h1&gt;&lt;p&gt;Calamares will use OEM settings while configuring the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM Configuration&lt;/h1&gt;&lt;p&gt;Calamares will use OEM settings while configuring the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/> <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM asetukset&lt;/h1&gt;&lt;p&gt;Calamares käyttää OEM-asetuksia määritettäessä kohdejärjestelmää.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1557,7 +1557,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/oemid/OEMViewStep.cpp" line="120"/> <location filename="../src/modules/oemid/OEMViewStep.cpp" line="120"/>
<source>Set the OEM Batch Identifier to &lt;code&gt;%1&lt;/code&gt;.</source> <source>Set the OEM Batch Identifier to &lt;code&gt;%1&lt;/code&gt;.</source>
<translation type="unfinished"/> <translation>Aseta OEM valmistajan erän tunnus &lt;code&gt;%1&lt;/code&gt;.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1580,92 +1580,92 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="176"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="176"/>
<source>Memory allocation error when setting &apos;%1&apos;</source> <source>Memory allocation error when setting &apos;%1&apos;</source>
<translation type="unfinished"/> <translation>Muistin varausvirhe asetettaessa &apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="180"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="180"/>
<source>Memory allocation error</source> <source>Memory allocation error</source>
<translation type="unfinished"/> <translation>Muistin varausvirhe</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="182"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="182"/>
<source>The password is the same as the old one</source> <source>The password is the same as the old one</source>
<translation type="unfinished"/> <translation>Salasana on sama kuin vanha</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="184"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="184"/>
<source>The password is a palindrome</source> <source>The password is a palindrome</source>
<translation type="unfinished"/> <translation>Salasana on palindromi</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="186"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="186"/>
<source>The password differs with case changes only</source> <source>The password differs with case changes only</source>
<translation type="unfinished"/> <translation>Salasana eroaa vain vähäisin muutoksin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="188"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="188"/>
<source>The password is too similar to the old one</source> <source>The password is too similar to the old one</source>
<translation type="unfinished"/> <translation>Salasana on liian samanlainen kuin vanha</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="190"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="190"/>
<source>The password contains the user name in some form</source> <source>The password contains the user name in some form</source>
<translation type="unfinished"/> <translation>Salasana sisältää jonkin käyttäjänimen</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="192"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="192"/>
<source>The password contains words from the real name of the user in some form</source> <source>The password contains words from the real name of the user in some form</source>
<translation type="unfinished"/> <translation>Salasana sisältää sanoja käyttäjän todellisesta nimestä jossain muodossa</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="194"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="194"/>
<source>The password contains forbidden words in some form</source> <source>The password contains forbidden words in some form</source>
<translation type="unfinished"/> <translation>Salasana sisältää kiellettyjä sanoja</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="197"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="197"/>
<source>The password contains less than %1 digits</source> <source>The password contains less than %1 digits</source>
<translation type="unfinished"/> <translation>Salasana sisältää vähemmän kuin %1 numeroa</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="198"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="198"/>
<source>The password contains too few digits</source> <source>The password contains too few digits</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian vähän numeroita</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/>
<source>The password contains less than %1 uppercase letters</source> <source>The password contains less than %1 uppercase letters</source>
<translation type="unfinished"/> <translation>Salasana sisältää vähemmän kuin %1 isoja kirjaimia</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="202"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="202"/>
<source>The password contains too few uppercase letters</source> <source>The password contains too few uppercase letters</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian vähän isoja kirjaimia</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/>
<source>The password contains less than %1 lowercase letters</source> <source>The password contains less than %1 lowercase letters</source>
<translation type="unfinished"/> <translation>Salasana sisältää vähemmän kuin %1 pieniä kirjaimia</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="206"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="206"/>
<source>The password contains too few lowercase letters</source> <source>The password contains too few lowercase letters</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian vähän pieniä kirjaimia</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/>
<source>The password contains less than %1 non-alphanumeric characters</source> <source>The password contains less than %1 non-alphanumeric characters</source>
<translation type="unfinished"/> <translation>Salasanassa on vähemmän kuin %1 erikoismerkkiä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="210"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="210"/>
<source>The password contains too few non-alphanumeric characters</source> <source>The password contains too few non-alphanumeric characters</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian vähän erikoismerkkejä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="213"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="213"/>
<source>The password is shorter than %1 characters</source> <source>The password is shorter than %1 characters</source>
<translation type="unfinished"/> <translation>Salasana on lyhyempi kuin %1 merkkiä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/>
@ -1675,47 +1675,47 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="216"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="216"/>
<source>The password is just rotated old one</source> <source>The password is just rotated old one</source>
<translation type="unfinished"/> <translation>Salasana on vain vanhan pyöritystä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="219"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="219"/>
<source>The password contains less than %1 character classes</source> <source>The password contains less than %1 character classes</source>
<translation type="unfinished"/> <translation>Salasana sisältää vähemmän kuin %1 merkkiluokkaa</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/>
<source>The password does not contain enough character classes</source> <source>The password does not contain enough character classes</source>
<translation type="unfinished"/> <translation>Salasana ei sisällä tarpeeksi merkkiluokkia</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="223"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="223"/>
<source>The password contains more than %1 same characters consecutively</source> <source>The password contains more than %1 same characters consecutively</source>
<translation type="unfinished"/> <translation>Salasana sisältää enemmän kuin %1 samaa merkkiä peräkkäin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="224"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="224"/>
<source>The password contains too many same characters consecutively</source> <source>The password contains too many same characters consecutively</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian monta samaa merkkiä peräkkäin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="227"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="227"/>
<source>The password contains more than %1 characters of the same class consecutively</source> <source>The password contains more than %1 characters of the same class consecutively</source>
<translation type="unfinished"/> <translation>Salasana sisältää enemmän kuin %1 merkkiä samasta luokasta peräkkäin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/>
<source>The password contains too many characters of the same class consecutively</source> <source>The password contains too many characters of the same class consecutively</source>
<translation type="unfinished"/> <translation>Salasana sisältää liian monta saman luokan merkkiä peräkkäin</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="231"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="231"/>
<source>The password contains monotonic sequence longer than %1 characters</source> <source>The password contains monotonic sequence longer than %1 characters</source>
<translation type="unfinished"/> <translation>Salasana sisältää monotonisen merkkijonon, joka on pidempi kuin %1 merkkiä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
<source>The password contains too long of a monotonic character sequence</source> <source>The password contains too long of a monotonic character sequence</source>
<translation type="unfinished"/> <translation>Salasanassa on liian pitkä monotoninen merkkijono</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="234"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="234"/>
@ -1725,72 +1725,72 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="236"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="236"/>
<source>Cannot obtain random numbers from the RNG device</source> <source>Cannot obtain random numbers from the RNG device</source>
<translation type="unfinished"/> <translation>Satunnaislukuja ei voi saada RNG-laitteesta</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="238"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="238"/>
<source>Password generation failed - required entropy too low for settings</source> <source>Password generation failed - required entropy too low for settings</source>
<translation type="unfinished"/> <translation>Salasanojen luonti epäonnistui - pakollinen vähimmäistaso liian alhainen asetuksia varten</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="243"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="243"/>
<source>The password fails the dictionary check - %1</source> <source>The password fails the dictionary check - %1</source>
<translation type="unfinished"/> <translation>Salasana epäonnistui sanaston tarkistuksessa -%1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="245"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="245"/>
<source>The password fails the dictionary check</source> <source>The password fails the dictionary check</source>
<translation type="unfinished"/> <translation>Salasana epäonnistui sanaston tarkistuksessa</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="249"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="249"/>
<source>Unknown setting - %1</source> <source>Unknown setting - %1</source>
<translation type="unfinished"/> <translation>Tuntematon asetus - %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="253"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="253"/>
<source>Unknown setting</source> <source>Unknown setting</source>
<translation type="unfinished"/> <translation>Tuntematon asetus</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="257"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="257"/>
<source>Bad integer value of setting - %1</source> <source>Bad integer value of setting - %1</source>
<translation type="unfinished"/> <translation>Asetuksen virheellinen kokonaisluku - %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/>
<source>Bad integer value</source> <source>Bad integer value</source>
<translation type="unfinished"/> <translation>Virheellinen kokonaisluku</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/>
<source>Setting %1 is not of integer type</source> <source>Setting %1 is not of integer type</source>
<translation type="unfinished"/> <translation>Asetus %1 ei ole kokonaisluku</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/>
<source>Setting is not of integer type</source> <source>Setting is not of integer type</source>
<translation type="unfinished"/> <translation>Asetus ei ole kokonaisluku</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="273"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="273"/>
<source>Setting %1 is not of string type</source> <source>Setting %1 is not of string type</source>
<translation type="unfinished"/> <translation>Asetus %1 ei ole merkkijono</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="277"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="277"/>
<source>Setting is not of string type</source> <source>Setting is not of string type</source>
<translation type="unfinished"/> <translation>Asetus ei ole merkkijono</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="279"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="279"/>
<source>Opening the configuration file failed</source> <source>Opening the configuration file failed</source>
<translation type="unfinished"/> <translation>Määritystiedoston avaaminen epäonnistui</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="281"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="281"/>
<source>The configuration file is malformed</source> <source>The configuration file is malformed</source>
<translation type="unfinished"/> <translation>Määritystiedosto on väärin muotoiltu</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="283"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="283"/>
@ -1861,12 +1861,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/users/page_usersetup.ui" line="466"/> <location filename="../src/modules/users/page_usersetup.ui" line="466"/>
<source>Log in automatically without asking for the password.</source> <source>Log in automatically without asking for the password.</source>
<translation type="unfinished"/> <translation>Kirjaudu automaattisesti ilman salasanaa.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/page_usersetup.ui" line="473"/> <location filename="../src/modules/users/page_usersetup.ui" line="473"/>
<source>Use the same password for the administrator account.</source> <source>Use the same password for the administrator account.</source>
<translation type="unfinished"/> <translation>Käytä pääkäyttäjän tilillä samaa salasanaa.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/page_usersetup.ui" line="496"/> <location filename="../src/modules/users/page_usersetup.ui" line="496"/>
@ -1968,7 +1968,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="22"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="22"/>
<source>Storage de&amp;vice:</source> <source>Storage de&amp;vice:</source>
<translation type="unfinished"/> <translation>Tallennus&amp;laite:</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="51"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="51"/>
@ -1983,7 +1983,7 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="107"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="107"/>
<source>Cre&amp;ate</source> <source>Cre&amp;ate</source>
<translation type="unfinished"/> <translation>Luo&amp;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="114"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="114"/>
@ -1998,27 +1998,27 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="132"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="132"/>
<source>New Volume Group</source> <source>New Volume Group</source>
<translation type="unfinished"/> <translation>Uusi aseman ryhmä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="139"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="139"/>
<source>Resize Volume Group</source> <source>Resize Volume Group</source>
<translation type="unfinished"/> <translation>Muuta kokoa aseman-ryhmässä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="146"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="146"/>
<source>Deactivate Volume Group</source> <source>Deactivate Volume Group</source>
<translation type="unfinished"/> <translation>Poista asemaryhmä käytöstä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="153"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="153"/>
<source>Remove Volume Group</source> <source>Remove Volume Group</source>
<translation type="unfinished"/> <translation>Poista asemaryhmä</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="180"/> <location filename="../src/modules/partition/gui/PartitionPage.ui" line="180"/>
<source>I&amp;nstall boot loader on:</source> <source>I&amp;nstall boot loader on:</source>
<translation type="unfinished"/> <translation>A&amp;senna käynnistyslatain:</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="209"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="209"/>
@ -2028,12 +2028,12 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="238"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="238"/>
<source>Can not create new partition</source> <source>Can not create new partition</source>
<translation type="unfinished"/> <translation>Ei voi luoda uutta osiota</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="239"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="239"/>
<source>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.</source> <source>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.</source>
<translation type="unfinished"/> <translation>%1 osio-taulukossa on jo %2 ensisijaista osiota, eikä sitä voi lisätä. Poista yksi ensisijainen osio ja lisää laajennettu osio.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -2518,7 +2518,7 @@ Ulostulo:
<message> <message>
<location filename="../src/modules/partition/gui/ResizeVolumeGroupDialog.cpp" line="39"/> <location filename="../src/modules/partition/gui/ResizeVolumeGroupDialog.cpp" line="39"/>
<source>Resize Volume Group</source> <source>Resize Volume Group</source>
<translation type="unfinished"/> <translation>Muuta kokoa aseman-ryhmässä</translation>
</message> </message>
</context> </context>
<context> <context>

View File

@ -120,7 +120,7 @@ msgstr ""
#: src/modules/unpackfs/main.py:326 #: src/modules/unpackfs/main.py:326
msgid "Bad mount point for root partition" msgid "Bad mount point for root partition"
msgstr "" msgstr "Huono kiinnityspiste root-osioon"
#: src/modules/unpackfs/main.py:327 #: src/modules/unpackfs/main.py:327
msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
@ -129,7 +129,7 @@ msgstr ""
#: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347 #: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347
#: src/modules/unpackfs/main.py:352 #: src/modules/unpackfs/main.py:352
msgid "Bad unsquash configuration" msgid "Bad unsquash configuration"
msgstr "" msgstr "Huono epäpuhdas kokoonpano"
#: src/modules/unpackfs/main.py:341 #: src/modules/unpackfs/main.py:341
msgid "The filesystem for \"{}\" ({}) is not supported" msgid "The filesystem for \"{}\" ({}) is not supported"
@ -169,19 +169,19 @@ msgstr ""
#: src/modules/displaymanager/main.py:602 #: src/modules/displaymanager/main.py:602
msgid "Cannot configure LightDM" msgid "Cannot configure LightDM"
msgstr "" msgstr "LightDM määritysvirhe"
#: src/modules/displaymanager/main.py:603 #: src/modules/displaymanager/main.py:603
msgid "No LightDM greeter installed." msgid "No LightDM greeter installed."
msgstr "" msgstr "LightDM ei ole asennettu."
#: src/modules/displaymanager/main.py:634 #: src/modules/displaymanager/main.py:634
msgid "Cannot write SLIM configuration file" msgid "Cannot write SLIM configuration file"
msgstr "" msgstr "SLIM-määritystiedostoa ei voi kirjoittaa"
#: src/modules/displaymanager/main.py:635 #: src/modules/displaymanager/main.py:635
msgid "SLIM config file {!s} does not exist" msgid "SLIM config file {!s} does not exist"
msgstr "" msgstr "SLIM-määritystiedostoa {!s} ei ole olemassa"
#: src/modules/displaymanager/main.py:750 #: src/modules/displaymanager/main.py:750
msgid "No display managers selected for the displaymanager module." msgid "No display managers selected for the displaymanager module."
@ -195,11 +195,11 @@ msgstr ""
#: src/modules/displaymanager/main.py:831 #: src/modules/displaymanager/main.py:831
msgid "Display manager configuration was incomplete" msgid "Display manager configuration was incomplete"
msgstr "" msgstr "Näytönhallinnan kokoonpano oli puutteellinen"
#: src/modules/initcpiocfg/main.py:36 #: src/modules/initcpiocfg/main.py:36
msgid "Configuring mkinitcpio." msgid "Configuring mkinitcpio."
msgstr "" msgstr "Määritetään mkinitcpio."
#: src/modules/initcpiocfg/main.py:192 #: src/modules/initcpiocfg/main.py:192
#: src/modules/luksopenswaphookcfg/main.py:100 #: src/modules/luksopenswaphookcfg/main.py:100
@ -215,7 +215,7 @@ msgstr ""
#: src/modules/initcpio/main.py:47 #: src/modules/initcpio/main.py:47
msgid "Process Failed" msgid "Process Failed"
msgstr "" msgstr "Prosessi epäonnistui"
#: src/modules/initcpio/main.py:48 #: src/modules/initcpio/main.py:48
msgid "" msgid ""
@ -229,7 +229,7 @@ msgstr ""
#: src/modules/rawfs/main.py:35 #: src/modules/rawfs/main.py:35
msgid "Installing data." msgid "Installing data."
msgstr "" msgstr "Asennetaan tietoja."
#: src/modules/services-openrc/main.py:38 #: src/modules/services-openrc/main.py:38
msgid "Configure OpenRC services" msgid "Configure OpenRC services"

View File

@ -44,7 +44,7 @@ public:
} }
virtual ~JobThread() override; virtual ~JobThread() override;
void setJobs( const JobList& jobs ) void setJobs( const JobList& jobs )
{ {
m_jobs = jobs; m_jobs = jobs;
@ -157,6 +157,14 @@ JobQueue::JobQueue( QObject* parent )
JobQueue::~JobQueue() JobQueue::~JobQueue()
{ {
if ( m_thread->isRunning() )
{
m_thread->terminate();
if ( !m_thread->wait(300) )
cError() << "Could not terminate job thread (expect a crash now).";
delete m_thread;
}
delete m_storage; delete m_storage;
} }

View File

@ -48,10 +48,8 @@ ProcessJob::~ProcessJob()
QString QString
ProcessJob::prettyName() const ProcessJob::prettyName() const
{ {
//TODO: show something more meaningful return ( m_runInChroot ? tr( "Run command '%1' in target system." ) : tr( " Run command '%1'." ) )
return tr( "Run command %1 %2" ) .arg( m_command );
.arg( m_command )
.arg( m_runInChroot ? "in chroot." : " ." );
} }
@ -67,83 +65,23 @@ ProcessJob::prettyStatusMessage() const
JobResult JobResult
ProcessJob::exec() ProcessJob::exec()
{ {
int ec = 0; using CalamaresUtils::System;
QString output;
if ( m_runInChroot ) if ( m_runInChroot )
ec = CalamaresUtils::System::instance()-> return CalamaresUtils::System::instance()->
targetEnvOutput( m_command, targetEnvCommand( { m_command },
output,
m_workingPath, m_workingPath,
QString(), QString(),
m_timeoutSec ); m_timeoutSec )
.explainProcess( m_command, m_timeoutSec );
else else
ec = callOutput( m_command, return
output, System::runCommand( System::RunLocation::RunInHost,
m_workingPath, { "/bin/sh", "-c", m_command },
QString(), m_workingPath,
m_timeoutSec ); QString(),
m_timeoutSec )
return CalamaresUtils::ProcessResult::explainProcess( ec, m_command, output, m_timeoutSec ); .explainProcess( m_command, m_timeoutSec );
}
int
ProcessJob::callOutput( const QString& command,
QString& output,
const QString& workingPath,
const QString& stdInput,
int timeoutSec )
{
output.clear();
QProcess process;
process.setProgram( "/bin/sh" );
process.setArguments( { "-c", command } );
process.setProcessChannelMode( QProcess::MergedChannels );
if ( !workingPath.isEmpty() )
{
if ( QDir( workingPath ).exists() )
process.setWorkingDirectory( QDir( workingPath ).absolutePath() );
else
{
cWarning() << "Invalid working directory:" << workingPath;
return -3;
}
}
cDebug() << "Running" << command;
process.start();
if ( !process.waitForStarted() )
{
cWarning() << "Process failed to start" << process.error();
return -2;
}
if ( !stdInput.isEmpty() )
{
process.write( stdInput.toLocal8Bit() );
process.closeWriteChannel();
}
if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) )
{
cWarning() << "Timed out. output so far:";
output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() );
cWarning() << output;
return -4;
}
output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() );
if ( process.exitStatus() == QProcess::CrashExit )
{
cWarning() << "Process crashed";
return -1;
}
cDebug() << "Finished. Exit code:" << process.exitCode();
return process.exitCode();
} }
} // namespace Calamares } // namespace Calamares

View File

@ -1,7 +1,7 @@
/* === This file is part of Calamares - <https://github.com/calamares> === /* === This file is part of Calamares - <https://github.com/calamares> ===
* *
* Copyright 2014, Teo Mrnjavac <teo@kde.org> * Copyright 2014, Teo Mrnjavac <teo@kde.org>
* Copyright 2017-2018, Adriaan de Groot <groot@kde.org> * Copyright 2017-2019, Adriaan de Groot <groot@kde.org>
* *
* Calamares is free software: you can redistribute it and/or modify * Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -40,11 +40,6 @@ public:
JobResult exec() override; JobResult exec() override;
private: private:
int callOutput( const QString& command,
QString& output,
const QString& workingPath = QString(),
const QString& stdInput = QString(),
int timeoutSec = 0 );
QString m_command; QString m_command;
QString m_workingPath; QString m_workingPath;
bool m_runInChroot; bool m_runInChroot;

View File

@ -18,9 +18,12 @@
#include "Tests.h" #include "Tests.h"
#include "utils/CalamaresUtilsSystem.h"
#include "utils/Logger.h" #include "utils/Logger.h"
#include "utils/Yaml.h" #include "utils/Yaml.h"
#include <QTemporaryFile>
#include <QtTest/QtTest> #include <QtTest/QtTest>
QTEST_GUILESS_MAIN( LibCalamaresTests ) QTEST_GUILESS_MAIN( LibCalamaresTests )
@ -113,3 +116,45 @@ LibCalamaresTests::testLoadSaveYamlExtended()
} }
QFile::remove( "out.yaml" ); QFile::remove( "out.yaml" );
} }
void
LibCalamaresTests::testCommands()
{
using CalamaresUtils::System;
auto r = System::runCommand(
System::RunLocation::RunInHost,
{ "/bin/ls", "/tmp" }
);
QVERIFY( r.getExitCode() == 0 );
QTemporaryFile tf( "/tmp/calamares-test-XXXXXX" );
QVERIFY( tf.open() );
QVERIFY( !tf.fileName().isEmpty() );
QFileInfo tfn( tf.fileName() );
QVERIFY( !r.getOutput().contains( tfn.fileName() ) );
// Run ls again, now that the file exists
r = System::runCommand(
System::RunLocation::RunInHost,
{ "/bin/ls", "/tmp" }
);
QVERIFY( r.getOutput().contains( tfn.fileName() ) );
// .. and without a working directory set, assume builddir != /tmp
r = System::runCommand(
System::RunLocation::RunInHost,
{ "/bin/ls" }
);
QVERIFY( !r.getOutput().contains( tfn.fileName() ) );
r = System::runCommand(
System::RunLocation::RunInHost,
{ "/bin/ls" },
"/tmp"
);
QVERIFY( r.getOutput().contains( tfn.fileName() ) );
}

View File

@ -34,6 +34,8 @@ private Q_SLOTS:
void testLoadSaveYaml(); // Just settings.conf void testLoadSaveYaml(); // Just settings.conf
void testLoadSaveYamlExtended(); // Do a find() in the src dir void testLoadSaveYamlExtended(); // Do a find() in the src dir
void testCommands();
}; };
#endif #endif

View File

@ -114,14 +114,24 @@ System::mount( const QString& devicePath,
const QString& options ) const QString& options )
{ {
if ( devicePath.isEmpty() || mountPoint.isEmpty() ) if ( devicePath.isEmpty() || mountPoint.isEmpty() )
return -3; {
if ( devicePath.isEmpty() )
cWarning() << "Can't mount an empty device.";
if ( mountPoint.isEmpty() )
cWarning() << "Can't mount on an empty mountpoint.";
return static_cast<int>(ProcessResult::Code::NoWorkingDirectory);
}
QDir mountPointDir( mountPoint ); QDir mountPointDir( mountPoint );
if ( !mountPointDir.exists() ) if ( !mountPointDir.exists() )
{ {
bool ok = mountPointDir.mkpath( mountPoint ); bool ok = mountPointDir.mkpath( mountPoint );
if ( !ok ) if ( !ok )
return -3; {
cWarning() << "Could not create mountpoint" << mountPoint;
return static_cast<int>(ProcessResult::Code::NoWorkingDirectory);
}
} }
QString program( "mount" ); QString program( "mount" );
@ -146,15 +156,13 @@ System::runCommand(
{ {
QString output; QString output;
if ( !Calamares::JobQueue::instance() ) Calamares::GlobalStorage* gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
return -3;
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
if ( ( location == System::RunLocation::RunInTarget ) && if ( ( location == System::RunLocation::RunInTarget ) &&
( !gs || !gs->contains( "rootMountPoint" ) ) ) ( !gs || !gs->contains( "rootMountPoint" ) ) )
{ {
cWarning() << "No rootMountPoint in global storage"; cWarning() << "No rootMountPoint in global storage";
return -3; return ProcessResult::Code::NoWorkingDirectory;
} }
QProcess process; QProcess process;
@ -167,7 +175,7 @@ System::runCommand(
if ( !QDir( destDir ).exists() ) if ( !QDir( destDir ).exists() )
{ {
cWarning() << "rootMountPoint points to a dir which does not exist"; cWarning() << "rootMountPoint points to a dir which does not exist";
return -3; return ProcessResult::Code::NoWorkingDirectory;
} }
program = "chroot"; program = "chroot";
@ -189,8 +197,10 @@ System::runCommand(
if ( QDir( workingPath ).exists() ) if ( QDir( workingPath ).exists() )
process.setWorkingDirectory( QDir( workingPath ).absolutePath() ); process.setWorkingDirectory( QDir( workingPath ).absolutePath() );
else else
{
cWarning() << "Invalid working directory:" << workingPath; cWarning() << "Invalid working directory:" << workingPath;
return -3; return ProcessResult::Code::NoWorkingDirectory;
}
} }
cDebug() << "Running" << program << RedactedList( arguments ); cDebug() << "Running" << program << RedactedList( arguments );
@ -198,20 +208,20 @@ System::runCommand(
if ( !process.waitForStarted() ) if ( !process.waitForStarted() )
{ {
cWarning() << "Process failed to start" << process.error(); cWarning() << "Process failed to start" << process.error();
return -2; return ProcessResult::Code::FailedToStart;
} }
if ( !stdInput.isEmpty() ) if ( !stdInput.isEmpty() )
{ {
process.write( stdInput.toLocal8Bit() ); process.write( stdInput.toLocal8Bit() );
process.closeWriteChannel();
} }
process.closeWriteChannel();
if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) ) if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) )
{ {
cWarning().noquote().nospace() << "Timed out. Output so far:\n" << cWarning().noquote().nospace() << "Timed out. Output so far:\n" <<
process.readAllStandardOutput(); process.readAllStandardOutput();
return -4; return ProcessResult::Code::TimedOut;
} }
output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() ); output.append( QString::fromLocal8Bit( process.readAllStandardOutput() ).trimmed() );
@ -219,12 +229,13 @@ System::runCommand(
if ( process.exitStatus() == QProcess::CrashExit ) if ( process.exitStatus() == QProcess::CrashExit )
{ {
cWarning().noquote().nospace() << "Process crashed. Output so far:\n" << output; cWarning().noquote().nospace() << "Process crashed. Output so far:\n" << output;
return -1; return ProcessResult::Code::Crashed;
} }
auto r = process.exitCode(); auto r = process.exitCode();
cDebug() << "Finished. Exit code:" << r; cDebug() << "Finished. Exit code:" << r;
if ( ( r != 0 ) || Calamares::Settings::instance()->debugMode() ) bool showDebug = ( !Calamares::Settings::instance() ) || ( Calamares::Settings::instance()->debugMode() );
if ( ( r != 0 ) || showDebug )
{ {
cDebug() << "Target cmd:" << RedactedList( args ); cDebug() << "Target cmd:" << RedactedList( args );
cDebug().noquote().nospace() << "Target output:\n" << output; cDebug().noquote().nospace() << "Target output:\n" << output;
@ -306,22 +317,22 @@ ProcessResult::explainProcess( int ec, const QString& command, const QString& ou
? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command.") ? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command.")
: (QCoreApplication::translate( "ProcessResult", "\nOutput:\n") + output); : (QCoreApplication::translate( "ProcessResult", "\nOutput:\n") + output);
if ( ec == -1 ) //Crash! if ( ec == static_cast<int>(ProcessResult::Code::Crashed) ) //Crash!
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command crashed." ), return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command crashed." ),
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> crashed." ) QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> crashed." )
.arg( command ) .arg( command )
+ outputMessage ); + outputMessage );
if ( ec == -2 ) if ( ec == static_cast<int>(ProcessResult::Code::FailedToStart) )
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to start." ), return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to start." ),
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to start." ) QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to start." )
.arg( command ) ); .arg( command ) );
if ( ec == -3 ) if ( ec == static_cast<int>(ProcessResult::Code::NoWorkingDirectory) )
return JobResult::error( QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ), return JobResult::error( QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ),
QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) ); QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) );
if ( ec == -4 ) if ( ec == static_cast<int>(ProcessResult::Code::TimedOut) )
return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to finish." ), return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to finish." ),
QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to finish in %2 seconds." ) QCoreApplication::translate( "ProcessResult", "Command <i>%1</i> failed to finish in %2 seconds." )
.arg( command ) .arg( command )

View File

@ -32,8 +32,16 @@ namespace CalamaresUtils
class ProcessResult : public QPair< int, QString > class ProcessResult : public QPair< int, QString >
{ {
public: public:
enum class Code : int
{
Crashed = -1, // Must match special return values from QProcess
FailedToStart = -2, // Must match special return values from QProcess
NoWorkingDirectory = -3,
TimedOut = -4
} ;
/** @brief Implicit one-argument constructor has no output, only a return code */ /** @brief Implicit one-argument constructor has no output, only a return code */
ProcessResult( int r ) : QPair< int, QString >( r, QString() ) {} ProcessResult( Code r ) : QPair< int, QString >( static_cast<int>(r), QString() ) {}
ProcessResult( int r, QString s ) : QPair< int, QString >( r, s ) {} ProcessResult( int r, QString s ) : QPair< int, QString >( r, s ) {}
int getExitCode() const { return first; } int getExitCode() const { return first; }
@ -93,9 +101,9 @@ public:
* @param filesystemName the name of the filesystem (optional). * @param filesystemName the name of the filesystem (optional).
* @param options any additional options as passed to mount -o (optional). * @param options any additional options as passed to mount -o (optional).
* @returns the program's exit code, or: * @returns the program's exit code, or:
* -1 = QProcess crash * Crashed = QProcess crash
* -2 = QProcess cannot start * FailedToStart = QProcess cannot start
* -3 = bad arguments * NoWorkingDirectory = bad arguments
*/ */
DLLEXPORT int mount( const QString& devicePath, DLLEXPORT int mount( const QString& devicePath,
const QString& mountPoint, const QString& mountPoint,
@ -120,10 +128,10 @@ public:
* *
* @returns the program's exit code and its output (if any). Special * @returns the program's exit code and its output (if any). Special
* exit codes (which will never have any output) are: * exit codes (which will never have any output) are:
* -1 = QProcess crash * Crashed = QProcess crash
* -2 = QProcess cannot start * FailedToStart = QProcess cannot start
* -3 = bad arguments * NoWorkingDirectory = bad arguments
* -4 = QProcess timeout * TimedOut = QProcess timeout
*/ */
static DLLEXPORT ProcessResult runCommand( static DLLEXPORT ProcessResult runCommand(
RunLocation location, RunLocation location,

View File

@ -283,18 +283,35 @@ ViewManager::next()
} }
m_currentStep++; m_currentStep++;
m_stack->setCurrentIndex( m_currentStep );
m_stack->setCurrentIndex( m_currentStep ); // Does nothing if out of range
step->onLeave(); step->onLeave();
m_steps.at( m_currentStep )->onActivate();
executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr; if ( m_currentStep < m_steps.count() )
emit currentStepChanged(); {
m_steps.at( m_currentStep )->onActivate();
executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr;
emit currentStepChanged();
}
else
{
// Reached the end in a weird state (e.g. no finished step after an exec)
executing = false;
m_next->setEnabled( false );
m_back->setEnabled( false );
}
updateCancelEnabled( !settings->disableCancel() && !(executing && settings->disableCancelDuringExec() ) ); updateCancelEnabled( !settings->disableCancel() && !(executing && settings->disableCancelDuringExec() ) );
} }
else else
{
step->next(); step->next();
}
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() ); if ( m_currentStep < m_steps.count() )
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() ); {
m_next->setEnabled( !executing && m_steps.at( m_currentStep )->isNextEnabled() );
m_back->setEnabled( !executing && m_steps.at( m_currentStep )->isBackEnabled() );
}
updateButtonLabels(); updateButtonLabels();
} }
@ -320,7 +337,7 @@ ViewManager::updateButtonLabels()
else else
m_next->setText( tr( "&Next" ) ); m_next->setText( tr( "&Next" ) );
if ( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) if ( isAtVeryEnd() )
{ {
m_quit->setText( tr( "&Done" ) ); m_quit->setText( tr( "&Done" ) );
m_quit->setToolTip( complete ); m_quit->setToolTip( complete );
@ -368,7 +385,7 @@ bool ViewManager::confirmCancelInstallation()
const auto* const settings = Calamares::Settings::instance(); const auto* const settings = Calamares::Settings::instance();
// When we're at the very end, then it's always OK to exit. // When we're at the very end, then it's always OK to exit.
if ( m_currentStep == m_steps.count() -1 && m_steps.last()->isAtEnd() ) if ( isAtVeryEnd() )
return true; return true;
// Not at the very end, cancel/quit might be disabled // Not at the very end, cancel/quit might be disabled

View File

@ -130,7 +130,12 @@ private:
void insertViewStep( int before, ViewStep* step ); void insertViewStep( int before, ViewStep* step );
void updateButtonLabels(); void updateButtonLabels();
void updateCancelEnabled( bool enabled ); void updateCancelEnabled( bool enabled );
bool isAtVeryEnd() const
{
return ( m_currentStep >= m_steps.count() ) || ( m_currentStep == m_steps.count() - 1 && m_steps.last()->isAtEnd() );
}
static ViewManager* s_instance; static ViewManager* s_instance;
ViewStepList m_steps; ViewStepList m_steps;

View File

@ -4,16 +4,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Zmicer Turok <zmicerturok@gmail.com>, 2018 # Zmicer Turok <nashtlumach@gmail.com>, 2018
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-05 11:34-0400\n" "POT-Creation-Date: 2019-05-10 19:18-0400\n"
"PO-Revision-Date: 2016-12-16 12:18+0000\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n"
"Last-Translator: Zmicer Turok <zmicerturok@gmail.com>, 2018\n" "Last-Translator: Zmicer Turok <nashtlumach@gmail.com>, 2018\n"
"Language-Team: Belarusian (https://www.transifex.com/calamares/teams/20061/be/)\n" "Language-Team: Belarusian (https://www.transifex.com/calamares/teams/20061/be/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"