Merge branch 'master' into fix-swap-ui

This commit is contained in:
Adriaan de Groot 2018-10-01 03:21:06 -04:00
commit 29bae61610
35 changed files with 934 additions and 154 deletions

11
.gitattributes vendored
View File

@ -1,6 +1,11 @@
.tx/* export-ignore
hacking/* export-ignore
HACKING.md export-ignore
.editorconfig export-ignore .editorconfig export-ignore
.gitattributes export-ignore
.github export-ignore
.gitignore export-ignore
.gitmodules export-ignore
.travis.yml export-ignore
.tx export-ignore
src/modules/testmodule.py export-ignore src/modules/testmodule.py export-ignore
src/modules/globalStorage.yaml export-ignore src/modules/globalStorage.yaml export-ignore

12
CHANGES
View File

@ -6,11 +6,23 @@ website will have to do for older versions.
# 3.2.3 (unreleased) # # 3.2.3 (unreleased) #
This release contains contributions from (alphabetically by first name): This release contains contributions from (alphabetically by first name):
- Alf Gaida
- Caio Carvalho
- Kevin Kofler
- Philip Mueller
## Core ## ## Core ##
## Modules ## ## Modules ##
* The *partition* module supports RAID devices, but only when Calamares
is compiled with the newest KPMCore release.
* The *keyboard* module now handles the (bogus) Austrian keymap for
the system console properly.
* New module *fsresizer* can be used to resize filesystems. It is intended
for use in OEM installs where an image of fixed size is created,
and then sized to the actual SD card the user has used.
# 3.2.2 (2018-09-04) # # 3.2.2 (2018-09-04) #
This release contains contributions from (alphabetically by first name): This release contains contributions from (alphabetically by first name):

View File

@ -79,10 +79,8 @@ function( calamares_add_branding NAME )
endforeach() endforeach()
message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} branding component: ${BoldRed}${NAME}${ColorReset}" ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} branding component: ${BoldRed}${NAME}${ColorReset}" )
if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" )
message( " ${Green}TYPE:${ColorReset} branding component" ) message( " ${Green}TYPE:${ColorReset} branding component" )
message( " ${Green}BRANDING_COMPONENT_DESTINATION:${ColorReset} ${BRANDING_COMPONENT_DESTINATION}" ) message( " ${Green}BRANDING_COMPONENT_DESTINATION:${ColorReset} ${BRANDING_COMPONENT_DESTINATION}" )
endif()
endfunction() endfunction()
# Usage calamares_add_branding_translations( <name> [DIRECTORY <dir>]) # Usage calamares_add_branding_translations( <name> [DIRECTORY <dir>])

View File

@ -99,7 +99,6 @@ function( calamares_add_module_subdirectory )
endforeach() endforeach()
message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${SUBDIRECTORY}${ColorReset}" )
if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" )
message( " ${Green}TYPE:${ColorReset} jobmodule" ) message( " ${Green}TYPE:${ColorReset} jobmodule" )
message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" )
if( MODULE_CONFIG_FILES ) if( MODULE_CONFIG_FILES )
@ -111,7 +110,6 @@ function( calamares_add_module_subdirectory )
message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${_destination}" ) message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${_destination}" )
endif() endif()
message( "" ) message( "" )
endif()
# We copy over the lang directory, if any # We copy over the lang directory, if any
if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" ) if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/lang" )
install_calamares_gettext_translations( install_calamares_gettext_translations(

View File

@ -62,7 +62,6 @@ function( calamares_add_plugin )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" )
message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${PLUGIN_NAME}${ColorReset}" ) message( "-- ${BoldYellow}Found ${CALAMARES_APPLICATION_NAME} module: ${BoldRed}${PLUGIN_NAME}${ColorReset}" )
if( NOT CMAKE_BUILD_TYPE STREQUAL "Release" )
message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" ) message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" )
message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" ) message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" )
message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" )
@ -83,7 +82,7 @@ function( calamares_add_plugin )
message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" ) message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" )
endif() endif()
message( "" ) message( "" )
endif()
# create target name once for convenience # create target name once for convenience
set( target "calamares_${PLUGIN_TYPE}_${PLUGIN_NAME}" ) set( target "calamares_${PLUGIN_TYPE}_${PLUGIN_NAME}" )

View File

@ -21,7 +21,7 @@ Name[be]=Усталяваць сістэму
Icon[bg]=calamares Icon[bg]=calamares
GenericName[bg]=Системен Инсталатор GenericName[bg]=Системен Инсталатор
Comment[bg]=Calamares Системен Инсталатор Comment[bg]=Calamares Системен Инсталатор
Name[bg]=Инсталирай система Name[bg]=Инсталирай системата
Icon[ca]=calamares Icon[ca]=calamares
GenericName[ca]=Instal·lador de sistema GenericName[ca]=Instal·lador de sistema
Comment[ca]=Calamares Instal·lador de sistema Comment[ca]=Calamares Instal·lador de sistema

View File

@ -51,4 +51,4 @@ df -h
echo "# Install results" echo "# Install results"
install_debugging "$DESTDIR" install_debugging "$DESTDIR"
$result # Result of make install, above $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above

View File

@ -50,7 +50,7 @@
<message> <message>
<location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="69"/> <location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="69"/>
<source>Blank Page</source> <source>Blank Page</source>
<translation type="unfinished"/> <translation>Празна страница</translation>
</message> </message>
</context> </context>
<context> <context>
@ -192,22 +192,22 @@
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
<source>Calamares Initialization Failed</source> <source>Calamares Initialization Failed</source>
<translation type="unfinished"/> <translation>Инициализацията на Calamares се провали</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="180"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="180"/>
<source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source> <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
<translation type="unfinished"/> <translation>%1 не може да се инсталира. Calamares не можа да зареди всичките конфигурирани модули. Това е проблем с начина, по който Calamares е използван от дистрибуцията.</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="185"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="185"/>
<source>&lt;br/&gt;The following modules could not be loaded:</source> <source>&lt;br/&gt;The following modules could not be loaded:</source>
<translation type="unfinished"/> <translation>&lt;br/&gt;Следните модули не могат да се заредят:</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="277"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="277"/>
<source>&amp;Install</source> <source>&amp;Install</source>
<translation type="unfinished"/> <translation>&amp;Инсталирай</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="325"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="325"/>
@ -287,17 +287,17 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="284"/> <location filename="../src/libcalamares/PythonHelper.cpp" line="284"/>
<source>unparseable Python error</source> <source>unparseable Python error</source>
<translation>неанализируема Python грешка</translation> <translation>неанализируема грешка на Python</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="324"/> <location filename="../src/libcalamares/PythonHelper.cpp" line="324"/>
<source>unparseable Python traceback</source> <source>unparseable Python traceback</source>
<translation>неанализируемо Python проследяване</translation> <translation>неанализируемо проследяване на Python</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="329"/> <location filename="../src/libcalamares/PythonHelper.cpp" line="329"/>
<source>Unfetchable Python error.</source> <source>Unfetchable Python error.</source>
<translation>Недостъпна Python грешка.</translation> <translation>Недостъпна грешка на Python.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -504,17 +504,17 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="127"/> <location filename="../src/libcalamares/utils/CommandList.cpp" line="127"/>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="138"/> <location filename="../src/libcalamares/utils/CommandList.cpp" line="138"/>
<source>Could not run command.</source> <source>Could not run command.</source>
<translation type="unfinished"/> <translation>Командата не може да се изпълни.</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="128"/> <location filename="../src/libcalamares/utils/CommandList.cpp" line="128"/>
<source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source> <source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source>
<translation type="unfinished"/> <translation>Командата се изпълнява в средата на хоста и трябва да установи местоположението на основния дял, но rootMountPoint не е определен.</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="139"/> <location filename="../src/libcalamares/utils/CommandList.cpp" line="139"/>
<source>The command needs to know the user&apos;s name, but no username is defined.</source> <source>The command needs to know the user&apos;s name, but no username is defined.</source>
<translation type="unfinished"/> <translation>Командата трябва да установи потребителското име на профила, но такова не е определено.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -522,7 +522,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="117"/> <location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="117"/>
<source>Contextual Processes Job</source> <source>Contextual Processes Job</source>
<translation type="unfinished"/> <translation>Задача с контекстуални процеси</translation>
</message> </message>
</context> </context>
<context> <context>
@ -580,7 +580,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="72"/> <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="72"/>
<source>En&amp;crypt</source> <source>En&amp;crypt</source>
<translation>En%crypt</translation> <translation>Ши&amp;фриране</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="151"/> <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="151"/>
@ -784,12 +784,12 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="131"/> <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="131"/>
<source>Write LUKS configuration for Dracut to %1</source> <source>Write LUKS configuration for Dracut to %1</source>
<translation type="unfinished"/> <translation>Запиши LUKS конфигурация за Dracut на %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="133"/> <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="133"/>
<source>Skip writing LUKS configuration for Dracut: &quot;/&quot; partition is not encrypted</source> <source>Skip writing LUKS configuration for Dracut: &quot;/&quot; partition is not encrypted</source>
<translation type="unfinished"/> <translation>Пропусни записването на LUKS конфигурация за Dracut: &quot;/&quot; дял не е шифриран</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="149"/> <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="149"/>
@ -939,7 +939,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.ui" line="95"/> <location filename="../src/modules/finished/FinishedPage.ui" line="95"/>
<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 installer.&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 installer.&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;Когато тази опция е избрана, Вашата система ще се рестартира незабавно при натискане на &lt;span style=&quot; font-style:italic;&quot;&gt;Готово&lt;/span&gt; или при затваряне на инсталатора.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.ui" line="98"/> <location filename="../src/modules/finished/FinishedPage.ui" line="98"/>
@ -954,7 +954,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="109"/> <location filename="../src/modules/finished/FinishedPage.cpp" line="109"/>
<source>&lt;h1&gt;Installation Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been installed on your computer.&lt;br/&gt;The error message was: %2.</source> <source>&lt;h1&gt;Installation Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been installed on your computer.&lt;br/&gt;The error message was: %2.</source>
<translation type="unfinished"/> <translation>&lt;h1&gt;Инсталацията е неуспешна&lt;/h1&gt;&lt;br/&gt;%1 не е инсталиран на Вашия компютър.&lt;br/&gt;Съобщението с грешката е: %2.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -967,12 +967,12 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/finished/FinishedViewStep.cpp" line="124"/> <location filename="../src/modules/finished/FinishedViewStep.cpp" line="124"/>
<source>Installation Complete</source> <source>Installation Complete</source>
<translation type="unfinished"/> <translation>Инсталацията е завършена</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/finished/FinishedViewStep.cpp" line="125"/> <location filename="../src/modules/finished/FinishedViewStep.cpp" line="125"/>
<source>The installation of %1 is complete.</source> <source>The installation of %1 is complete.</source>
<translation type="unfinished"/> <translation>Инсталацията на %1 е завършена.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1156,7 +1156,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/locale/LocalePage.cpp" line="389"/> <location filename="../src/modules/locale/LocalePage.cpp" line="389"/>
<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>Форматът на цифрите и датата ще бъде %1.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/locale/LocalePage.cpp" line="215"/> <location filename="../src/modules/locale/LocalePage.cpp" line="215"/>
@ -1214,12 +1214,12 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/netinstall/NetInstallPage.cpp" line="86"/> <location filename="../src/modules/netinstall/NetInstallPage.cpp" line="86"/>
<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>Мрежова инсталация. (Изключена: Списъкът с пакети не може да бъде извлечен, проверете Вашата Интернет връзка)</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/netinstall/NetInstallPage.cpp" line="96"/> <location filename="../src/modules/netinstall/NetInstallPage.cpp" line="96"/>
<source>Network Installation. (Disabled: Received invalid groups data)</source> <source>Network Installation. (Disabled: Received invalid groups data)</source>
<translation type="unfinished"/> <translation>Мрежова инсталация. (Изключена: Получени са данни за невалидни групи)</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1250,12 +1250,12 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="158"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="158"/>
<source>Memory allocation error when setting &apos;%1&apos;</source> <source>Memory allocation error when setting &apos;%1&apos;</source>
<translation type="unfinished"/> <translation>Грешка при разпределяне на паметта по време на настройването на &apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="162"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="162"/>
<source>Memory allocation error</source> <source>Memory allocation error</source>
<translation type="unfinished"/> <translation>Грешка при разпределяне на паметта</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="164"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="164"/>
@ -1270,7 +1270,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="168"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="168"/>
<source>The password differs with case changes only</source> <source>The password differs with case changes only</source>
<translation type="unfinished"/> <translation>Паролата се различава само със смяна на главни и малки букви</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="170"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="170"/>
@ -1280,62 +1280,62 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="172"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="172"/>
<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>Паролата съдържа потребителското име под някаква форма</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="174"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="174"/>
<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>Паролата съдържа думи от истинското име на потребителя под някаква форма</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="176"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="176"/>
<source>The password contains forbidden words in some form</source> <source>The password contains forbidden words in some form</source>
<translation type="unfinished"/> <translation>Паролата съдържа забранени думи под някаква форма</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="179"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="179"/>
<source>The password contains less than %1 digits</source> <source>The password contains less than %1 digits</source>
<translation type="unfinished"/> <translation>Паролата съдържа по-малко от %1 цифри</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="180"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="180"/>
<source>The password contains too few digits</source> <source>The password contains too few digits</source>
<translation type="unfinished"/> <translation>Паролата съдържа твърде малко цифри</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="183"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="183"/>
<source>The password contains less than %1 uppercase letters</source> <source>The password contains less than %1 uppercase letters</source>
<translation type="unfinished"/> <translation>Паролата съдържа по-малко от %1 главни букви</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 contains too few uppercase letters</source> <source>The password contains too few uppercase letters</source>
<translation type="unfinished"/> <translation>Паролата съдържа твърде малко главни букви</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="187"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="187"/>
<source>The password contains less than %1 lowercase letters</source> <source>The password contains less than %1 lowercase letters</source>
<translation type="unfinished"/> <translation>Паролата съдържа по-малко от %1 малки букви</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 contains too few lowercase letters</source> <source>The password contains too few lowercase letters</source>
<translation type="unfinished"/> <translation>Паролата съдържа твърде малко малки букви</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="191"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="191"/>
<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>Паролата съдържа по-малко от %1 знаци, които не са букви или цифри</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 too few non-alphanumeric characters</source> <source>The password contains too few non-alphanumeric characters</source>
<translation type="unfinished"/> <translation>Паролата съдържа твърде малко знаци, които не са букви или цифри</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="195"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="195"/>
<source>The password is shorter than %1 characters</source> <source>The password is shorter than %1 characters</source>
<translation type="unfinished"/> <translation>Паролата е по-малка от %1 знаци</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/>
@ -1345,47 +1345,47 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="198"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="198"/>
<source>The password is just rotated old one</source> <source>The password is just rotated old one</source>
<translation type="unfinished"/> <translation>Паролата е обърнат вариант на старата</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 character classes</source> <source>The password contains less than %1 character classes</source>
<translation type="unfinished"/> <translation>Паролата съдържа по-малко от %1 видове знаци</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 does not contain enough character classes</source> <source>The password does not contain enough character classes</source>
<translation type="unfinished"/> <translation>Паролата не съдържа достатъчно видове знаци</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 more than %1 same characters consecutively</source> <source>The password contains more than %1 same characters consecutively</source>
<translation type="unfinished"/> <translation>Паролата съдържа повече от %1 еднакви знаци последователно</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 many same characters consecutively</source> <source>The password contains too many same characters consecutively</source>
<translation type="unfinished"/> <translation>Паролата съдържа твърде много еднакви знаци последователно</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 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>Паролата съдържа повече от %1 еднакви видове знаци последователно</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 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>Паролата съдържа твърде много еднакви видове знаци последователно</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 contains monotonic sequence longer than %1 characters</source> <source>The password contains monotonic sequence longer than %1 characters</source>
<translation type="unfinished"/> <translation>Паролата съдържа монотонна последователност, по-дълга от %1 знаци</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/>
<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>Паролата съдържа твърде дълга монотонна последователност от знаци</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="216"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="216"/>
@ -1395,77 +1395,77 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="218"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="218"/>
<source>Cannot obtain random numbers from the RNG device</source> <source>Cannot obtain random numbers from the RNG device</source>
<translation type="unfinished"/> <translation>Получаването на произволни числа от RNG устройството е неуспешно</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/>
<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>Генерирането на парола е неуспешно - необходимата ентропия е твърде ниска за настройки</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="225"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="225"/>
<source>The password fails the dictionary check - %1</source> <source>The password fails the dictionary check - %1</source>
<translation type="unfinished"/> <translation>Паролата не издържа проверката на речника - %1</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 fails the dictionary check</source> <source>The password fails the dictionary check</source>
<translation type="unfinished"/> <translation>Паролата не издържа проверката на речника</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="231"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="231"/>
<source>Unknown setting - %1</source> <source>Unknown setting - %1</source>
<translation type="unfinished"/> <translation>Неизвестна настройка - %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="235"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="235"/>
<source>Unknown setting</source> <source>Unknown setting</source>
<translation type="unfinished"/> <translation>Неизвестна настройка</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="239"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="239"/>
<source>Bad integer value of setting - %1</source> <source>Bad integer value of setting - %1</source>
<translation type="unfinished"/> <translation>Невалидна числена стойност на настройката - %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="243"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="243"/>
<source>Bad integer value</source> <source>Bad integer value</source>
<translation type="unfinished"/> <translation>Невалидна числена стойност на настройката</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="247"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="247"/>
<source>Setting %1 is not of integer type</source> <source>Setting %1 is not of integer type</source>
<translation type="unfinished"/> <translation>Настройката %1 не е от числов вид</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="251"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="251"/>
<source>Setting is not of integer type</source> <source>Setting is not of integer type</source>
<translation type="unfinished"/> <translation>Настройката не е от числов вид</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="255"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="255"/>
<source>Setting %1 is not of string type</source> <source>Setting %1 is not of string type</source>
<translation type="unfinished"/> <translation>Настройката %1 не е от текстов вид</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="259"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="259"/>
<source>Setting is not of string type</source> <source>Setting is not of string type</source>
<translation type="unfinished"/> <translation>Настройката не е от текстов вид</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/>
<source>Opening the configuration file failed</source> <source>Opening the configuration file failed</source>
<translation type="unfinished"/> <translation>Отварянето на файла с конфигурацията е неуспешно</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="263"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="263"/>
<source>The configuration file is malformed</source> <source>The configuration file is malformed</source>
<translation type="unfinished"/> <translation>Файлът с конфигурацията е деформиран</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/>
<source>Fatal failure</source> <source>Fatal failure</source>
<translation type="unfinished"/> <translation>Фатална повреда</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="267"/> <location filename="../src/modules/users/CheckPWQuality.cpp" line="267"/>
@ -1664,7 +1664,7 @@ The installer will quit and all changes will be lost.</source>
<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>Съз&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"/>
@ -1689,12 +1689,12 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="195"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="195"/>
<source>Can not create new partition</source> <source>Can not create new partition</source>
<translation type="unfinished"/> <translation>Не може да се създаде нов дял</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="196"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="196"/>
<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 вече има %2 главни дялове, повече не може да се добавят. Моля, премахнете един главен дял и добавете разширен дял, на негово място.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1787,7 +1787,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="450"/> <location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="450"/>
<source>Boot partition not encrypted</source> <source>Boot partition not encrypted</source>
<translation type="unfinished"/> <translation>Липсва криптиране на дял за начално зареждане</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="451"/> <location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="451"/>
@ -1819,7 +1819,7 @@ The installer will quit and all changes will be lost.</source>
<message> <message>
<location filename="../src/modules/plasmalnf/page_plasmalnf.ui" line="20"/> <location filename="../src/modules/plasmalnf/page_plasmalnf.ui" line="20"/>
<source>Placeholder</source> <source>Placeholder</source>
<translation type="unfinished"/> <translation>Заместител</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="67"/> <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="67"/>
@ -1866,7 +1866,9 @@ There was no output from the command.</source>
<source> <source>
Output: Output:
</source> </source>
<translation type="unfinished"/> <translation>
Резултат:
</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="275"/> <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="275"/>
@ -2088,7 +2090,7 @@ Output:
<message> <message>
<location filename="../src/modules/welcome/checker/RequirementsChecker.cpp" line="163"/> <location filename="../src/modules/welcome/checker/RequirementsChecker.cpp" line="163"/>
<source>The screen is too small to display the installer.</source> <source>The screen is too small to display the installer.</source>
<translation type="unfinished"/> <translation>Екранът е твърде малък за инсталатора.</translation>
</message> </message>
</context> </context>
<context> <context>
@ -2290,7 +2292,7 @@ Output:
<message> <message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="113"/> <location filename="../src/modules/users/SetPasswordJob.cpp" line="113"/>
<source>rootMountPoint is %1</source> <source>rootMountPoint is %1</source>
<translation>root точка на монтиране е %1</translation> <translation>rootMountPoint е %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="123"/> <location filename="../src/modules/users/SetPasswordJob.cpp" line="123"/>
@ -2328,7 +2330,7 @@ Output:
<message> <message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/> <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/>
<source>Bad path: %1</source> <source>Bad path: %1</source>
<translation>Лош път: %1</translation> <translation>Невалиден път: %1</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="86"/> <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="86"/>
@ -2365,7 +2367,7 @@ Output:
<location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="36"/> <location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="36"/>
<source>%L1 / %L2</source> <source>%L1 / %L2</source>
<extracomment>slide counter, %1 of %2 (numeric)</extracomment> <extracomment>slide counter, %1 of %2 (numeric)</extracomment>
<translation type="unfinished"/> <translation>%L1 / %L2</translation>
</message> </message>
</context> </context>
<context> <context>
@ -2446,7 +2448,7 @@ Output:
<message> <message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="24"/> <location filename="../src/modules/tracking/page_trackingstep.ui" line="24"/>
<source>Placeholder</source> <source>Placeholder</source>
<translation type="unfinished"/> <translation>Заместител</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="72"/> <location filename="../src/modules/tracking/page_trackingstep.ui" line="72"/>
@ -2458,7 +2460,7 @@ Output:
<location filename="../src/modules/tracking/page_trackingstep.ui" line="185"/> <location filename="../src/modules/tracking/page_trackingstep.ui" line="185"/>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="247"/> <location filename="../src/modules/tracking/page_trackingstep.ui" line="247"/>
<source>TextLabel</source> <source>TextLabel</source>
<translation type="unfinished"/> <translation>TextLabel</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="133"/> <location filename="../src/modules/tracking/page_trackingstep.ui" line="133"/>
@ -2498,7 +2500,7 @@ Output:
<message> <message>
<location filename="../src/modules/tracking/TrackingViewStep.cpp" line="59"/> <location filename="../src/modules/tracking/TrackingViewStep.cpp" line="59"/>
<source>Feedback</source> <source>Feedback</source>
<translation type="unfinished"/> <translation>Обратна връзка</translation>
</message> </message>
</context> </context>
<context> <context>
@ -2583,7 +2585,7 @@ Output:
<message> <message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="60"/> <location filename="../src/modules/welcome/WelcomePage.cpp" line="60"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source> <source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
<translation type="unfinished"/> <translation>&lt;h1&gt;Добре дошли при инсталатора Calamares на %1.&lt;/h1&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="73"/> <location filename="../src/modules/welcome/WelcomePage.cpp" line="73"/>
@ -2593,7 +2595,7 @@ Output:
<message> <message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="75"/> <location filename="../src/modules/welcome/WelcomePage.cpp" line="75"/>
<source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the &lt;a href=&quot;https://www.transifex.com/calamares/calamares/&quot;&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://calamares.io/&quot;&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href=&quot;http://www.blue-systems.com/&quot;&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source> <source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the &lt;a href=&quot;https://www.transifex.com/calamares/calamares/&quot;&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://calamares.io/&quot;&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href=&quot;http://www.blue-systems.com/&quot;&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/> <translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;за %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Авторско право 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Авторско право 2017 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Благодарности към: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg и &lt;a href=&quot;https://www.transifex.com/calamares/calamares/&quot;&gt;преводачите на Calamares&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Разработката на &lt;a href=&quot;https://calamares.io/&quot;&gt;Calamares&lt;/a&gt; е спонсорирана от &lt;br/&gt;&lt;a href=&quot;http://www.blue-systems.com/&quot;&gt;Blue Systems&lt;/a&gt; - Liberating Software.</translation>
</message> </message>
<message> <message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="290"/> <location filename="../src/modules/welcome/WelcomePage.cpp" line="290"/>

View File

@ -50,7 +50,7 @@
<message> <message>
<location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="69"/> <location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="69"/>
<source>Blank Page</source> <source>Blank Page</source>
<translation type="unfinished"/> <translation>Halaman Kosong</translation>
</message> </message>
</context> </context>
<context> <context>
@ -192,17 +192,17 @@
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/>
<source>Calamares Initialization Failed</source> <source>Calamares Initialization Failed</source>
<translation type="unfinished"/> <translation>Inisialisasi Calamares Gagal</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="180"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="180"/>
<source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source> <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
<translation type="unfinished"/> <translation>%1 tidak dapat terpasang. Calamares tidak dapat memuat seluruh modul konfigurasi. Terdapat masalah dengan Calamares karena sedang digunakan oleh distribusi.</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="185"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="185"/>
<source>&lt;br/&gt;The following modules could not be loaded:</source> <source>&lt;br/&gt;The following modules could not be loaded:</source>
<translation type="unfinished"/> <translation>&lt;br/&gt;Modul berikut tidak dapat dimuat.</translation>
</message> </message>
<message> <message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="277"/> <location filename="../src/libcalamaresui/ViewManager.cpp" line="277"/>
@ -1665,7 +1665,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan.</transla
<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>Mem&amp;buat</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"/>

View File

@ -1696,7 +1696,7 @@ Kuruluma devam edebilirsiniz fakat bazı özellikler devre dışı kalabilir.</t
<message> <message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="196"/> <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="196"/>
<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>% 1 üzerindeki bölüm tablosu zaten% 2 birincil bölüme sahip ve artık eklenemiyor. Lütfen bir birincil bölümü kaldırın ve bunun yerine genişletilmiş bir bölüm ekleyin.</translation> <translation>%1 üzerindeki disk bölümü tablosu zaten %2 birincil disk bölümüne sahip ve artık eklenemiyor. Lütfen bir birincil disk bölümü kaldırın ve bunun yerine uzatılmış bir disk bölümü ekleyin.</translation>
</message> </message>
</context> </context>
<context> <context>

Binary file not shown.

View File

@ -20,24 +20,24 @@ msgstr ""
#: src/modules/umount/main.py:40 #: src/modules/umount/main.py:40
msgid "Unmount file systems." msgid "Unmount file systems."
msgstr "" msgstr "Демонтирай файловите системи."
#: src/modules/dummypython/main.py:44 #: src/modules/dummypython/main.py:44
msgid "Dummy python job." msgid "Dummy python job."
msgstr "" msgstr "Фиктивна задача python."
#: src/modules/dummypython/main.py:97 #: src/modules/dummypython/main.py:97
msgid "Dummy python step {}" msgid "Dummy python step {}"
msgstr "" msgstr "Фиктивна стъпка на python {}"
#: src/modules/machineid/main.py:35 #: src/modules/machineid/main.py:35
msgid "Generate machine-id." msgid "Generate machine-id."
msgstr "" msgstr "Генерирай machine-id."
#: src/modules/packages/main.py:62 #: src/modules/packages/main.py:62
#, python-format #, python-format
msgid "Processing packages (%(count)d / %(total)d)" msgid "Processing packages (%(count)d / %(total)d)"
msgstr "" msgstr "Обработване на пакетите (%(count)d / %(total)d)"
#: src/modules/packages/main.py:64 src/modules/packages/main.py:74 #: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages." msgid "Install packages."

View File

@ -10,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-18 07:46-0400\n" "POT-Creation-Date: 2018-06-18 07:46-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Demiray “tulliana” Muhterem <mdemiray@msn.com>, 2017\n" "Last-Translator: Demiray Muhterem <mdemiray@msn.com>, 2017\n"
"Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\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"

View File

@ -59,6 +59,7 @@ handle_args( QCoreApplication& a )
parser.addOption( debugLevelOption ); parser.addOption( debugLevelOption );
parser.addPositionalArgument( "module", "Path or name of module to run." ); parser.addPositionalArgument( "module", "Path or name of module to run." );
parser.addPositionalArgument( "config", "Path of job-config file to use.", "[config]");
parser.process( a ); parser.process( a );
@ -140,6 +141,8 @@ load_module( const ModuleConfig& moduleConfig )
? moduleDirectory + '/' + name + ".conf" ? moduleDirectory + '/' + name + ".conf"
: moduleConfig.configFile() ); : moduleConfig.configFile() );
cDebug() << "Module" << moduleName << "job-configuration:" << configFile;
Calamares::Module* module = Calamares::Module::fromDescriptor( Calamares::Module* module = Calamares::Module::fromDescriptor(
descriptor, name, configFile, moduleDirectory ); descriptor, name, configFile, moduleDirectory );
@ -158,7 +161,7 @@ main( int argc, char* argv[] )
std::unique_ptr< Calamares::Settings > settings_p( new Calamares::Settings( QString(), true ) ); std::unique_ptr< Calamares::Settings > settings_p( new Calamares::Settings( QString(), true ) );
std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) ); std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) );
cDebug() << "Calamares test module-loader" << module.moduleName(); cDebug() << "Calamares module-loader testing" << module.moduleName();
Calamares::Module* m = load_module( module ); Calamares::Module* m = load_module( module );
if ( !m ) if ( !m )
{ {
@ -175,16 +178,27 @@ main( int argc, char* argv[] )
return 1; return 1;
} }
cDebug() << "Module" << m->name() << m->typeString() << m->interfaceString(); using TR = Logger::DebugRow<const char*, const QString&>;
cDebug() << "Module metadata"
<< TR( "name", m->name() )
<< TR( "type", m->typeString() )
<< TR( "interface", m->interfaceString() );
cDebug() << "Job outputs:";
Calamares::JobList jobList = m->jobs(); Calamares::JobList jobList = m->jobs();
unsigned int count = 1; unsigned int count = 1;
for ( const auto& p : jobList ) for ( const auto& p : jobList )
{ {
cDebug() << count << p->prettyName(); cDebug() << "Job #" << count << "name" << p->prettyName();
Calamares::JobResult r = p->exec(); Calamares::JobResult r = p->exec();
if ( !r ) if ( !r )
cDebug() << count << ".. failed" << r; {
using TR = Logger::DebugRow<QString, QString>;
cDebug() << count << ".. failed"
<< TR( "summary", r.message() )
<< TR( "details", r.details() );
}
++count; ++count;
} }

View File

@ -191,7 +191,7 @@ ViewManager::onInitFailed( const QStringList& modules)
detailString = details.join( QString() ); detailString = details.join( QString() );
} }
insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), detailString ) ); insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ProductName ), detailString ) );
} }
ViewStepList ViewStepList

View File

@ -145,8 +145,15 @@ moduleConfigurationCandidates( bool assumeBuildDir, const QString& moduleName, c
paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) );
else else
{ {
// If an absolute path is given, in debug mode, look for it
// first. The case contains('/'), below, will add the absolute
// path a second time, though.
if ( assumeBuildDir && configFileName.startsWith( '/' ) )
paths << configFileName;
if ( assumeBuildDir ) if ( assumeBuildDir )
paths << QDir().absoluteFilePath(QString( "src/modules/%1/%2" ).arg( moduleName ).arg( configFileName ) ); paths << QDir().absoluteFilePath(QString( "src/modules/%1/%2" ).arg( moduleName ).arg( configFileName ) );
if ( assumeBuildDir && configFileName.contains( '/' ) )
paths << QDir().absoluteFilePath( configFileName );
paths << QString( "/etc/calamares/modules/%1" ).arg( configFileName ); paths << QString( "/etc/calamares/modules/%1" ).arg( configFileName );
paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) );
@ -168,6 +175,7 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex
YAML::Node doc = YAML::Load( ba.constData() ); YAML::Node doc = YAML::Load( ba.constData() );
if ( doc.IsNull() ) if ( doc.IsNull() )
{ {
cDebug() << "Found empty module configuration" << path;
// Special case: empty config files are valid, // Special case: empty config files are valid,
// but aren't a map. // but aren't a map.
return; return;
@ -178,14 +186,13 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex
return; return;
} }
cDebug() << "Loaded module configuration" << path;
m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ).toMap(); m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ).toMap();
m_emergency = m_maybe_emergency m_emergency = m_maybe_emergency
&& m_configurationMap.contains( EMERGENCY ) && m_configurationMap.contains( EMERGENCY )
&& m_configurationMap[ EMERGENCY ].toBool(); && m_configurationMap[ EMERGENCY ].toBool();
return; return;
} }
else
continue;
} }
} }

View File

@ -8,7 +8,7 @@ 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-02-07 18:58+0100\n" "POT-Creation-Date: 2018-06-18 07:46-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Georgi Georgiev <georgiev_1994@abv.bg>, 2018\n" "Last-Translator: Georgi Georgiev <georgiev_1994@abv.bg>, 2018\n"
"Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n" "Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n"
@ -28,16 +28,16 @@ msgstr "Нов QLabel."
#: src/modules/dummypythonqt/main.py:97 #: src/modules/dummypythonqt/main.py:97
msgid "Dummy PythonQt ViewStep" msgid "Dummy PythonQt ViewStep"
msgstr "" msgstr "Фиктивен PythonQt ViewStep"
#: src/modules/dummypythonqt/main.py:183 #: src/modules/dummypythonqt/main.py:183
msgid "The Dummy PythonQt Job" msgid "The Dummy PythonQt Job"
msgstr "" msgstr "Фиктивната задача PythonQt"
#: src/modules/dummypythonqt/main.py:186 #: src/modules/dummypythonqt/main.py:186
msgid "This is the Dummy PythonQt Job. The dummy job says: {}" msgid "This is the Dummy PythonQt Job. The dummy job says: {}"
msgstr "" msgstr "Това е фиктивната задача PythonQt. Фиктивната задача заявява: {}"
#: src/modules/dummypythonqt/main.py:190 #: src/modules/dummypythonqt/main.py:190
msgid "A status message for Dummy PythonQt Job." msgid "A status message for Dummy PythonQt Job."
msgstr "" msgstr "Съобщение за състоянието на фиктивната задача PythonQt."

View File

@ -8,9 +8,9 @@ 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-02-07 18:58+0100\n" "POT-Creation-Date: 2018-06-18 07:46-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Demiray “tulliana” Muhterem <mdemiray@msn.com>, 2016\n" "Last-Translator: Demiray Muhterem <mdemiray@msn.com>, 2016\n"
"Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\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"

View File

@ -0,0 +1,44 @@
find_package( KPMcore 3.3 )
find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore
find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore
if ( KPMcore_FOUND )
include_directories( ${KPMCORE_INCLUDE_DIR} )
include_directories( ${PROJECT_BINARY_DIR}/src/libcalamares )
# The PartitionIterator is a small class, and it's easiest -- but also a
# gross hack -- to just compile it again from the partition module tree.
calamares_add_plugin( fsresizer
TYPE job
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
ResizeFSJob.cpp
${PROJECT_SOURCE_DIR}/src/modules/partition/core/PartitionIterator.cpp
LINK_PRIVATE_LIBRARIES
kpmcore
calamares
SHARED_LIB
)
if( ECM_FOUND )
find_package( Qt5 COMPONENTS Test REQUIRED )
include( ECMAddTests )
ecm_add_test(
Tests.cpp
TEST_NAME
fsresizertest
LINK_LIBRARIES
${CALAMARES_LIBRARIES}
calamares
calamares_job_fsresizer # From above
${YAMLCPP_LIBRARY}
Qt5::Core
Qt5::Test
)
set_target_properties( fsresizertest PROPERTIES AUTOMOC TRUE )
target_include_directories(fsresizertest PRIVATE /usr/local/include )
endif()
else()
calamares_skip_module( "fsresizer (missing suitable KPMcore)" )
endif()

View File

@ -0,0 +1,339 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2018, Adriaan de Groot <groot@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ResizeFSJob.h"
#include <QProcess>
#include <QDateTime>
#include <QThread>
#include <kpmcore/backend/corebackend.h>
#include <kpmcore/backend/corebackendmanager.h>
#include <kpmcore/core/device.h>
#include <kpmcore/core/partition.h>
#include <kpmcore/ops/resizeoperation.h>
#include <kpmcore/util/report.h>
#include "CalamaresVersion.h"
#include "JobQueue.h"
#include "GlobalStorage.h"
#include "utils/Logger.h"
#include "utils/Units.h"
#include "modules/partition/core/PartitionIterator.h"
ResizeFSJob::RelativeSize::RelativeSize()
: m_value( 0 )
, m_unit( None )
{
}
template<int N>
void matchUnitSuffix(
const QString& s,
const char (&suffix)[N],
ResizeFSJob::RelativeSize::Unit matchedUnit,
int& value,
ResizeFSJob::RelativeSize::Unit& unit
)
{
if ( s.endsWith( suffix ) )
{
value = s.left( s.length() - N + 1 ).toInt();
unit = matchedUnit;
}
}
ResizeFSJob::RelativeSize::RelativeSize( const QString& s)
: m_value( 0 )
, m_unit( None )
{
matchUnitSuffix( s, "%", Percent, m_value, m_unit );
matchUnitSuffix( s, "MiB", Absolute, m_value, m_unit );
if ( ( unit() == Percent ) && ( value() > 100 ) )
{
cDebug() << "Percent value" << value() << "is not valid.";
m_value = 0;
m_unit = None;
}
if ( !m_value )
m_unit = None;
}
qint64
ResizeFSJob::RelativeSize::apply( qint64 totalSectors , qint64 sectorSize )
{
if ( !isValid() )
return -1;
if ( sectorSize < 1 )
return -1;
switch( m_unit )
{
case None:
return -1;
case Absolute:
return CalamaresUtils::MiBtoBytes( value() ) / sectorSize;
case Percent:
if ( value() == 100 )
return totalSectors; // Common-case, avoid futzing around
else
return totalSectors * value() / 100;
}
// notreached
return -1;
}
qint64
ResizeFSJob::RelativeSize::apply( Device* d )
{
return apply( d->totalLogical(), d->logicalSize() );
}
ResizeFSJob::ResizeFSJob( QObject* parent )
: Calamares::CppJob( parent )
{
}
ResizeFSJob::~ResizeFSJob()
{
}
QString
ResizeFSJob::prettyName() const
{
return tr( "Resize Filesystem Job" );
}
ResizeFSJob::PartitionMatch
ResizeFSJob::findPartition( CoreBackend* backend )
{
using DeviceList = QList< Device* >;
DeviceList devices = backend->scanDevices( false );
cDebug() << "ResizeFSJob found" << devices.count() << "devices.";
for ( DeviceList::iterator dev_it = devices.begin(); dev_it != devices.end(); ++dev_it )
{
if ( ! (*dev_it) )
continue;
cDebug() << "ResizeFSJob found" << ( *dev_it )->deviceNode();
for ( auto part_it = PartitionIterator::begin( *dev_it ); part_it != PartitionIterator::end( *dev_it ); ++part_it )
{
cDebug() << ".." << ( *part_it )->mountPoint() << "on" << ( *part_it )->deviceNode();
if ( ( !m_fsname.isEmpty() && ( *part_it )->mountPoint() == m_fsname ) ||
( !m_devicename.isEmpty() && ( *part_it )->deviceNode() == m_devicename ) )
{
cDebug() << ".. matched configuration dev=" << m_devicename << "fs=" << m_fsname;
return PartitionMatch( *dev_it, *part_it );
}
}
}
cDebug() << "No match for configuration dev=" << m_devicename << "fs=" << m_fsname;
return PartitionMatch( nullptr, nullptr );
}
/** @brief Returns the last sector the matched partition should occupy.
*
* Returns a sector number. Returns -1 if something is wrong (e.g.
* can't resize at all, or missing data). Returns 0 if the resize
* won't fit because it doesn't satisfy the settings for atleast
* and size (or won't grow at all because the partition is blocked
* by occupied space after it).
*/
qint64
ResizeFSJob::findGrownEnd(ResizeFSJob::PartitionMatch m)
{
if ( !m.first || !m.second )
return -1; // Missing device data
if ( !ResizeOperation::canGrow( m.second ) )
return -1; // Operation is doomed
if ( !m_size.isValid() )
return -1; // Must have a grow-size
cDebug() << "Containing device size" << m.first->totalLogical();
qint64 last_available = m.first->totalLogical() - 1; // Numbered from 0
qint64 last_currently = m.second->lastSector();
cDebug() << "Growing partition" << m.second->firstSector() << '-' << last_currently;
for ( auto part_it = PartitionIterator::begin( m.first ); part_it != PartitionIterator::end( m.first ); ++part_it )
{
qint64 next_start = ( *part_it )->firstSector();
qint64 next_end = ( *part_it )->lastSector();
if ( next_start > next_end )
{
cWarning() << "Corrupt partition has end" << next_end << " < start" << next_start;
std::swap( next_start, next_end );
}
if ( ( *part_it )->roles().has( PartitionRole::Unallocated ) )
{
cDebug() << ".. ignoring unallocated" << next_start << '-' << next_end;
continue;
}
cDebug() << ".. comparing" << next_start << '-' << next_end;
if ( (next_start > last_currently) && (next_start < last_available) )
{
cDebug() << " .. shrunk last available to" << next_start;
last_available = next_start - 1; // Before that one starts
}
}
if ( !( last_available > last_currently ) )
{
cDebug() << "Partition can not grow larger.";
return 0;
}
qint64 expand = last_available - last_currently; // number of sectors
if ( m_atleast.isValid() )
{
qint64 required = m_atleast.apply( m.first );
if ( expand < required )
{
cDebug() << ".. need to expand by" << required << "but only" << expand << "is available.";
return 0;
}
}
qint64 wanted = m_size.apply( expand, m.first->logicalSize() );
if ( wanted < expand )
{
cDebug() << ".. only growing by" << wanted << "instead of full" << expand;
last_available -= ( expand - wanted );
}
return last_available;
}
Calamares::JobResult
ResizeFSJob::exec()
{
if ( !isValid() )
return Calamares::JobResult::error(
tr( "Invalid configuration" ),
tr( "The file-system resize job has an invalid configuration "
"and will not run." ) );
// Get KPMCore
auto backend_p = CoreBackendManager::self()->backend();
if ( backend_p )
cDebug() << "KPMCore backend @" << (void *)backend_p << backend_p->id() << backend_p->version();
else
{
cDebug() << "No KPMCore backend loaded yet";
QByteArray backendName = qgetenv( "KPMCORE_BACKEND" );
if ( !CoreBackendManager::self()->load( backendName.isEmpty() ? CoreBackendManager::defaultBackendName() : backendName ) )
{
cWarning() << "Could not load KPMCore backend.";
return Calamares::JobResult::error(
tr( "KPMCore not Available" ),
tr( "Calamares cannot start KPMCore for the file-system resize job." ) );
}
backend_p = CoreBackendManager::self()->backend();
}
if ( !backend_p )
{
cWarning() << "Could not load KPMCore backend (2).";
return Calamares::JobResult::error(
tr( "KPMCore not Available" ),
tr( "Calamares cannot start KPMCore for the file-system resize job." ) );
}
backend_p->initFSSupport(); // Might not be enough, see below
// Now get the partition and FS we want to work on
PartitionMatch m = findPartition( backend_p );
if ( !m.first || !m.second )
return Calamares::JobResult::error(
tr( "Resize Failed" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 could not be found in this system, and can not be resized." ).arg(m_fsname)
: tr( "The device %1 could not be found in this system, and can not be resized." ).arg(m_devicename) );
m.second->fileSystem().init(); // Initialize support for specific FS
if ( !ResizeOperation::canGrow( m.second ) )
{
cDebug() << "canGrow() returned false.";
return Calamares::JobResult::error(
tr( "Resize Failed" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname)
: tr( "The device %1 can not be resized." ).arg(m_devicename) );
}
qint64 new_end = findGrownEnd( m );
cDebug() << "Resize from"
<< m.second->firstSector() << '-' << m.second->lastSector()
<< '(' << m.second->length() << ')'
<< "to -" << new_end;
if ( new_end < 0 )
return Calamares::JobResult::error(
tr( "Resize Failed" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 can not be resized." ).arg(m_fsname)
: tr( "The device %1 can not be resized." ).arg(m_devicename) );
if ( new_end == 0 )
{
// TODO: is that a bad thing? is the resize required?
cWarning() << "Resize operation on" << m_fsname << m_devicename
<< "skipped as not-useful.";
return Calamares::JobResult::ok();
}
if ( ( new_end > 0 ) && ( new_end > m.second->lastSector() ) )
{
ResizeOperation op( *m.first, *m.second, m.second->firstSector(), new_end );
Report op_report( nullptr );
if ( op.execute( op_report ) )
cDebug() << "Resize operation OK.";
else
{
cDebug() << "Resize failed." << op_report.output();
return Calamares::JobResult::error(
tr( "Resize Failed" ),
op_report.toText() );
}
}
return Calamares::JobResult::ok();
}
void
ResizeFSJob::setConfigurationMap( const QVariantMap& configurationMap )
{
m_fsname = configurationMap["fs"].toString();
m_devicename = configurationMap["dev"].toString();
if ( m_fsname.isEmpty() && m_devicename.isEmpty() )
{
cWarning() << "No fs or dev configured for resize.";
return;
}
m_size = RelativeSize( configurationMap["size"].toString() );
m_atleast = RelativeSize( configurationMap["atleast"].toString() );
}
CALAMARES_PLUGIN_FACTORY_DEFINITION( ResizeFSJobFactory, registerPlugin<ResizeFSJob>(); )

View File

@ -0,0 +1,121 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2018, Adriaan de Groot <groot@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RESIZEFSJOB_H
#define RESIZEFSJOB_H
#include <QObject>
#include <QVariantMap>
#include <CppJob.h>
#include <utils/PluginFactory.h>
#include <PluginDllMacro.h>
class CoreBackend; // From KPMCore
class Device; // From KPMCore
class Partition;
class PLUGINDLLEXPORT ResizeFSJob : public Calamares::CppJob
{
Q_OBJECT
public:
/** @brief Size expressions
*
* Sizes can be specified in MiB or percent (of the device they
* are on). This class handles parsing of such strings from the
* config file.
*/
class RelativeSize
{
public:
RelativeSize();
RelativeSize( const QString& );
enum Unit
{
None,
Percent,
Absolute
};
int value() const { return m_value; }
Unit unit() const { return m_unit; }
bool isValid() const
{
return ( unit() != None ) && ( value() > 0 );
}
/** @brief Apply this size to the number of sectors @p totalSectors .
*
* Each sector has size @p sectorSize , for converting absolute
* sizes in MiB to sector counts.
*
* For invalid sizes, returns -1.
* For absolute sizes, returns the number of sectors needed.
* For percent sizes, returns that percent of the number of sectors.
*/
qint64 apply( qint64 totalSectors, qint64 sectorSize );
/** @brief Apply this size to the given device.
*
* Equivalent to apply( d->totalLogical(), d->logicalSize() )
*/
qint64 apply( Device* d );
private:
int m_value;
Unit m_unit;
} ;
explicit ResizeFSJob( QObject* parent = nullptr );
virtual ~ResizeFSJob() override;
QString prettyName() const override;
Calamares::JobResult exec() override;
void setConfigurationMap( const QVariantMap& configurationMap ) override;
/** @brief Is the configuration of this job valid? */
bool isValid() const
{
return ( !m_fsname.isEmpty() || !m_devicename.isEmpty() ) &&
m_size.isValid();
}
private:
RelativeSize m_size;
RelativeSize m_atleast;
QString m_fsname; // Either this, or devicename, is set, not both
QString m_devicename;
using PartitionMatch = QPair<Device*, Partition*>;
/** @brief Find the configured FS using KPMCore @p backend */
PartitionMatch findPartition( CoreBackend* backend );
/** @brief Return a new end-sector for the given dev-part pair. */
qint64 findGrownEnd( PartitionMatch );
};
CALAMARES_PLUGIN_FACTORY_DECLARATION( ResizeFSJobFactory )
#endif // RESIZEFSJOB_H

View File

@ -0,0 +1,126 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2017-2018, Adriaan de Groot <groot@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Tests.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "Settings.h"
#include "utils/Logger.h"
#include "utils/YamlUtils.h"
#include <yaml-cpp/yaml.h>
#include <QtTest/QtTest>
#include <QFileInfo>
#include <QStringList>
#define private public
#include "ResizeFSJob.h"
#undef private
QTEST_GUILESS_MAIN( FSResizerTests )
FSResizerTests::FSResizerTests()
{
}
FSResizerTests::~FSResizerTests()
{
}
void
FSResizerTests::initTestCase()
{
}
void FSResizerTests::testConfigurationRobust()
{
ResizeFSJob j;
// Empty config
j.setConfigurationMap( QVariantMap() );
QVERIFY( j.m_fsname.isEmpty() );
QVERIFY( j.m_devicename.isEmpty() );
QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::None );
QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None );
// Config is missing fs and dev, so it isn't valid
YAML::Node doc0 = YAML::Load( R"(---
size: 100%
atleast: 600MiB
)" );
j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() );
QVERIFY( j.m_fsname.isEmpty() );
QVERIFY( j.m_devicename.isEmpty() );
QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::None );
QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None );
QCOMPARE( j.m_size.value(), 0 );
QCOMPARE( j.m_atleast.value(), 0 );
}
void FSResizerTests::testConfigurationValues()
{
ResizeFSJob j;
// Check both
YAML::Node doc0 = YAML::Load( R"(---
fs: /
size: 100%
atleast: 600MiB
)" );
j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() );
QVERIFY( !j.m_fsname.isEmpty() );
QVERIFY( j.m_devicename.isEmpty() );
QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Percent );
QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::Absolute );
QCOMPARE( j.m_size.value(), 100 );
QCOMPARE( j.m_atleast.value(), 600 );
// Silly config
doc0 = YAML::Load( R"(---
fs: /
dev: /dev/m00
size: 72 MiB
atleast: 127 %
)" );
j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() );
QVERIFY( !j.m_fsname.isEmpty() );
QVERIFY( !j.m_devicename.isEmpty() );
QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Absolute );
QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::Percent );
QCOMPARE( j.m_size.value(), 72 );
QCOMPARE( j.m_atleast.value(), 127 );
// Silly config
doc0 = YAML::Load( R"(---
fs: /
# dev: /dev/m00
size: 71MiB
# atleast: 127%
)" );
j.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc0 ).toMap() );
QVERIFY( !j.m_fsname.isEmpty() );
QVERIFY( j.m_devicename.isEmpty() );
QCOMPARE( j.m_size.unit(), ResizeFSJob::RelativeSize::Absolute );
QCOMPARE( j.m_atleast.unit(), ResizeFSJob::RelativeSize::None );
QCOMPARE( j.m_size.value(), 71 );
QCOMPARE( j.m_atleast.value(), 0 );
}

View File

@ -0,0 +1,39 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2018, Adriaan de Groot <groot@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TESTS_H
#define TESTS_H
#include <QObject>
class FSResizerTests : public QObject
{
Q_OBJECT
public:
FSResizerTests();
~FSResizerTests() override;
private Q_SLOTS:
void initTestCase();
// Can handle missing values
void testConfigurationRobust();
// Can parse % and MiB values
void testConfigurationValues();
};
#endif

View File

@ -0,0 +1,37 @@
# Module that resizes a single FS to fill the entire (rest) of
# a device. This is used in OEM situations where an image is
# flashed onto an SD card (or similar) and used to boot a device,
# after which the FS should expand to fill the SD card.
#
# Example: a distro produces a 6GiB large image that is
# written to an 8GiB SD card; the FS should expand to take
# advantage of the unused 2GiB. The FS should expand much
# more if the same image is written to a 16GiB card.
---
# Which FS needs to be grown? Choose one way to identify it:
# - *fs* names a mount point which should already be mounted
# in the system.
# - *dev* names a device
fs: /
# dev: /dev/mmcblk0p1
# How much of the total remaining space should the FS use?
# The only sensible amount is "all of it". The value is
# in percent, so set it to 100. Perhaps a fixed size is
# needed (that would be weird though, since you don't know
# how big the card is), use MiB as suffix in that case.
# If missing, then it's assumed to be 0, and no resizing
# will happen.
#
# Percentages apply to **available space**.
size: 100%
# Resizing might not be worth it, though. Set the minimum
# that it must grow; if it cannot grow that much, the
# resizing is skipped. Can be in percentage or absolute
# size, as above. If missing, then it's assumed to be 0,
# which means resizing is always worthwhile.
#
# Percentages apply to **total device size**.
atleast: 1000MiB

View File

@ -65,6 +65,8 @@ SetKeyboardLayoutJob::prettyName() const
QString QString
SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) const SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath ) const
{ {
cDebug() << "Looking for converted keymap in" << convertedKeymapPath;
// No search path supplied, assume the distribution does not provide // No search path supplied, assume the distribution does not provide
// converted keymaps // converted keymaps
if ( convertedKeymapPath.isEmpty() ) if ( convertedKeymapPath.isEmpty() )
@ -76,8 +78,7 @@ SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath )
if ( convertedKeymapDir.exists( name + ".map" ) if ( convertedKeymapDir.exists( name + ".map" )
|| convertedKeymapDir.exists( name + ".map.gz" ) ) || convertedKeymapDir.exists( name + ".map.gz" ) )
{ {
cDebug() << "Found converted keymap" << name; cDebug() << ".. Found converted keymap" << name;
return name; return name;
} }
@ -88,6 +89,8 @@ SetKeyboardLayoutJob::findConvertedKeymap( const QString& convertedKeymapPath )
QString QString
SetKeyboardLayoutJob::findLegacyKeymap() const SetKeyboardLayoutJob::findLegacyKeymap() const
{ {
cDebug() << "Looking for legacy keymap in QRC";
int bestMatching = 0; int bestMatching = 0;
QString name; QString name;
@ -137,7 +140,7 @@ SetKeyboardLayoutJob::findLegacyKeymap() const
// The best matching entry so far, then let's save that // The best matching entry so far, then let's save that
if ( matching >= qMax( bestMatching, 1 ) ) if ( matching >= qMax( bestMatching, 1 ) )
{ {
cDebug() << "Found legacy keymap" << mapping[0] cDebug() << ".. Found legacy keymap" << mapping[0]
<< "with score" << matching; << "with score" << matching;
if ( matching > bestMatching ) if ( matching > bestMatching )

View File

@ -1,6 +1,14 @@
# Copied from systemd-localed # Copied from systemd-localed
# http://cgit.freedesktop.org/systemd/systemd/log/src/locale/kbd-model-map #
# https://cgit.freedesktop.org/systemd/systemd/log/src/locale/kbd-model-map
# (originally under LGPLv2.1+, used under the LGPL to GPL conversion clause) # (originally under LGPLv2.1+, used under the LGPL to GPL conversion clause)
#
# This is the version from 534644b7be7b240eb0fbbe06e20cbecbe8206767,
# committed 2015-01-22 01:07:24 .
#
# Updates:
# - 2018-09-26 Added "Austrian" keyboard (de at). Issue #1035
#
# Generated from system-config-keyboard's model list # Generated from system-config-keyboard's model list
# consolelayout xlayout xmodel xvariant xoptions # consolelayout xlayout xmodel xvariant xoptions
sg ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp sg ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp
@ -10,6 +18,7 @@ trq tr pc105 - terminate:ctrl_alt_bksp
uk gb pc105 - terminate:ctrl_alt_bksp uk gb pc105 - terminate:ctrl_alt_bksp
is-latin1 is pc105 - terminate:ctrl_alt_bksp is-latin1 is pc105 - terminate:ctrl_alt_bksp
de de pc105 - terminate:ctrl_alt_bksp de de pc105 - terminate:ctrl_alt_bksp
de at pc105 - terminate:ctrl_alt_bksp
la-latin1 latam pc105 - terminate:ctrl_alt_bksp la-latin1 latam pc105 - terminate:ctrl_alt_bksp
us us pc105+inet - terminate:ctrl_alt_bksp us us pc105+inet - terminate:ctrl_alt_bksp
ko kr pc105 - terminate:ctrl_alt_bksp ko kr pc105 - terminate:ctrl_alt_bksp

View File

@ -134,7 +134,7 @@ def run():
if os.path.exists(target_locale_gen_bak): if os.path.exists(target_locale_gen_bak):
shutil.copy2(target_locale_gen_bak, target_locale_gen) shutil.copy2(target_locale_gen_bak, target_locale_gen)
libcalamares.utils.debug("Restored backup {!s} -> {!s}" libcalamares.utils.debug("Restored backup {!s} -> {!s}"
.format(target_locale_gen_bak).format(target_locale_gen)) .format(target_locale_gen_bak, target_locale_gen))
# run locale-gen if detected; this *will* cause an exception # run locale-gen if detected; this *will* cause an exception
# if the live system has locale.gen, but the target does not: # if the live system has locale.gen, but the target does not:

View File

@ -18,7 +18,7 @@
* along with Calamares. If not, see <http://www.gnu.org/licenses/>. * along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <core/PartitionIterator.h> #include "PartitionIterator.h"
// KPMcore // KPMcore
#include <kpmcore/core/device.h> #include <kpmcore/core/device.h>

View File

@ -50,6 +50,9 @@
#include <kpmcore/core/device.h> #include <kpmcore/core/device.h>
#include <kpmcore/core/partition.h> #include <kpmcore/core/partition.h>
#ifdef WITH_KPMCOREGT33
#include <kpmcore/core/softwareraid.h>
#endif
#include <QBoxLayout> #include <QBoxLayout>
#include <QButtonGroup> #include <QButtonGroup>
@ -1230,6 +1233,13 @@ ChoicePage::setupActions()
bool atLeastOneCanBeResized = false; bool atLeastOneCanBeResized = false;
bool atLeastOneCanBeReplaced = false; bool atLeastOneCanBeReplaced = false;
bool atLeastOneIsMounted = false; // Suppress 'erase' if so bool atLeastOneIsMounted = false; // Suppress 'erase' if so
bool isInactiveRAID = false;
#ifdef WITH_KPMCOREGT33
if ( currentDevice->type() == Device::Type::SoftwareRAID_Device &&
static_cast< SoftwareRAID* >(currentDevice)->status() == SoftwareRAID::Status::Inactive )
isInactiveRAID = true;
#endif
for ( auto it = PartitionIterator::begin( currentDevice ); for ( auto it = PartitionIterator::begin( currentDevice );
it != PartitionIterator::end( currentDevice ); ++it ) it != PartitionIterator::end( currentDevice ); ++it )
@ -1353,7 +1363,7 @@ ChoicePage::setupActions()
else else
force_uncheck( m_grp, m_alongsideButton ); force_uncheck( m_grp, m_alongsideButton );
if ( !atLeastOneIsMounted ) if ( !atLeastOneIsMounted && !isInactiveRAID )
m_eraseButton->show(); // None mounted m_eraseButton->show(); // None mounted
else else
force_uncheck( m_grp, m_eraseButton ); force_uncheck( m_grp, m_eraseButton );

View File

@ -72,7 +72,7 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device, PartitionNode* par
m_ui->encryptWidget->setText( tr( "En&crypt" ) ); m_ui->encryptWidget->setText( tr( "En&crypt" ) );
m_ui->encryptWidget->hide(); m_ui->encryptWidget->hide();
if (m_device->type() == Device::Type::Disk_Device) { if (m_device->type() != Device::Type::LVM_Device) {
m_ui->lvNameLabel->hide(); m_ui->lvNameLabel->hide();
m_ui->lvNameLineEdit->hide(); m_ui->lvNameLineEdit->hide();
} }

View File

@ -4,6 +4,7 @@
* Copyright 2015-2016, Teo Mrnjavac <teo@kde.org> * Copyright 2015-2016, Teo Mrnjavac <teo@kde.org>
* Copyright 2018, Adriaan de Groot <groot@kde.org> * Copyright 2018, Adriaan de Groot <groot@kde.org>
* Copyright 2018, Andrius Štikonas <andrius@stikonas.eu> * Copyright 2018, Andrius Štikonas <andrius@stikonas.eu>
* Copyright 2018, Caio Jordão Carvalho <caiojcarvalho@gmail.com>
* *
* 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
@ -47,6 +48,9 @@
// KPMcore // KPMcore
#include <kpmcore/core/device.h> #include <kpmcore/core/device.h>
#include <kpmcore/core/partition.h> #include <kpmcore/core/partition.h>
#ifdef WITH_KPMCOREGT33
#include <kpmcore/core/softwareraid.h>
#endif
#include <kpmcore/ops/deactivatevolumegroupoperation.h> #include <kpmcore/ops/deactivatevolumegroupoperation.h>
#include <kpmcore/ops/removevolumegroupoperation.h> #include <kpmcore/ops/removevolumegroupoperation.h>
@ -146,6 +150,7 @@ PartitionPage::updateButtons()
bool isInVG = m_core->isInVG( partition ); bool isInVG = m_core->isInVG( partition );
create = isFree; create = isFree;
// Keep it simple for now: do not support editing extended partitions as // Keep it simple for now: do not support editing extended partitions as
// it does not work with our current edit implementation which is // it does not work with our current edit implementation which is
// actually remove + add. This would not work with extended partitions // actually remove + add. This would not work with extended partitions
@ -160,8 +165,20 @@ PartitionPage::updateButtons()
if ( m_ui->deviceComboBox->currentIndex() >= 0 ) if ( m_ui->deviceComboBox->currentIndex() >= 0 )
{ {
QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 );
if ( m_core->deviceModel()->deviceForIndex( deviceIndex )->type() != Device::Type::LVM_Device ) auto device = m_core->deviceModel()->deviceForIndex( deviceIndex );
if ( device->type() != Device::Type::LVM_Device )
{
createTable = true; createTable = true;
#ifdef WITH_KPMCOREGT33
if ( device->type() == Device::Type::SoftwareRAID_Device &&
static_cast< SoftwareRAID* >(device)->status() == SoftwareRAID::Status::Inactive )
{
createTable = false;
create = false;
}
#endif
}
else else
{ {
currentDeviceIsVG = true; currentDeviceIsVG = true;

View File

@ -87,7 +87,7 @@ int main(int argc, char** argv)
if ( !doc.IsMap() ) if ( !doc.IsMap() )
{ {
cerr << "WARNING:" << filename << '\n'; cerr << "WARNING:" << filename << '\n';
cerr << "WARNING: not-a-YAML-map\n"; cerr << "WARNING: not-a-YAML-map (type=" << doc.Type() << ")\n";
return 1; return 1;
} }