Compare commits

...

117 Commits

Author SHA1 Message Date
Adriaan de Groot
ea744a0c0c [partition] On FreeBSD, don't expect the KPMCore test to work 2024-06-20 19:48:47 +02:00
Adriaan de Groot
991be792c0 [rawfs] Do not mark tests on FreeBSD as "must fail" 2024-06-20 19:43:50 +02:00
Adriaan de Groot
3d4b408c93 [rawfs] Read blkid stdout only once, be more clear when there isn't a uuid 2024-06-20 19:38:48 +02:00
Adriaan de Groot
2e825167a3 [rawfs] Don't bother updating mount if this is a test (bogus) run
This improves things when running tests on FreeBSD, which doesn't
have a /proc/mounts to read.
2024-06-20 19:34:27 +02:00
Adriaan de Groot
52cff12c38 [displaymanager] Repair test for gdm3
This was intended to check code for obvious logical
failures, but also stops tests because the gdm
paths don't exist. For testing purposes, create
bogus gdm3 executable in the "target" tempdir.
2024-06-20 19:21:07 +02:00
Adriaan de Groot
84d1599845 Changes: pre-release housekeeping 2024-06-20 17:08:55 +02:00
Adriaan de Groot
81c82ef343 [displaymanager] Look for variant gdm config files
FIXES #2335
2024-06-11 00:21:35 +02:00
Adriaan de Groot
ad28ae08b6 Changes: document existence of new initcpiocfg settings 2024-06-10 22:47:42 +02:00
Adriaan de Groot
f651fc9bff [initcpiocfg] Allow alternate source file
This is possibly only interesting for testing purposes.
2024-06-10 22:37:55 +02:00
Adriaan de Groot
19b0f28f16 [initcpiocfg] Support additional hooks-munging
FIXES #2200
2024-06-10 22:17:21 +02:00
Adriaan de Groot
48554cf310 Changes: document new shellprocess possibilities 2024-05-14 23:38:05 +02:00
Adriaan de Groot
461f011521 [libcalamares] Avoid some undesirable overloads
Implicit int -> bool had a comment, which suggests it should just
be deleted from the overload set to avoid possible confusion.
2024-05-14 23:38:05 +02:00
Adriaan de Groot
8a14ddc97c [shellprocess] Allow gs[key] variables in commands 2024-05-14 23:38:05 +02:00
Adriaan de Groot
448633ab02 [contextualprocess] Refer documentation to shellprocess 2024-05-14 21:45:34 +02:00
Adriaan de Groot
5d19b875a1 [keyboard] Prefer layout "it" over "it2" for Italian
FIXES #2326
2024-05-14 21:31:12 +02:00
Adriaan de Groot
eb1e5a201f i18n: update English sources 2024-05-01 00:10:49 +02:00
Calamares CI
1caaac565b i18n: [python] Automatic merge of Transifex translations 2024-05-01 00:08:23 +02:00
Calamares CI
fb6f3a5f39 i18n: [calamares] Automatic merge of Transifex translations 2024-05-01 00:08:23 +02:00
Adriaan de Groot
66e028862f Changes: update contributors 2024-04-28 23:20:36 +02:00
Adriaan de Groot
17821c6ea1 Merge pull request #2325 from ivan1986/non-ascii
add layouts from xkb/ruses/base $nonlatin
2024-04-28 23:17:29 +02:00
Adriaan de Groot
5a56188a51 Merge branch 'calamares' into non-ascii 2024-04-28 23:17:11 +02:00
Adriaan de Groot
616a97f60e Merge pull request #2324 from parchlinux/persian-keyboard
Fixed the persian keyboard problem after installing.
2024-04-28 23:13:16 +02:00
Adriaan de Groot
d6897d6c36 Changes: update contributors 2024-04-28 23:11:52 +02:00
Adriaan de Groot
da2ed4728a Merge pull request #2314 from eugenesan/i2310
Refactor crypto_keyfile addition in fstab module and skip it when it's missing
2024-04-28 23:09:56 +02:00
Adriaan de Groot
e6e46f1ebd [partition] Polishing, formatting 2024-04-28 23:07:56 +02:00
Adriaan de Groot
fd37beae8b Changes: update contributors 2024-04-28 20:42:24 +02:00
dalto8
1c1ade6816 Merge pull request #2316 from SixK/calamares
[partition] add option for the encryption checkbox to be checked by default
2024-04-28 15:58:43 +00:00
Adriaan de Groot
1ead64bd5b Merge pull request #2322 from calamares/fixalongsidecrash
[partition] Don't crash when going back without selecting a partition
2024-04-28 17:53:57 +02:00
Adriaan de Groot
366552f743 Changes: update contributors
See #2323 ; Vladislav pointed out the incompatibility
but I implemented something different from the PR.
2024-04-28 17:52:39 +02:00
Adriaan de Groot
4440bf3bfc [partition] Simplify collecting partition descriptions 2024-04-28 17:45:51 +02:00
Adriaan de Groot
4c8e91dc70 [libcalamares] Simplify collecting the maintainers info 2024-04-28 17:38:35 +02:00
Adriaan de Groot
d6c6b7c64b [libcalamares] Remove the commented-out sponsor info 2024-04-28 17:36:27 +02:00
Adriaan de Groot
bdbeadcd65 [partition] Move fstab-handling
This was declared in osprober, but implemented elsewhere.
Move it to the "right" source file, add tests.
While here, repair the listing of fstab entries
(invalid entries were not stripped).
2024-04-28 17:22:16 +02:00
Adriaan de Groot
93094948fa [partition] Actually remove invalid fstab entries 2024-04-28 17:01:07 +02:00
Adriaan de Groot
35990d9a6b [libcalamares] Massage size types to avoid conversion warning 2024-04-28 17:01:07 +02:00
Adriaan de Groot
6dc83fb277 [libcalamares] Deal with Qt5/6 differences in count() 2024-04-28 17:01:07 +02:00
Adriaan de Groot
8c66a558d5 [welcome] Use different color-name
The QColorConstants are deprecated, use other names instead
(this avoids a compile warning from clang against Qt5).
2024-04-28 14:38:14 +02:00
Adriaan de Groot
5a90e0bc6a [users] Remove stray ; 2024-04-28 14:37:19 +02:00
Ivan Borzenkov
f8c6d2c487 add layouts from xkb/ruses/base $nonlatin 2024-04-27 14:26:30 +03:00
Sohrab Behdani
246aa3e217 Fixed Persian Keyboard problem after installing 2024-04-27 13:29:03 +03:30
Sohrab Behdani
cae7b9e868 Added additional keyboard layout for Persian 2024-04-27 10:46:41 +03:30
dalto
cf9837f48c [partition] Don't crash is when going back without selecting a partition 2024-04-22 15:47:28 -05:00
Eugene San (eugenesan)
a7e86e8aff Make sure we do not use missing crypto_keyfile in fstab module
Replaces original commit with refactoring
Refactoring will have to wait
2024-04-17 19:55:20 -07:00
Adriaan de Groot
19aa96fe54 [packagechooser] Repair build
This was broken by clang-format, so mark this weird unformattable
block as don't format.
2024-04-17 11:08:39 +02:00
Adriaan de Groot
00ac9a6cee [welcome] Apply newer clang-formatting 2024-04-17 10:55:24 +02:00
Adriaan de Groot
92a5d07ed7 [partition] Apply newer clang-formatting 2024-04-17 10:55:21 +02:00
Adriaan de Groot
5bf787c1a5 [packagechooser] Apply newer clang-formatting 2024-04-17 10:55:20 +02:00
Adriaan de Groot
011483967d [machineid] Apply newer clang-formatting 2024-04-17 10:55:19 +02:00
Adriaan de Groot
5f293fb40b [locale] Apply newer clang-formatting 2024-04-17 10:55:18 +02:00
Adriaan de Groot
a6cfc79a92 [license] Apply newer clang-formatting 2024-04-17 10:55:18 +02:00
Adriaan de Groot
afd3ed86d9 [keyboard] Apply newer clang-formatting 2024-04-17 10:55:18 +02:00
Adriaan de Groot
9654f487ef [fsresizer] Apply newer clang-formatting 2024-04-17 10:55:17 +02:00
Adriaan de Groot
2100d273ce [finished] Apply newer clang-formatting 2024-04-17 10:55:16 +02:00
Adriaan de Groot
df09d7ae89 [calamares] Apply newer clang-formatting 2024-04-17 10:52:32 +02:00
Adriaan de Groot
8408a3284b [libcalamaresui] Apply newer clang-formatting 2024-04-17 10:51:25 +02:00
Adriaan de Groot
4625208ba2 [libcalamares] Apply newer clang-formatting 2024-04-17 10:50:38 +02:00
Adriaan de Groot
09dae0437e CI: prefer newer clang-format over older 2024-04-17 10:48:04 +02:00
Adriaan de Groot
cca2cd3260 [libcalamares] Remove unnecessary QApplication 2024-04-17 10:11:40 +02:00
Penvern Vincent
8469fbd2e8 Fix Next button behviour for all combinations of
enableLuksAutomatedPartitioning and preCheckEncryption configure file
variables
2024-04-16 18:08:11 +02:00
Adriaan de Groot
c8c0e783c3 Changes: post-release housekeeping 2024-04-16 15:56:48 +02:00
Adriaan de Groot
2e96184406 [partition] Simplify logic, remove dead code 2024-04-16 15:46:09 +02:00
Adriaan de Groot
0a0e647be3 [hostinfo] Do not name unused parameter 2024-04-16 15:42:59 +02:00
Adriaan de Groot
370e75fc71 [libcalamares] Repair apidox for Job 2024-04-16 15:41:12 +02:00
Adriaan de Groot
bcf27aa311 Changes: pre-release housekeeping 2024-04-16 15:31:51 +02:00
Adriaan de Groot
0095e30843 Changes: document sleep / suspend 2024-04-16 15:09:32 +02:00
Adriaan de Groot
8ff3849820 [calamares] Switch test-application to use JobQueue
For better realism, use JobQueue to run the jobs of a module,
rather than doing it by hand in a similar-kind-of-loop.
2024-04-16 15:07:58 +02:00
Adriaan de Groot
bf09dfc6af [libcalamares] Suppress sleep / suspend during installation 2024-04-16 15:07:58 +02:00
demmm
f8094bbbbb [localeq] tiny correction map-qt6.qml
api.geonames is not https ready
2024-04-16 12:28:30 +02:00
Penvern Vincent
5ac23cd3d6 Remove m_preCheckEncryption variable from ChoicePage 2024-04-15 22:44:42 +02:00
Penvern Vincent
cc835cee6f do not use Global Storage for variable PreCheckEncryption, other modules
don't have to know if this variable is set to true or false
2024-04-15 16:34:35 +02:00
Adriaan de Groot
30ca0bfa45 [locale] Fix TZ assignments for various locations
- Tehran (UTC+3.5)
- Muscat (UTC+4)
- Dubai (UTC+4)
2024-04-14 22:58:22 +02:00
Adriaan de Groot
685e9db3f7 Changes: credits 2024-04-14 22:16:40 +02:00
Adriaan de Groot
51e05241fe [users] Use Calamares command-running API 2024-04-14 22:15:13 +02:00
Adriaan de Groot
dfe07a51a3 [users] Only run AD job if it is enabled (user choice) 2024-04-14 21:41:57 +02:00
Adriaan de Groot
0ef3842da6 [users] Factor out show/hide of AD controls
While here, expand documentation a little.
2024-04-14 21:33:39 +02:00
Adriaan de Groot
f674214741 [user] Rename members to emphasize these are *admin* credentials 2024-04-14 21:07:31 +02:00
Adriaan de Groot
c61399bc8a [users] Apply coding style to unrelated files 2024-04-14 09:53:56 +02:00
Adriaan de Groot
28a10cf8c3 [users] Use more structured data than QStringList
While here, apply coding style.
2024-04-14 09:53:27 +02:00
Adriaan de Groot
2127129227 [users] Use API to get file-paths in target 2024-04-14 09:25:03 +02:00
Adriaan de Groot
d0420ea3ee [users] Add translation context to AD job 2024-04-14 00:20:57 +02:00
Adriaan de Groot
fe68b45fc5 [libcalamares] Explain updating-status-text mechanism 2024-04-13 23:37:49 +02:00
Adriaan de Groot
fb83ad326b [libcalamares] Document recommended translation contexts
Jobs have specific contexts for their different strings.
Many jobs (now) misuse prettyName() as a status message,
although the existing fallback mechanism means that the
name gets used as if it is a status message when the job
does not define a description or status.
2024-04-13 23:30:57 +02:00
Adriaan de Groot
219befacbf Merge pull request #2300 from lubuntu-team/calamares
Active Directory Support
2024-04-13 22:11:29 +02:00
Penvern Vincent
70a59d6cd1 add possibility to pre check encryption checkox 2024-04-13 02:09:09 +02:00
Adriaan de Groot
131b2eded1 Changes: update credits 2024-04-12 22:10:39 +02:00
Adriaan de Groot
f6cd82f9a4 [bootloader] Group local variables
Put the constants -- do we use systemd, what are the partitions --
together, and put the things-set-by-the-loop together.
2024-04-12 22:08:54 +02:00
Adriaan de Groot
6d242b67f9 [bootloader] Start building kernel parameters earlier
- drop unnecessary variable
- build "quiet splash rw" first
2024-04-12 22:05:47 +02:00
Adriaan de Groot
b4edf52198 [bootloader] Avoid indirection through shell
There's no need to run the shell to take apart the arguments to grep.
2024-04-12 21:55:26 +02:00
Adriaan de Groot
b8049daa45 [bootloader] Factor out running "which" in target
which is an actual program, drop the round-about via shell
2024-04-12 21:42:49 +02:00
Adriaan de Groot
d9fceac06e Merge pull request #2315 from eugenesan/i2311
Mirror GRUB's splash screen functionality for non-grub booloaders
2024-04-12 21:36:37 +02:00
Eugene San (eugenesan)
51d6dd23ea Mirror GRUB's splash screen functionality for non-grub booloaders 2024-04-12 12:08:47 -07:00
Adriaan de Groot
1645874973 Changes: post-release housekeeping 2024-04-09 15:57:30 +02:00
Adriaan de Groot
b78721d4b9 Changes: update credits 2024-04-09 15:56:03 +02:00
Adriaan de Groot
134b2c8d83 Merge pull request #2305 from ptr1337/plymouthcfg-fix
plymouthcfg: Use plymouth-set-default-theme instead of sed
2024-04-09 15:50:01 +02:00
Adriaan de Groot
4406a879bc CI: use python-yaml instead of yq if needed (fedora) 2024-04-06 23:38:20 +02:00
Adriaan de Groot
2c52adc8e8 CI: expand functionality of build.sh
Make it easier to "just do the nightly build" in a Docker
setting by passing the name of the workflow to the script.
2024-04-06 23:11:32 +02:00
Adriaan de Groot
17b72b0fd8 CI: appstream-qt6 for opensuse builds 2024-04-06 23:08:02 +02:00
Adriaan de Groot
922b8aaaec CI: install opensuse-qt6 deps before building with qt6 2024-04-06 22:34:27 +02:00
Adriaan de Groot
b950f0f6d4 [users] Remove duplicated constant (a regexp) 2024-04-02 23:33:21 +02:00
Adriaan de Groot
fbde737802 [partition] Don't redundantly specify value binding in lambda 2024-04-02 23:33:21 +02:00
Adriaan de Groot
14c8893b03 [libcalamares] Turn off Clang 17 warning for MOC
The build produces a zillion warnings about unsafe buffer usage
in the code that wrangles metaobjects and slot names. That is
generated code and we can't fix it.
2024-04-02 23:33:21 +02:00
Adriaan de Groot
b396f70d12 [partition] Fix typo's in example config 2024-04-02 23:33:21 +02:00
Adriaan de Groot
36485c8571 [partition] Simplify logic for checking for unencrypted /boot 2024-04-02 23:33:21 +02:00
demmm
f0c2295606 [localeq]Map-qt6 needed changes for Qt6 & Wayland
dragging & zooming now needs QML entries
osm is the only qtlocation provided map plugin, preferred thus useless now
no solution yet for warning (API key required), upstream bug reports offer no fix,
example https://bugreports.qt.io/browse/QTBUG-115742
2024-03-30 20:11:48 +01:00
Peter Jung
2fd98c913a plymouthcfg: Use plymouth-set-default-theme instead of sed
Currently we are running into an issue, when setting the default theme via "sed", since the "[DAEMON]" entry in /etc/plymouth/plymouthd.conf is commented, which results into that the theme is not correctly applied.

Signed-off-by: Peter Jung <admin@ptr1337.dev>
2024-03-29 20:05:41 +01:00
Adriaan de Groot
8440a6a5dd CI: switch openSUSE build to Qt6 2024-03-29 02:09:51 +04:00
Adriaan de Groot
ec0316806f [locale] Fix build with DEBUG_TIMEZONES 2024-03-29 02:09:18 +04:00
Adriaan de Groot
6b2c996d06 Merge pull request #2303 from calamares/mount_efi_fix
[mount] Ensure efi partition gets correct options
2024-03-26 16:32:19 +01:00
demmm
36f57463ef Merge pull request #2304 from manchicken/patch-1
Update Presentation.qml
2024-03-25 11:04:53 +01:00
Mike Stemle
a659db1f9c Update Presentation.qml
The `padding` property is present in the qt5 version, but not the qt6 version. I notice a syntax error as a result of this missing propertly.
2024-03-24 13:27:44 -04:00
dalto
bdd059ffa8 [displaymanager] Fix sddm config file writing to the wrong location 2024-03-23 09:43:15 -05:00
dalto
e8726111f8 [mount] Ensure efi partition gets correct options 2024-03-17 19:03:02 -05:00
dalto8
2204c58b44 Merge pull request #2299 from ptr1337/initcpiocfg-microcode
initcpiocfg: Add microcode module
2024-03-13 17:57:59 +00:00
Adriaan de Groot
e06ea94664 Merge pull request #2301 from hsitter/work/sitter/pic
on Qt6 we need to build with position independent code
2024-03-10 10:38:31 +01:00
Harald Sitter
d33d9e8dae on Qt6 we need to build with position independent code
otherwise linking may fail with

> copy relocation against non-copyable protected symbol `qt_resourceFeatureZstd@@Qt_6'
2024-03-10 01:33:52 +01:00
Simon Quigley
408ee0338a Active Directory Support 2024-03-07 15:26:32 -06:00
Peter Jung
60c5f3fd5a initcpiocfg: Add microcode module
Signed-off-by: Peter Jung <admin@ptr1337.dev>
2024-03-04 19:44:03 +01:00
115 changed files with 1993 additions and 918 deletions

View File

@@ -1,33 +0,0 @@
name: nightly-opensuse-qt6
on:
schedule:
- cron: "32 2 * * *"
workflow_dispatch:
env:
BUILDDIR: /build
SRCDIR: ${{ github.workspace }}
CMAKE_ARGS: |
-DKDE_INSTALL_USE_QT_SYS_PATHS=ON
-DCMAKE_BUILD_TYPE=Debug
-DWITH_QT6=ON
jobs:
build:
runs-on: ubuntu-latest
container:
image: docker://opensuse/tumbleweed
options: --tmpfs /build:rw --user 0:0
steps:
- name: "prepare git"
shell: bash
run: zypper --non-interactive in git-core jq curl
- name: "prepare source"
uses: calamares/actions/generic-checkout@v5
- name: "install dependencies"
shell: bash
run: ./ci/deps-opensuse-qt6.sh
- name: "build"
shell: bash
run: ./ci/build.sh

View File

@@ -15,6 +15,7 @@ env:
-DBUILD_TESTING=ON
-DBUILD_APPSTREAM=ON
-DBUILD_APPDATA=ON
-DWITH_QT6=ON
jobs:
build:
@@ -30,7 +31,7 @@ jobs:
uses: calamares/actions/generic-checkout@v5
- name: "install dependencies"
shell: bash
run: ./ci/deps-opensuse.sh
run: ./ci/deps-opensuse-qt6.sh
- name: "build"
shell: bash
run: ./ci/build.sh

View File

@@ -7,11 +7,74 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.3.0. See CHANGES-3.2 for
the history of the 3.2 series (2018-05 - 2022-08).
# 3.3.7 (2024-06-20)
This release contains contributions from (alphabetically by first name):
- Adriaan de Groot
- Eugene San
- Evan James
- Ivan Borzenkov
- Sohrab Behdani
- Vincent Penvern
- Vladislav Nepogodin
## Core ##
- Updated clang-formatting
- Some C++20 future-proofing (thanks Vladislav)
- CommandList (used by *contextualprocess* and *shellprocess*) now supports
globalstorage keys as substitutable variables.
## Modules ##
- *contextualprocess* see *shellprocess*.
- *fstab* module does not add an encryption keyfile if it does
not exist. (thanks Eugene)
- *initcpiocfg* has some new configuration settings to more carefully
adjust hooks for initcpio.
- *keyboard* module handles Persian (fa) layout better. (thanks Sohrab)
- *keyboard* module handles other non-ascii layout better. (thanks Ivan)
- *partition* module did not filter out invalid fstab entries;
they were not written, either, so no net change.
- *partition* module now has a configurable default check-state
for the encryption checkbox. (thanks Vincent)
- *shellprocess* commands now support globalstorage variables, which
are written as `${gs[key]}`, where `key` is a dotted string that
selects the globalstorage key to use (like in *contextualprocess*
variable-selectors) and `${gs[` and `]}` are literal characters.
# 3.3.6 (2024-04-16)
This release contains contributions from (alphabetically by first name):
- Adriaan de Groot
- Anke Boersma
- Eugene San
- Evan James
- Harald Sitter
- Mike Stemle
- Peter Jung
- Simon Quigley
## Core ##
- Various Qt6-related fixes.
- Calamares now prevents sleep and suspend while the installation is
running, so that unattended installs do not accidentally fall asleep.
## Modules ##
- *bootloader* Adds "splash" to kernel parameters if plymouth is present.
(thanks Eugene)
- *locale* Now picks the correct timezone for Dubai, Muscat, Tehran.
- *plymouthcfg* Use plymouth-set-default-theme to avoid issues with
configuration. (thanks Peter)
- *users* module now supports enrolling in Active Directory, if enabled.
(thanks Simon)
# 3.3.5 (2024-03-03)
This release contains contributions from (alphabetically by first name):
- Adriaan de Groot
- Evan James
- Peter Jung
## Core ##
- Calamares logs more information about how the executable was created
@@ -22,6 +85,7 @@ This release contains contributions from (alphabetically by first name):
## Modules ##
- *displaymanager* module can configure an alternate SDDM configuration file.
- *networkcfg* a bug affecting NetPlan + NetworkManager was fixed.
- *initcpiocfg* Add microcode hook to initcpiocfg
# 3.3.4 (2024-02-27)

View File

@@ -47,7 +47,7 @@
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
set(CALAMARES_VERSION 3.3.5)
set(CALAMARES_VERSION 3.3.7)
set(CALAMARES_RELEASE_MODE ON) # Set to ON during a release
if(CMAKE_SCRIPT_MODE_FILE)

View File

@@ -154,10 +154,15 @@ dependencies for the image (in this example, for openSUSE and Qt6).
- `./ci/deps-opensuse-qt6.sh`
Then run CMake (add any CMake options you like at the end) and ninja.
There is a script `ci/build.sh` that does this, too (without options).
- `cmake -S /src -B /build -G Ninja`
- `ninja -C /build`
There is a script `ci/build.sh` that does the CMake an ninja steps.
- If you set `CMAKE_ARGS` in the environment those extra CMake options are used.
- If you add an argument to the script command which names a workflow
(e.g. "nightly-opensuse-qt6") then `CMAKE_ARGS` are extracted from that
workflow and used for the build.
### Running in Docker
To run Calamares inside the container, or e.g. `loadmodule` to test

View File

@@ -5,6 +5,41 @@
# - BUILDDIR (e.g. /build)
# - CMAKE_ARGS (e.g. "-DWITH_QT6=ON -DCMAKE_BUILD_TYPE=Debug")
#
# If SRCDIR is not set, it is assumed to be the directory above
# wherever this script is being run from (this script is in ci/).
#
# If BUILDDIR is not set, and /build exists (e.g. in the recommended
# Docker setup) then /build is used.
#
# If CMAKE_ARGS is not set, but the script is given an argument
# that exists as a workflow (e.g. "nightly-opensuse-qt6" or
# "nightly-debian.yml") and yq is installed, then the CMAKE_ARGS
# are extracted from that workflow file.
#
# Summary, pick one:
# - set environment variables, run "build.sh"
# - set no variables, run "build.sh <workflow-name>"
if test -z "$SRCDIR" ; then
_d=$(dirname "$0" )
_d=$(dirname "$_d" )
test -f "$_d/CMakeLists.txt" && SRCDIR="$_d"
fi
if test -z "$BUILDDIR" ; then
test -d "/build" && BUILDDIR=/build
fi
if test -z "$CMAKE_ARGS" -a -n "$1" ; then
_d="$SRCDIR/.github/workflows/$1"
test -f "$_d" || _d="$SRCDIR/.github/workflows/$1.yml"
test -f "$_d" || { echo "! No workflow $1" ; exit 1 ; }
if test -x "$(which yq)" ; then
CMAKE_ARGS=$(yq ".env.CMAKE_ARGS" "$_d")
else
CMAKE_ARGS=$(python3 -c 'import yaml ; f=open("'$_d'","r"); print(yaml.safe_load(f)["env"]["CMAKE_ARGS"]);')
fi
fi
# Sanity check
test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }

View File

@@ -9,6 +9,9 @@
# You can pass in directory names, in which case the files
# in that directory (NOT below it) are processed.
#
# If the environment variable CLANG_FORMAT is set to a (full path) and
# that path is executable, it will be used if possible.
#
LANG=C
LC_ALL=C
LC_NUMERIC=C
@@ -20,8 +23,17 @@ test -d "$BASEDIR" || { echo "! Could not determine base for $0" ; exit 1 ; }
test -d "$TOPDIR" || { echo "! Cound not determine top-level source dir" ; exit 1 ; }
test -f "$TOPDIR/.clang-format" || { echo "! No .clang-format support files in $TOPDIR" ; exit 1 ; }
# Allow specifying CF_VERSIONS outside already
CF_VERSIONS="$CF_VERSIONS clang-format15 clang-format-15 clang-format-16 clang-format-16.0.6 clang-format"
# Start with CLANG_FORMAT, if it is specified
CF_VERSIONS=""
if test -n "$CLANG_FORMAT" && test -x "$CLANG_FORMAT" ; then
CF_VERSIONS="$CLANG_FORMAT"
fi
# And a bunch of other potential known versions of clang-format, newest first
CF_VERSIONS="$CF_VERSIONS clang-format-17"
CF_VERSIONS="$CF_VERSIONS clang-format-16 clang-format-16.0.6 "
CF_VERSIONS="$CF_VERSIONS clang-format15 clang-format-15 "
# Generic name of clang-format
CF_VERSIONS="$CF_VERSIONS clang-format"
for _cf in $CF_VERSIONS
do
# Not an error if this particular clang-format isn't found

View File

@@ -4,7 +4,7 @@
#
yum install -y bison flex git make cmake gcc-c++ ninja-build
yum install -y yaml-cpp-devel libpwquality-devel parted-devel python-devel gettext gettext-devel
yum install -y yaml-cpp-devel libpwquality-devel parted-devel python-devel gettext gettext-devel python3-pyyaml
yum install -y libicu-devel libatasmart-devel
yum install -y boost-devel
# Qt6/KF6 dependencies

View File

@@ -4,7 +4,7 @@
#
yum install -y bison flex git make cmake gcc-c++ ninja-build
yum install -y yaml-cpp-devel libpwquality-devel parted-devel python-devel gettext gettext-devel
yum install -y yaml-cpp-devel libpwquality-devel parted-devel python-devel gettext gettext-devel python3-pyyaml
yum install -y libicu-devel libatasmart-devel
# Qt6/KF6 dependencies
yum install -y qt6-qtbase-devel qt6-linguist qt6-qtbase-private-devel qt6-qtdeclarative-devel qt6-qtsvg-devel qt6-qttools-devel

View File

@@ -8,7 +8,7 @@ zypper --non-interactive addrepo -f -G https://download.opensuse.org/repositorie
zypper --non-interactive refresh
zypper --non-interactive up
zypper --non-interactive in git-core jq curl ninja
zypper --non-interactive in git-core jq yq curl ninja
# From deploycala.py
zypper --non-interactive in bison flex git make cmake gcc-c++
zypper --non-interactive in yaml-cpp-devel libpwquality-devel parted-devel python3-devel
@@ -18,5 +18,5 @@ zypper --non-interactive in kf6-extra-cmake-modules
zypper --non-interactive in "qt6-declarative-devel" "cmake(Qt6Concurrent)" "cmake(Qt6Gui)" "cmake(Qt6Network)" "cmake(Qt6Svg)" "cmake(Qt6Linguist)"
zypper --non-interactive in "cmake(KF6CoreAddons)" "cmake(KF6DBusAddons)" "cmake(KF6Crash)"
zypper --non-interactive in "cmake(KF6Parts)" # Also installs KF5 things
zypper --non-interactive in "cmake(PolkitQt6-1)"
zypper --non-interactive in "cmake(PolkitQt6-1)" appstream-qt6-devel
true

View File

@@ -36,3 +36,4 @@ calamares_qrc_translations(calamares-i18n
)
add_library(calamares-i18n OBJECT ${translation_outfile})
set_property(TARGET calamares-i18n PROPERTY POSITION_INDEPENDENT_CODE ON)

View File

@@ -31,7 +31,7 @@
<location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/>
<source>Managing auto-mount settings</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>- ি ...</translation>
</message>
</context>
<context>
@@ -158,13 +158,13 @@
<message>
<location filename="../src/calamares/DebugWindow.ui" line="144"/>
<source>Send Session Log</source>
<translation type="unfinished"/>
<translation> </translation>
</message>
<message>
<location filename="../src/calamares/DebugWindow.cpp" line="164"/>
<source>Debug Information</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>ি </translation>
</message>
</context>
<context>

File diff suppressed because it is too large Load Diff

View File

@@ -1166,7 +1166,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.</tra
<location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="115"/>
<source>Performing contextual processes' job…</source>
<comment>@status</comment>
<translation>Suoritetaan kontekstuaaliset prosessit…</translation>
<translation>Suoritetaan prosessit…</translation>
</message>
</context>
<context>
@@ -3627,7 +3627,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="46"/>
<source>The installer failed to remove a volume group named '%1'.</source>
<translation>Asennusoihjelma ei onnistunut poistamaan taltioryhmää '%1'.</translation>
<translation>Asennusoihjelma ei voinut poistaa taltioryhmää "%1".</translation>
</message>
</context>
<context>
@@ -3665,7 +3665,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="163"/>
<source>The file-system resize job has an invalid configuration and will not run.</source>
<comment>@error</comment>
<translation>Tiedostojärjestelmän koon muutto ei kelpaa eikä sitä suoriteta.</translation>
<translation>Tiedostojärjestelmän koonmuutostyön määritys on virheellinen, eikä sitä suoriteta.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/>
@@ -3677,25 +3677,25 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
<source>Calamares cannot start KPMCore for the file system resize job.</source>
<comment>@error</comment>
<translation>Calamares ei voi käynnistää KPMCorea tiedostojärjestelmän koon muuttamiseksi.</translation>
<translation>Calamares ei voi käynnistää KPMCorea tiedostojärjestelmän koonmuutostyölle.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="179"/>
<source>Resize failed.</source>
<comment>@error</comment>
<translation>Koon muuttaminen epäonnistui.</translation>
<translation>Kokoa ei voitu muuttaa.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="181"/>
<source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
<comment>@info</comment>
<translation>Tiedostojärjestelmää %1 ei löydy tästä järjestelmästä, eikä sen kokoa voi muuttaa.</translation>
<translation>Tiedostojärjestelmää %1 ei löydy, eikä sen kokoa voi muuttaa.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="182"/>
<source>The device %1 could not be found in this system, and cannot be resized.</source>
<comment>@info</comment>
<translation>Laitetta %1 ei löydy tästä järjestelmästä, eikä sen kokoa voi muuttaa.</translation>
<translation>Laitetta %1 ei löydy, eikä sen kokoa voi muuttaa.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="189"/>
@@ -3704,7 +3704,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="231"/>
<source>Resize Failed</source>
<comment>@error</comment>
<translation>Kokomuutos epäonnistui</translation>
<translation>Kokoa ei voitu muuttaa</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="191"/>
@@ -3774,7 +3774,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="28"/>
<source>Resize volume group named %1 from %2 to %3</source>
<comment>@title</comment>
<translation>Muuta tilavuusryhmän %1 kokoa %2:sta %3:ksi</translation>
<translation>Muuta taltioryhmän %1 kokoa %2:sta %3:ksi</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="37"/>
@@ -3791,7 +3791,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="58"/>
<source>The installer failed to resize a volume group named '%1'.</source>
<translation>Asennusohjelma ei onnistunut muuttamaan taltioryhmän "%1" kokoa.</translation>
<translation>Asennusohjelma ei voinut muuttaa taltioryhmän "%1" kokoa.</translation>
</message>
</context>
<context>
@@ -4116,7 +4116,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="38"/>
<source>Running shell processes…</source>
<comment>@status</comment>
<translation>Suoritetaan shell prosesseja…</translation>
<translation>Suoritetaan shell prosessit…</translation>
</message>
</context>
<context>
@@ -4410,12 +4410,12 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/modules/welcome/WelcomePage.ui" line="79"/>
<location filename="../src/modules/welcome/WelcomePage.ui" line="98"/>
<source>Select application and system language</source>
<translation>Valitse sovelluksen ja järjestelmän kieli</translation>
<translation>Valitse sovellusten ja järjestelmän kieli</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="140"/>
<source>Open donations website</source>
<translation>Avaa lahjoitussivusto</translation>
<translation>Avaa lahjoitukset verkkosivu</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="143"/>
@@ -4425,7 +4425,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="153"/>
<source>Open help and support website</source>
<translation>Avaa ohje- ja tukisivusto</translation>
<translation>Avaa ohje- ja tukisivu</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="156"/>
@@ -4435,7 +4435,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="166"/>
<source>Open issues and bug-tracking website</source>
<translation>Avaa ongelmia käsittelevä verkkosivusto</translation>
<translation>Avoimet ongelmat ja virheenseuranta verkkosivu</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="169"/>
@@ -4445,7 +4445,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
<source>Open release notes website</source>
<translation>Avaa julkaisutietojen verkkosivusto</translation>
<translation>Avaa julkaisutiedot verkkosivu</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="182"/>
@@ -4526,7 +4526,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="336"/>
<source>Failed to create dataset</source>
<translation>Tietojoukon luominen epäonnistui</translation>
<translation>Epäonnistui dataset luominen</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="337"/>
@@ -4556,7 +4556,7 @@ Asennus voi jatkua, mutta jotkin toiminnot saattavat olla pois käytöstä.&lt;/
<location filename="../src/calamares/CalamaresWindow.cpp" line="159"/>
<source>Show information about Calamares</source>
<comment>@tooltip</comment>
<translation>Näytä tietoa Calamaresista</translation>
<translation>Calamares tietoja</translation>
</message>
<message>
<location filename="../src/calamares/CalamaresWindow.cpp" line="173"/>

View File

@@ -876,7 +876,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="372"/>
<source>Clearing mounts for partitioning operations on %1</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>מתבצעת מחיקה של נקודות עיגון לטובת פעולות חלוקה למחיצות על %1</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="391"/>
@@ -1273,7 +1273,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="181"/>
<source>Create new %1MiB partition on %3 (%2) with entries %4</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>יצירת מחיצת %1MiB על גבי %3 (%2) עם הרשומות %4</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="189"/>
@@ -1708,7 +1708,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="235"/>
<source>Set up &lt;strong&gt;new&lt;/strong&gt; %2 partition with mount point &lt;strong&gt;%1&lt;/strong&gt;%3</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>הגדרת מחיצת %2 &lt;strong&gt;חדשה&lt;/strong&gt; עם נקודת העיגון &lt;strong&gt;%1&lt;/strong&gt; %3</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="250"/>
@@ -1726,13 +1726,13 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="270"/>
<source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt; and features &lt;em&gt;%4&lt;/em&gt;</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>הקמת מחיצת %3 בשם &lt;strong&gt;%1&lt;/strong&gt; עם נקודת העגינה &lt;strong&gt;%2&lt;/strong&gt; והיכולות &lt;em&gt;%4&lt;/em&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="280"/>
<source>Set up %3 partition &lt;strong&gt;%1&lt;/strong&gt; with mount point &lt;strong&gt;%2&lt;/strong&gt;%4…</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>הקמת מחיצת %3 בשם &lt;strong&gt;%1&lt;/strong&gt; עם נקודת העגינה &lt;strong&gt;%2&lt;/strong&gt;%4…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="296"/>
@@ -1815,13 +1815,13 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="39"/>
<source>Format partition %1 (file system: %2, size: %3 MiB) on %4</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>לאתחל את המחיצה %1 (מערכת קבצים: %2, גודל: %3 MiB) על גבי %4</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="49"/>
<source>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>אתחול מחיצה בגודל &lt;strong&gt;%3MiB&lt;/strong&gt; בנתיב &lt;strong&gt;%1&lt;/strong&gt; עם מערכת הקבצים &lt;strong&gt;%2&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="62"/>
@@ -1833,7 +1833,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="64"/>
<source>Formatting partition %1 with file system %2…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>המחיצה %1 מפורמטת עם מערכת הקבצים %2…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="73"/>
@@ -3259,13 +3259,13 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="178"/>
<source>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system on disk &lt;strong&gt;%2&lt;/strong&gt; (%3)</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>להתקין את %1 &lt;strong&gt;לצד&lt;/strong&gt; מערכת הפעלה אחרת בכונן &lt;strong&gt;%2&lt;/strong&gt; (%3)</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="187"/>
<source>&lt;strong&gt;Erase&lt;/strong&gt; disk &lt;strong&gt;%2&lt;/strong&gt; (%3) and install %1</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>&lt;strong&gt;למחוק&lt;/strong&gt; את הכונן &lt;strong&gt;%2&lt;/strong&gt; (%3) ולהתקין %1</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="194"/>
@@ -3753,13 +3753,13 @@ Output:
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="45"/>
<source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>שינוי גודל של מחיצה בגודל &lt;strong&gt;%2MiB&lt;/strong&gt; בנתיב &lt;strong&gt;%1&lt;/strong&gt; לכדי &lt;strong&gt;%3MiB&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="54"/>
<source>Resizing %2MiB partition %1 to %3MiB…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>משתנה הגודל של מחיצה %1 בגודל %2MiB לכדי %3MiB…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="70"/>
@@ -3782,7 +3782,7 @@ Output:
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="28"/>
<source>Resize volume group named %1 from %2 to %3</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>שינוי גודל קבוצת כרכים בשם %1 מ־%2 ל־%3</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="37"/>
@@ -3913,7 +3913,7 @@ Output:
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="50"/>
<source>Set flags on %1MiB %2 partition</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>הגדרת דגלונים על מחיצה מסוג %2 בגודל %1MiB</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="54"/>
@@ -3931,7 +3931,7 @@ Output:
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="71"/>
<source>Clear flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>להסיר דגלונים ממחיצת &lt;strong&gt;%2&lt;/strong&gt; בגודל %1MiB</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
@@ -3949,49 +3949,49 @@ Output:
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="88"/>
<source>Set flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition to &lt;strong&gt;%3&lt;/strong&gt;</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>הגדרת דגלונים על מחיצת &lt;strong&gt;%2&lt;/strong&gt; בגודל %1MiB לכדי &lt;strong&gt;%3&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="94"/>
<source>Set flags on new partition to &lt;strong&gt;%1&lt;/strong&gt;</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>הגדרת הדגלונים &lt;strong&gt;%1&lt;/strong&gt; על המחיצה החדשה</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="105"/>
<source>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>הדגלונים נמחקים מהמחיצה &lt;strong&gt;%1&lt;/strong&gt;…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="112"/>
<source>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>דגלונים מוסרים ממחיצת &lt;strong&gt;%2&lt;/strong&gt; בגודל %1MiB…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="117"/>
<source>Clearing flags on new partition…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>הדגלונים נמחקים מהמחיצה החדשה…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="122"/>
<source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>הדגלונים &lt;strong&gt;%2&lt;/strong&gt; מוגדרים על המחיצה &lt;strong&gt;%1&lt;/strong&gt;…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="130"/>
<source>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>הדגלונים &lt;strong&gt;%3&lt;/strong&gt; על מחיצת &lt;strong&gt;%2&lt;/strong&gt; בגודל %1MiB…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="136"/>
<source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>הדגלונים &lt;strong&gt;%1&lt;/strong&gt; מוגדרים על המחיצה החדשה…</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="149"/>

View File

@@ -39,7 +39,7 @@
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="60"/>
<source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
<translation>Le &lt;strong&gt;ambiente de initio&lt;/strong&gt; de iste systema.&lt;br&gt;&lt;br&gt;Systemas x86 plus vetere supporta solmente &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Systemas moderne usualmente usa &lt;strong&gt;EFI&lt;/strong&gt;, ma pote etiam apparer como BIOS si il initia in modo de compatibilitate.</translation>
<translation>Le &lt;strong&gt;ambiente de initio&lt;/strong&gt; de iste systema.&lt;br&gt;&lt;br&gt;Systemas x86 plus vetere supporta solmente &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Systemas moderne usualmente usa &lt;strong&gt;EFI&lt;/strong&gt;, ma pote anque apparer como BIOS si il initia in modo de compatibilitate.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="70"/>
@@ -49,7 +49,7 @@
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="82"/>
<source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
<translation>Iste systema esseva initiate con un ambiente de initio &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;Pro configurar le initio ab un ambiente BIOS, iste installator debe installar un cargator de initio, como &lt;strong&gt;GRUB&lt;/strong&gt;, o al comenciamento de un partition o sur le &lt;strong&gt;registro de initio principal&lt;/strong&gt; presso le comenciamento del tabula de partitiones (preferite). Isto es automatic, a minus que tu selige partitionamento manual, in le qual caso tu debe configurar lo tu mesme.</translation>
<translation>Iste systema era initiate con un ambiente de initio &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;Pro configurar le initio ab un ambiente BIOS, iste installator debe installar un cargator de initio, como &lt;strong&gt;GRUB&lt;/strong&gt;, o al comenciamento de un partition o sur le &lt;strong&gt;registro de initio principal&lt;/strong&gt; presso le comenciamento del tabula de partitiones (preferite). Isto es automatic, a minus que tu selige partitionamento manual, in le qual caso tu debe configurar lo tu mesme.</translation>
</message>
</context>
<context>
@@ -118,7 +118,7 @@
<location filename="../src/calamares/DebugWindow.ui" line="68"/>
<location filename="../src/calamares/DebugWindow.ui" line="82"/>
<source>none</source>
<translation>nulle</translation>
<translation>necuno</translation>
</message>
<message>
<location filename="../src/calamares/DebugWindow.ui" line="75"/>
@@ -193,7 +193,7 @@
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="29"/>
<source>Job failed (%1)</source>
<translation>Carga fallite (%1)</translation>
<translation>Labor fallite (%1)</translation>
</message>
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="30"/>
@@ -214,7 +214,7 @@
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="17"/>
<source>Example job (%1)</source>
<translation>Carga de exemplo (%1)</translation>
<translation>Labor de exemplo (%1)</translation>
</message>
</context>
<context>
@@ -495,7 +495,7 @@ Link copied to clipboard</source>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="344"/>
<source>&amp;Install Now</source>
<comment>@button</comment>
<translation>&amp;Installar nunc</translation>
<translation>&amp;Installar ora</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="351"/>
@@ -580,14 +580,14 @@ Link copied to clipboard</source>
<source>Do you really want to cancel the current setup process?
The setup program will quit and all changes will be lost.</source>
<translation>Vole tu vermente cancellar le processo de configuration actual?
Le programma de configuration claudera e tote le cambios essera perdite.</translation>
Le programma de configuration claudera e tote le cambiamentos sera perdite.</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="519"/>
<source>Do you really want to cancel the current install process?
The installer will quit and all changes will be lost.</source>
<translation>Vole tu vermente cancellar le processo de installation actual?
Le installator claudera e tote le cambios essera perdite.</translation>
Le installator claudera e tote le cambiamentos sera perdite.</translation>
</message>
</context>
<context>
@@ -795,7 +795,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1628"/>
<source>No swap</source>
<comment>@label</comment>
<translation>Nulle intercambio</translation>
<translation>Necun intercambio</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1637"/>
@@ -807,7 +807,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1640"/>
<source>Swap (no Hibernate)</source>
<comment>@label</comment>
<translation>Intercambio (nulle hibernation)</translation>
<translation>Intercambio (necun hibernation)</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1643"/>
@@ -978,13 +978,13 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/locale/Config.cpp" line="410"/>
<source>The system language will be set to %1.</source>
<comment>@info</comment>
<translation>Le lingua del systema essera definite a %1.</translation>
<translation>Le lingua del systema sera definite a %1.</translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="416"/>
<source>The numbers and dates locale will be set to %1.</source>
<comment>@info</comment>
<translation>Le numeros e datas regional essera definite a %1.</translation>
<translation>Le numeros e datas regional sera definite a %1.</translation>
</message>
<message>
<location filename="../src/modules/netinstall/Config.cpp" line="53"/>
@@ -1039,7 +1039,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/packagechooser/Config.cpp" line="247"/>
<source>None</source>
<translation>Nulle</translation>
<translation>Necuno</translation>
</message>
<message>
<location filename="../src/modules/summary/Config.cpp" line="35"/>
@@ -1080,7 +1080,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/users/Config.cpp" line="300"/>
<source>Your hostname is too short.</source>
<translation>Tu nomine de hospite es troppo breve.</translation>
<translation>Tu nomine de hospite es troppo curte.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="304"/>
@@ -1130,7 +1130,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="80"/>
<source>This program will ask you some questions and set up %2 on your computer.</source>
<translation>Iste programma te demandara alicun questiones e configurara %2 sur tu computator.</translation>
<translation>Iste programma te demandara alcun questiones e configurara %2 sur tu computator.</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="264"/>
@@ -1477,7 +1477,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="78"/>
<source>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</source>
<translation>&lt;br&gt;&lt;br&gt;Iste typo de tabula de partitiones es solmente consiliabile pro systemas plus vetere que initia ab un ambiente de initio &lt;strong&gt;BIOS&lt;/strong&gt;. GPT es recommendate in le major parte de altere casos.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Advertimento:&lt;/strong&gt; le tabula de partitiones MBR es un standard obsolete del era MS-DOS. &lt;br&gt;Solmente 4 partitiones &lt;em&gt;primari&lt;/em&gt; pote esser create, e de cellos 4, un pote esser un partition &lt;em&gt;extendite&lt;/em&gt;, que a su vice pote continer multe partitiones &lt;em&gt;logic&lt;/em&gt;.</translation>
<translation>&lt;br&gt;&lt;br&gt;Iste typo de tabula de partitiones es solmente consiliabile pro systemas plus vetere que initia ab un ambiente de initio &lt;strong&gt;BIOS&lt;/strong&gt;. GPT es recommendate in le major parte de altere casos.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Aviso:&lt;/strong&gt; le tabula de partitiones MBR es un standard obsolete del era MS-DOS. &lt;br&gt;Solmente 4 partitiones &lt;em&gt;primari&lt;/em&gt; pote esser create, e de issos 4, un pote esser un partition &lt;em&gt;extendite&lt;/em&gt;, que a su vice pote continer multe partitiones &lt;em&gt;logic&lt;/em&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="89"/>
@@ -1538,7 +1538,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="138"/>
<source>Failed to open %1</source>
<comment>@error</comment>
<translation type="unfinished"/>
<translation>Impossibile aperir %1</translation>
</message>
</context>
<context>
@@ -1575,7 +1575,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="93"/>
<source>Warning: Formatting the partition will erase all existing data.</source>
<translation>Advertimento: Formatar le partition radera tote le datos existente.</translation>
<translation>Aviso: Formatar le partition radera tote le datos existente.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="103"/>
@@ -1746,13 +1746,13 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/finished/FinishedPage.ui" line="102"/>
<source>&amp;Restart now</source>
<translation>&amp;Reinitiar nunc</translation>
<translation>&amp;Reinitiar ora</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="75"/>
<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>
<comment>@info</comment>
<translation>&lt;h1&gt;Tote facite.&lt;/h1&gt;&lt;br/&gt;%1 ha essite configurate in tu computator.&lt;br/&gt;Tu pote nunc initiar usante tu nove systema.</translation>
<translation>&lt;h1&gt;Tote facite.&lt;/h1&gt;&lt;br/&gt;%1 ha essite configurate in tu computator.&lt;br/&gt;Tu pote ora initiar usante tu nove systema.</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="79"/>
@@ -1764,7 +1764,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/finished/FinishedPage.cpp" line="87"/>
<source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been installed on your computer.&lt;br/&gt;You may now restart into your new system, or continue using the %2 Live environment.</source>
<comment>@info</comment>
<translation>&lt;h1&gt;Tote facite.&lt;/h1&gt;&lt;br/&gt;%1 ha essite installate in tu computator.&lt;br/&gt;Tu pote nunc reinitiar in tu nove systema, o continuar usante le ambiente in vivo de %2.</translation>
<translation>&lt;h1&gt;Tote facite.&lt;/h1&gt;&lt;br/&gt;%1 ha essite installate in tu computator.&lt;br/&gt;Tu pote ora reinitiar in tu nove systema, o continuar usante le ambiente in vivo de %2.</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="92"/>
@@ -2077,7 +2077,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="30"/>
<source>The system locale setting affects the language and character set for some command line user interface elements.&lt;br/&gt;The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation>Le parametros regional del systema affecta le lingua e le collection de characteres pro alicun elementos del interfacie de usator del linea de commando.&lt;br/&gt;Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
<translation>Le parametros regional del systema affecta le lingua e le collection de characteres pro alcun elementos del interfacie de usator del linea de commando.&lt;br/&gt;Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="54"/>
@@ -2107,7 +2107,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="95"/>
<source>No rootMountPoint is set.</source>
<translation>Nulle puncto de montage es definite.</translation>
<translation>Necun puncto de montage es definite.</translation>
</message>
<message>
<location filename="../src/modules/luksopenswaphookcfg/LOSHJob.cpp" line="100"/>
@@ -2298,7 +2298,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="254"/>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="262"/>
<source>No partitions are defined.</source>
<translation>Nulle partitiones es definite.</translation>
<translation>Necun partitiones es definite.</translation>
</message>
<message>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="297"/>
@@ -2309,7 +2309,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="298"/>
<source>Root partition %1 is LUKS but no passphrase has been set.</source>
<translation>Le partition radice %1 es LUKS ma nulle phrase de contrasigno esseva definite.</translation>
<translation>Le partition radice %1 es LUKS ma necun phrase de contrasigno era definite.</translation>
</message>
<message>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="305"/>
@@ -2423,7 +2423,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="56"/>
<source>Kernel</source>
<comment>label for netinstall module, Linux kernel</comment>
<translation type="unfinished"/>
<translation>Nucleo</translation>
</message>
<message>
<location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="57"/>
@@ -3135,7 +3135,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="55"/>
<source>&amp;Revert All Changes</source>
<translation>&amp;Reverter tote le cambiamentos</translation>
<translation>&amp;Reverter tote le modificationes</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionPage.ui" line="91"/>
@@ -3195,7 +3195,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="260"/>
<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>Le tabula de partitiones sur %1 jam ha %2 partitiones primari, e non pote esser addite alteres. Remove un partition primari e adde un partition extendite, in vice.</translation>
<translation>Le tabula de partitiones sur %1 ja ha %2 partitiones primari, e non pote esser addite alteres. Remove un partition primari e adde un partition extendite, in vice.</translation>
</message>
</context>
<context>
@@ -3279,7 +3279,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="263"/>
<source>No partitions will be changed.</source>
<translation>Nulle partitiones essera cambiate.</translation>
<translation>Necun partitiones sera modificate.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="303"/>
@@ -3372,7 +3372,7 @@ Le installator claudera e tote le cambios essera perdite.</translation>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="658"/>
<source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
<translation>Un partition de initio separate esseva configurate insimul con un partition de radice cryptate, ma le partition de initio non es cryptate.&lt;br/&gt;&lt;br/&gt;Il ha problemas de securitate con iste typo de configuration, perque le files importante del systema es mantenite sur un partition non cryptate.&lt;br/&gt;Tu pote continuar si tu vole, ma le disblocar del systema de files occurrera plus tarde durante le initio del systema.&lt;br/&gt;Pro cryptar le partition de initio, retorna e recrea lo, seligente &lt;strong&gt;Cryptar&lt;/strong&gt; in le fenestra de creation de partitiones.</translation>
<translation>Un partition de initio separate era configurate insimul con un partition de radice cryptate, ma le partition de initio non es cryptate.&lt;br/&gt;&lt;br/&gt;Il ha problemas de securitate con iste typo de configuration, perque le files importante del systema es mantenite sur un partition non cryptate.&lt;br/&gt;Tu pote continuar si tu vole, ma le disblocar del systema de files occurrera plus tarde durante le initio del systema.&lt;br/&gt;Pro cryptar le partition de initio, retorna e recrea lo, seligente &lt;strong&gt;Cryptar&lt;/strong&gt; in le fenestra de creation de partitiones.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="750"/>
@@ -3567,7 +3567,7 @@ Output:
<message>
<location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="44"/>
<source>(no mount point)</source>
<translation>(nulle puncto de montage)</translation>
<translation>(necun puncto de montage)</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="39"/>
@@ -3661,7 +3661,7 @@ Output:
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
<source>Calamares cannot start KPMCore for the file system resize job.</source>
<comment>@error</comment>
<translation>Calamares non pote initiar KPMCore pro le carga de redimensionamento del systema de files.</translation>
<translation>Calamares non pote initiar KPMCore pro le labor de redimensionamento del systema de files.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="179"/>
@@ -3844,37 +3844,37 @@ Output:
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/>
<source>Failed to write keyboard configuration for the virtual console.</source>
<comment>@error</comment>
<translation type="unfinished"/>
<translation>Impossibile scriber le configuration del claviero pro le consola virtual.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="369"/>
<source>Failed to write to %1</source>
<comment>@error, %1 is virtual console configuration path</comment>
<translation type="unfinished"/>
<translation>Impossibile scriber a %1</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="394"/>
<source>Failed to write keyboard configuration for X11.</source>
<comment>@error</comment>
<translation type="unfinished"/>
<translation>Impossibile scriber le configuration del claviero pro X11.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="395"/>
<source>Failed to write to %1</source>
<comment>@error, %1 is keyboard configuration path</comment>
<translation type="unfinished"/>
<translation>Impossibile scriber a %1</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="411"/>
<source>Failed to write keyboard configuration to existing /etc/default directory.</source>
<comment>@error</comment>
<translation>Non poteva scriber le configuration del claviero al directorio /etc/default existente.</translation>
<translation>Impossibile scriber le configuration del claviero al directorio /etc/default existente.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="412"/>
<source>Failed to write to %1</source>
<comment>@error, %1 is default keyboard path</comment>
<translation type="unfinished"/>
<translation>Impossibile scriber a %1</translation>
</message>
</context>
<context>
@@ -4288,7 +4288,7 @@ Output:
<message>
<location filename="../src/modules/umount/UmountJob.cpp" line="131"/>
<source>No rootMountPoint is set.</source>
<translation>Nulle puncto de montage es definite.</translation>
<translation>Necun puncto de montage es definite.</translation>
</message>
</context>
<context>
@@ -4484,7 +4484,7 @@ Output:
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="162"/>
<source>Failed to create zpool on </source>
<translation type="unfinished"/>
<translation>Impossibile crear “zpool” sur</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="180"/>
@@ -4494,7 +4494,7 @@ Output:
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="181"/>
<source>No partitions are available for ZFS.</source>
<translation>Nulle partitiones es disponibile pro ZFS.</translation>
<translation>Necun partitiones es disponibile pro ZFS.</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="192"/>
@@ -4505,12 +4505,12 @@ Output:
<location filename="../src/modules/zfs/ZfsJob.cpp" line="192"/>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="264"/>
<source>Failed to create zpool</source>
<translation type="unfinished"/>
<translation>Impossibile crear “zpool”</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="336"/>
<source>Failed to create dataset</source>
<translation type="unfinished"/>
<translation>Impossibile crear “dataset”</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="337"/>
@@ -4567,7 +4567,7 @@ Output:
<source>%1 has been installed on your computer.&lt;br/&gt;
You may now restart into your new system, or continue using the Live environment.</source>
<translation>%1 ha essite installate in tu computator.&lt;br/&gt;
Tu pote nunc reinitiar in tu nove systema, o continuar usante le ambiente in vivo.</translation>
Tu pote ora reinitiar in tu nove systema, o continuar usante le ambiente in vivo.</translation>
</message>
<message>
<location filename="../src/modules/finishedq/finishedq.qml" line="65"/>
@@ -4600,7 +4600,7 @@ Output:
You may now restart into your new system, or continue using the Live environment.</source>
<comment>@info, %1 is the product name</comment>
<translation>%1 ha essite installate in tu computator.&lt;br/&gt;
Tu pote nunc reinitiar in tu nove systema, o continuar usante le ambiente in vivo.</translation>
Tu pote ora reinitiar in tu nove systema, o continuar usante le ambiente in vivo.</translation>
</message>
<message>
<location filename="../src/modules/finishedq/finishedq-qt6.qml" line="65"/>
@@ -4636,7 +4636,7 @@ Output:
You may now restart your device.</source>
<comment>@info, %1 is the product name</comment>
<translation>%1 ha essite installate in tu computator.&lt;br/&gt;
Tu pote nunc reinitiar tu dispositivo.</translation>
Tu pote ora reinitiar tu dispositivo.</translation>
</message>
<message>
<location filename="../src/modules/finishedq/finishedq@mobile.qml" line="66"/>
@@ -4732,7 +4732,7 @@ Output:
The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation>&lt;h3&gt;Linguas&lt;/h3&gt; &lt;/br&gt;
Le parametro regional del systema affecta le lingua e le collection de characteres pro alicun elementos del interfacie de usator del linea de commando. Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
Le parametro regional del systema affecta le lingua e le collection de characteres pro alcun elementos del interfacie de usator del linea de commando. Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/localeq/localeq.qml" line="213"/>
@@ -4757,7 +4757,7 @@ Output:
The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation>&lt;h3&gt;Linguas&lt;/h3&gt; &lt;/br&gt;
Le parametro regional del systema affecta le lingua e le collection de characteres pro alicun elementos del interfacie de usator del linea de commando. Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
Le parametro regional del systema affecta le lingua e le collection de characteres pro alcun elementos del interfacie de usator del linea de commando. Le parametro actual es &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/localeq/localeq-qt6.qml" line="213"/>
@@ -5160,7 +5160,7 @@ Output:
<source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
&lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
<translation>&lt;h3&gt;Benvenite al installator de &lt;quote&gt;%2&lt;/quote&gt; pro %1&lt;/h3&gt;
&lt;p&gt;Iste programma te demandara alicun questiones e configurara %1 sur tu computator.&lt;/p&gt;</translation>
&lt;p&gt;Iste programma te demandara alcun questiones e configurara %1 sur tu computator.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="69"/>
@@ -5190,7 +5190,7 @@ Output:
<source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
&lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
<translation>&lt;h3&gt;Benvenite al installator de &lt;quote&gt;%2&lt;/quote&gt; pro %1&lt;/h3&gt;
&lt;p&gt;Iste programma te demandara alicun questiones e configurara %1 sur tu computator.&lt;/p&gt;</translation>
&lt;p&gt;Iste programma te demandara alcun questiones e configurara %1 sur tu computator.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq-qt6.qml" line="69"/>

View File

@@ -963,19 +963,19 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/keyboard/Config.cpp" line="505"/>
<source>Keyboard model has been set to %1&lt;br/&gt;.</source>
<comment>@label, %1 is keyboard model, as in Apple Magic Keyboard</comment>
<translation> %1&lt;br/&gt; </translation>
<translation> %1 &lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/keyboard/Config.cpp" line="512"/>
<source>Keyboard layout has been set to %1/%2.</source>
<comment>@label, %1 is layout, %2 is layout variant</comment>
<translation> %1/%2 </translation>
<translation> %1/%2 </translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="373"/>
<source>Set timezone to %1/%2</source>
<comment>@action</comment>
<translation> %1/%2 </translation>
<translation> %1/%2 </translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="410"/>
@@ -3014,7 +3014,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="472"/>
<source>Use the same password for the administrator account.</source>
<translation>管理者アカウント同じパスワードを使用する。</translation>
<translation>管理者アカウントにも同じパスワードを使用する。</translation>
</message>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="495"/>
@@ -5014,7 +5014,7 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="305"/>
<source>Use the same password for the administrator account.</source>
<translation>使</translation>
<translation>使</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="318"/>
@@ -5147,7 +5147,7 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq-qt6.qml" line="304"/>
<source>Use the same password for the administrator account.</source>
<translation>使</translation>
<translation>使</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq-qt6.qml" line="317"/>

File diff suppressed because it is too large Load Diff

View File

@@ -1959,13 +1959,13 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="262"/>
<source>is checked three times.</source>
<translation type="unfinished"/>
<translation>已检测了 3 次。</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="265"/>
<source>The snark has not been checked three times.</source>
<comment>The (some mythological beast) has not been checked three times.</comment>
<translation type="unfinished"/>
<translation>snark 没有检查三次。</translation>
</message>
</context>
<context>
@@ -4065,7 +4065,7 @@ Output:
<location filename="../src/modules/users/MiscJobs.cpp" line="181"/>
<source>Preparing groups…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在准备群组…</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="193"/>
@@ -4085,7 +4085,7 @@ Output:
<location filename="../src/modules/users/MiscJobs.cpp" line="34"/>
<source>Configuring &lt;pre&gt;sudo&lt;/pre&gt; users…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>配置 &lt;pre&gt;sudo&lt;/pre&gt; 用户…</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="70"/>
@@ -4104,7 +4104,7 @@ Output:
<location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="38"/>
<source>Running shell processes…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在运行 shell 进程…</translation>
</message>
</context>
<context>
@@ -4156,7 +4156,7 @@ Output:
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="106"/>
<source>Sending installation feedback…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在发送安装反馈…</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="124"/>
@@ -4180,7 +4180,7 @@ Output:
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="198"/>
<source>Configuring KDE user feedback…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>配置 KDE 用户反馈…</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="220"/>
@@ -4210,7 +4210,7 @@ Output:
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="141"/>
<source>Configuring machine feedback…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在配置机器反馈…</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="164"/>
@@ -4282,7 +4282,7 @@ Output:
<location filename="../src/modules/umount/UmountJob.cpp" line="39"/>
<source>Unmounting file systems…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在卸载文件系统…</translation>
</message>
<message>
<location filename="../src/modules/umount/UmountJob.cpp" line="123"/>
@@ -4444,19 +4444,19 @@ Output:
<location filename="../src/calamares/DebugWindow.cpp" line="235"/>
<source>About %1 Setup</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>关于 %1 安装程序</translation>
</message>
<message>
<location filename="../src/calamares/DebugWindow.cpp" line="236"/>
<source>About %1 Installer</source>
<comment>@title</comment>
<translation type="unfinished"/>
<translation>关于 %1 安装程序</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="212"/>
<source>%1 Support</source>
<comment>@action</comment>
<translation type="unfinished"/>
<translation>%1 的支持信息</translation>
</message>
</context>
<context>
@@ -4483,7 +4483,7 @@ Output:
<location filename="../src/modules/zfs/ZfsJob.cpp" line="102"/>
<source>Creating ZFS pools and datasets…</source>
<comment>@status</comment>
<translation type="unfinished"/>
<translation>正在创建 ZFS 池和数据集…</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="162"/>
@@ -4737,14 +4737,16 @@ Output:
<source>&lt;h3&gt;Languages&lt;/h3&gt; &lt;/br&gt;
The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>&lt;h3&gt;语言&lt;/h3&gt;&lt;/br&gt;
系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 &lt;strong&gt;%1&lt;/strong&gt;。</translation>
</message>
<message>
<location filename="../src/modules/localeq/localeq.qml" line="213"/>
<source>&lt;h3&gt;Locales&lt;/h3&gt; &lt;/br&gt;
The system locale setting affects the numbers and dates format. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>&lt;h3&gt;区域&lt;/h3&gt;&lt;/br&gt;
系统区域设置会影响数字和日期格式。 当前设置是 &lt;strong&gt;%1&lt;/strong&gt;。</translation>
</message>
</context>
<context>
@@ -4761,14 +4763,16 @@ Output:
<source>&lt;h3&gt;Languages&lt;/h3&gt; &lt;/br&gt;
The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>&lt;h3&gt;语言&lt;/h3&gt;&lt;/br&gt;
系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 &lt;strong&gt;%1&lt;/strong&gt;。</translation>
</message>
<message>
<location filename="../src/modules/localeq/localeq-qt6.qml" line="213"/>
<source>&lt;h3&gt;Locales&lt;/h3&gt; &lt;/br&gt;
The system locale setting affects the numbers and dates format. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<comment>@info</comment>
<translation type="unfinished"/>
<translation>&lt;h3&gt;区域&lt;/h3&gt;&lt;/br&gt;
系统区域设置会影响数字和日期格式。 当前设置是 &lt;strong&gt;%1&lt;/strong&gt;。</translation>
</message>
</context>
<context>

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-12 21:37+0100\n"
"POT-Creation-Date: 2024-05-01 00:08+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,15 +22,15 @@ msgstr ""
msgid "Install bootloader."
msgstr ""
#: src/modules/bootloader/main.py:666
#: src/modules/bootloader/main.py:671
msgid "Failed to install grub, no partitions defined in global storage"
msgstr ""
#: src/modules/bootloader/main.py:926
#: src/modules/bootloader/main.py:931
msgid "Bootloader installation error"
msgstr ""
#: src/modules/bootloader/main.py:927
#: src/modules/bootloader/main.py:932
msgid ""
"The bootloader could not be installed. The installation command <pre>{!s}</"
"pre> returned error code {!s}."
@@ -68,17 +68,17 @@ msgstr ""
msgid "SLIM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:938
#: src/modules/displaymanager/main.py:940
msgid "No display managers selected for the displaymanager module."
msgstr ""
#: src/modules/displaymanager/main.py:939
#: src/modules/displaymanager/main.py:941
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
#: src/modules/displaymanager/main.py:1026
#: src/modules/displaymanager/main.py:1028
msgid "Display manager configuration was incomplete"
msgstr ""
@@ -108,29 +108,29 @@ msgstr ""
msgid "Writing fstab."
msgstr ""
#: src/modules/fstab/main.py:378 src/modules/fstab/main.py:384
#: src/modules/fstab/main.py:412 src/modules/initcpiocfg/main.py:256
#: src/modules/initcpiocfg/main.py:260 src/modules/initramfscfg/main.py:85
#: src/modules/fstab/main.py:382 src/modules/fstab/main.py:388
#: src/modules/fstab/main.py:416 src/modules/initcpiocfg/main.py:257
#: src/modules/initcpiocfg/main.py:261 src/modules/initramfscfg/main.py:85
#: src/modules/initramfscfg/main.py:89 src/modules/localecfg/main.py:140
#: src/modules/mount/main.py:334 src/modules/networkcfg/main.py:106
#: src/modules/mount/main.py:344 src/modules/networkcfg/main.py:106
#: src/modules/openrcdmcryptcfg/main.py:72
#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/rawfs/main.py:164
msgid "Configuration Error"
msgstr ""
#: src/modules/fstab/main.py:379 src/modules/initramfscfg/main.py:86
#: src/modules/mount/main.py:335 src/modules/openrcdmcryptcfg/main.py:73
#: src/modules/fstab/main.py:383 src/modules/initramfscfg/main.py:86
#: src/modules/mount/main.py:345 src/modules/openrcdmcryptcfg/main.py:73
#: src/modules/rawfs/main.py:165
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/fstab/main.py:385 src/modules/initramfscfg/main.py:90
#: src/modules/fstab/main.py:389 src/modules/initramfscfg/main.py:90
#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:107
#: src/modules/openrcdmcryptcfg/main.py:77
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/fstab/main.py:413
#: src/modules/fstab/main.py:417
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr ""
@@ -146,11 +146,11 @@ msgstr ""
msgid "Configuring mkinitcpio."
msgstr ""
#: src/modules/initcpiocfg/main.py:257
#: src/modules/initcpiocfg/main.py:258
msgid "No partitions are defined for <pre>initcpiocfg</pre>."
msgstr ""
#: src/modules/initcpiocfg/main.py:261
#: src/modules/initcpiocfg/main.py:262
msgid "No root mount point for <pre>initcpiocfg</pre>."
msgstr ""
@@ -178,23 +178,23 @@ msgstr ""
msgid "Mounting partitions."
msgstr ""
#: src/modules/mount/main.py:164 src/modules/mount/main.py:200
#: src/modules/mount/main.py:171 src/modules/mount/main.py:207
msgid "Internal error mounting zfs datasets"
msgstr ""
#: src/modules/mount/main.py:176
#: src/modules/mount/main.py:183
msgid "Failed to import zpool"
msgstr ""
#: src/modules/mount/main.py:192
#: src/modules/mount/main.py:199
msgid "Failed to unlock zpool"
msgstr ""
#: src/modules/mount/main.py:209 src/modules/mount/main.py:214
#: src/modules/mount/main.py:216 src/modules/mount/main.py:221
msgid "Failed to set zfs mountpoint"
msgstr ""
#: src/modules/mount/main.py:370
#: src/modules/mount/main.py:383
msgid "zfs mounting error"
msgstr ""
@@ -230,24 +230,24 @@ msgid_plural "Removing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
#: src/modules/packages/main.py:740 src/modules/packages/main.py:752
#: src/modules/packages/main.py:780
#: src/modules/packages/main.py:769 src/modules/packages/main.py:781
#: src/modules/packages/main.py:809
msgid "Package Manager error"
msgstr ""
#: src/modules/packages/main.py:741
#: src/modules/packages/main.py:770
msgid ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:753
#: src/modules/packages/main.py:782
msgid ""
"The package manager could not update the system. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:781
#: src/modules/packages/main.py:810
msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."

View File

@@ -4,7 +4,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# xxmn77 <xxmn77@gmail.com>, 2023
# Xəyyam Qocayev <xxmn77@gmail.com>, 2023
#
#, fuzzy
msgid ""
@@ -13,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-12 21:37+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: xxmn77 <xxmn77@gmail.com>, 2023\n"
"Last-Translator: Xəyyam Qocayev <xxmn77@gmail.com>, 2023\n"
"Language-Team: Azerbaijani (https://app.transifex.com/calamares/teams/20061/az/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

View File

@@ -4,7 +4,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# xxmn77 <xxmn77@gmail.com>, 2023
# Xəyyam Qocayev <xxmn77@gmail.com>, 2023
#
#, fuzzy
msgid ""
@@ -13,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-12 21:37+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: xxmn77 <xxmn77@gmail.com>, 2023\n"
"Last-Translator: Xəyyam Qocayev <xxmn77@gmail.com>, 2023\n"
"Language-Team: Azerbaijani (Azerbaijan) (https://app.transifex.com/calamares/teams/20061/az_AZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

View File

@@ -6,7 +6,7 @@
# Translators:
# strel, 2017
# Guido Grasso <cuquiman97@gmail.com>, 2018
# Adolfo Jayme-Barrientos, 2019
# Adolfo Jayme Barrientos, 2019
# Miguel Mayol <mitcoes@gmail.com>, 2020
# Pier Jose Gotta Perez <piegope@protonmail.com>, 2020
# Casper, 2023

View File

@@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: he\n"
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n"
#: src/modules/bootloader/main.py:46
msgid "Install bootloader."

View File

@@ -28,7 +28,7 @@ msgstr "Installar cargator de initio."
#: src/modules/bootloader/main.py:666
msgid "Failed to install grub, no partitions defined in global storage"
msgstr ""
"Non poteva installar le “grub”, nulle partitiones definite in le "
"Impossibile installar le “grub”, necun partitiones definite in le "
"immagazinage global."
#: src/modules/bootloader/main.py:926
@@ -65,7 +65,7 @@ msgstr "Non pote configurar LightDM"
#: src/modules/displaymanager/main.py:685
msgid "No LightDM greeter installed."
msgstr "Nulle systema de benvenita de LightDM installate."
msgstr "Necun systema de benvenita de LightDM installate."
#: src/modules/displaymanager/main.py:716
msgid "Cannot write SLIM configuration file"
@@ -78,7 +78,7 @@ msgstr "Le file de configuration de SLIM {!s} non existe"
#: src/modules/displaymanager/main.py:938
msgid "No display managers selected for the displaymanager module."
msgstr ""
"Nulle gestor de visualisation seligite pro le modulo de «displaymanager»."
"Necun gestor de visualisation seligite pro le modulo de «displaymanager»."
#: src/modules/displaymanager/main.py:939
msgid ""
@@ -98,7 +98,7 @@ msgstr "Creation de initramfs con dracut."
#: src/modules/dracut/main.py:63
msgid "Failed to run dracut"
msgstr "Non poteva executar dracut"
msgstr "Impossibile executar dracut"
#: src/modules/dracut/main.py:64
#, python-brace-format
@@ -109,7 +109,7 @@ msgstr ""
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr "Carga ficticie de python."
msgstr "Labor ficticie de python."
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:104
#: src/modules/dummypython/main.py:105
@@ -134,20 +134,20 @@ msgstr "Error de configuration"
#: src/modules/mount/main.py:335 src/modules/openrcdmcryptcfg/main.py:73
#: src/modules/rawfs/main.py:165
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr "Nulle partitiones es definite pro esser usate per <pre>{!s}</pre>."
msgstr "Necun partitiones es definite pro esser usate per <pre>{!s}</pre>."
#: src/modules/fstab/main.py:385 src/modules/initramfscfg/main.py:90
#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:107
#: src/modules/openrcdmcryptcfg/main.py:77
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr ""
"Nulle puncto de montage de radice es date pro esser usate per "
"Necun puncto de montage de radice es date pro esser usate per "
"<pre>{!s}</pre>."
#: src/modules/fstab/main.py:413
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr ""
"Nulle configuration <pre>{!s}</pre> es date pro esser usate per "
"Necun configuration <pre>{!s}</pre> es date pro esser usate per "
"<pre>{!s}</pre>."
#: src/modules/grubcfg/main.py:30
@@ -164,11 +164,11 @@ msgstr " Configurante “mkinitcpio”."
#: src/modules/initcpiocfg/main.py:257
msgid "No partitions are defined for <pre>initcpiocfg</pre>."
msgstr "Nulle partitiones es definite pro <pre>initcpiocfg</pre>."
msgstr "Necun partitiones es definite pro <pre>initcpiocfg</pre>."
#: src/modules/initcpiocfg/main.py:261
msgid "No root mount point for <pre>initcpiocfg</pre>."
msgstr "Nulle partitiones es definite pro <pre>initcpiocfg</pre>."
msgstr "Necun partitiones es definite pro <pre>initcpiocfg</pre>."
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
@@ -184,7 +184,7 @@ msgstr "Creante “initramfs” con “mkinitfs”."
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr "Non poteva executar “mkinitfs” sur le scopo"
msgstr "Impossibile executar “mkinitfs” sur le scopo"
#: src/modules/mkinitfs/main.py:50
msgid "The exit code was {}"
@@ -200,15 +200,15 @@ msgstr "Error interne durante le montage de collection de datos de zfs"
#: src/modules/mount/main.py:176
msgid "Failed to import zpool"
msgstr "Non poteva importar “zpool”"
msgstr "Impossibile importar “zpool”"
#: src/modules/mount/main.py:192
msgid "Failed to unlock zpool"
msgstr "Non poteva disblocar “zpool”"
msgstr "Impossibile disblocar “zpool”"
#: src/modules/mount/main.py:209 src/modules/mount/main.py:214
msgid "Failed to set zfs mountpoint"
msgstr "Non poteva definir le puncto de montage de zfs"
msgstr "Impossibile definir le puncto de montage de zfs"
#: src/modules/mount/main.py:370
msgid "zfs mounting error"
@@ -272,7 +272,7 @@ msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
msgstr ""
"Le gestor de pacchettos non poteva facer le cambiamentos al systema "
"Le gestor de pacchettos non poteva facer le modificationes al systema "
"installate. Le commando <pre>{!s}</pre> retornava le codice de error {!s}."
#: src/modules/plymouthcfg/main.py:27
@@ -378,11 +378,11 @@ msgstr "Initiante a dispacchettar {}"
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
msgid "Failed to unpack image \"{}\""
msgstr "Non poteva dispacchettar le imagina “{}”"
msgstr "Impossibile dispacchettar le imagina “{}”"
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr "Nulle puncto de montage pro le partition radice"
msgstr "Necun puncto de montage pro le partition radice"
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key."
@@ -409,7 +409,7 @@ msgstr "Il non ha information de configuration."
#: src/modules/unpackfs/main.py:456
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr ""
"Le systema de files para “{}” ({}) non es supportate per tu kernel actual"
"Le systema de files para “{}” ({}) non es supportate per tu nucleo actual"
#: src/modules/unpackfs/main.py:460
msgid "The source filesystem \"{}\" does not exist"
@@ -420,7 +420,7 @@ msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed."
msgstr ""
"Non poteva trovar “unsquashfs”, assecura te que tu ha le pacchetto "
"Impossibile trovar “unsquashfs”, assecura te que tu ha le pacchetto "
"“squashfs-tools” installate."
#: src/modules/unpackfs/main.py:481

View File

@@ -5,7 +5,7 @@
#
# Translators:
# André Marcelo Alvarenga <alvarenga@kde.org>, 2020
# Guilherme MS, 2023
# Guilherme, 2023
#
#, fuzzy
msgid ""
@@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-12 21:37+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: Guilherme MS, 2023\n"
"Last-Translator: Guilherme, 2023\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/calamares/teams/20061/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

View File

@@ -4,7 +4,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Besnik Bleta <besnik@programeshqip.org>, 2023
# Besnik Bleta <besnik@programeshqip.org>, 2024
#
#, fuzzy
msgid ""
@@ -13,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-12 21:37+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>, 2023\n"
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>, 2024\n"
"Language-Team: Albanian (https://app.transifex.com/calamares/teams/20061/sq/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -371,7 +371,7 @@ msgstr "Po fillohet të shpaketohet {}"
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
msgid "Failed to unpack image \"{}\""
msgstr "Dështoi shpaketimi i figurës \"{}\""
msgstr "Dështoi shpaketimi i figurës “{}”"
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
@@ -406,7 +406,7 @@ msgstr ""
#: src/modules/unpackfs/main.py:460
msgid "The source filesystem \"{}\" does not exist"
msgstr "Sistemi i kartelave \"{}\" ({}) sekziston"
msgstr "Sistemi i kartelave “{}” ({}) sekziston"
#: src/modules/unpackfs/main.py:466
msgid ""
@@ -418,7 +418,7 @@ msgstr ""
#: src/modules/unpackfs/main.py:481
msgid "The destination \"{}\" in the target system is not a directory"
msgstr "Destinacioni \"{}\" te sistemi i synuar sështë drejtori"
msgstr "Vendmbërritja “{}” te sistemi i synuar sështë drejtori"
#: src/modules/zfshostid/main.py:27
msgid "Copying zfs generated hostid."

View File

@@ -42,7 +42,7 @@
static void
crash()
{
kill(getpid(), SIGTRAP);
kill( getpid(), SIGTRAP );
}
/// @brief Print out the widget tree (names) in indented form.

View File

@@ -52,6 +52,7 @@
#include <QLabel>
#include <QMainWindow>
#include <QThread>
#include <QTimer>
#include <memory>
@@ -455,11 +456,11 @@ libcalamares.utils.debug('pre-script for testing purposes injected')
int
main( int argc, char* argv[] )
{
QCoreApplication* aw = createApplication( argc, argv );
QCoreApplication* application = createApplication( argc, argv );
Logger::setupLogLevel( Logger::LOGVERBOSE );
ModuleConfig module = handle_args( *aw );
ModuleConfig module = handle_args( *application );
if ( module.moduleName().isEmpty() )
{
return 1;
@@ -469,7 +470,7 @@ main( int argc, char* argv[] )
std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) );
std::unique_ptr< Calamares::System > system_p( new Calamares::System( settings_p->doChroot() ) );
QMainWindow* mw = nullptr;
QMainWindow* mainWindow = nullptr;
auto* gs = jobqueue_p->globalStorage();
if ( !module.globalConfigFile().isEmpty() )
@@ -513,21 +514,21 @@ main( int argc, char* argv[] )
// tries to create the widget **which won't be used anyway**.
//
// To avoid that crash, re-create the QApplication, now with GUI
if ( !qobject_cast< QApplication* >( aw ) )
if ( !qobject_cast< QApplication* >( application ) )
{
auto* replace_app = new QApplication( argc, argv );
replace_app->setQuitOnLastWindowClosed( true );
aw = replace_app;
application = replace_app;
}
mw = module.m_ui ? new QMainWindow() : nullptr;
if ( mw )
mainWindow = module.m_ui ? new QMainWindow() : nullptr;
if ( mainWindow )
{
mw->installEventFilter( Calamares::Retranslator::instance() );
mainWindow->installEventFilter( Calamares::Retranslator::instance() );
}
(void)new Calamares::Branding( module.m_branding );
auto* modulemanager = new Calamares::ModuleManager( QStringList(), nullptr );
(void)Calamares::ViewManager::instance( mw );
(void)Calamares::ViewManager::instance( mainWindow );
modulemanager->addModule( m );
}
@@ -542,16 +543,16 @@ main( int argc, char* argv[] )
return 1;
}
if ( mw )
if ( mainWindow )
{
auto* vm = Calamares::ViewManager::instance();
vm->onInitComplete();
QWidget* w = vm->currentStep()->widget();
w->setParent( mw );
mw->setCentralWidget( w );
w->setParent( mainWindow );
mainWindow->setCentralWidget( w );
w->show();
mw->show();
return aw->exec();
mainWindow->show();
return application->exec();
}
using TR = Logger::DebugRow< const char*, const QString >;
@@ -559,30 +560,13 @@ main( int argc, char* argv[] )
cDebug() << Logger::SubEntry << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() )
<< TR( "interface", m->interfaceString() );
Calamares::JobList jobList = m->jobs();
unsigned int failure_count = 0;
unsigned int count = 1;
for ( const auto& p : jobList )
{
// This doesn't get a SubEntry because the jobs may log a bunch of
// things; print the function-header to make clear that we're back in main.
cDebug() << "Job #" << count << "name" << p->prettyName();
Calamares::JobResult r = p->exec();
if ( !r )
{
cError() << "Job #" << count << "failed" << TR( "summary", r.message() ) << TR( "details", r.details() );
if ( r.errorCode() > 0 )
{
++failure_count;
}
}
++count;
}
Calamares::JobQueue::instance()->enqueue( 100, m->jobs() );
if ( aw )
{
delete aw;
}
QObject::connect( Calamares::JobQueue::instance(),
&Calamares::JobQueue::finished,
[ application ]()
{ QTimer::singleShot( std::chrono::seconds( 3 ), application, &QApplication::quit ); } );
QTimer::singleShot( 0, []() { Calamares::JobQueue::instance()->start(); } );
return failure_count ? 1 : 0;
return application->exec();
}

View File

@@ -22,15 +22,6 @@ static const char s_footer[]
"and the <a href=\"https://app.transifex.com/calamares/calamares/\">Calamares "
"translators team</a>." );
#if 0
// Blue Systems sponsored until June 2022
static const char s_sponsor[] = QT_TRANSLATE_NOOP( "AboutData",
"<a href=\"https://calamares.io/\">Calamares</a> "
"development is sponsored by <br/>"
"<a href=\"http://www.blue-systems.com/\">Blue Systems</a> - "
"Liberating Software." );
#endif
struct Maintainer
{
unsigned int start;
@@ -57,14 +48,12 @@ static constexpr const Maintainer maintainers[] = {
static QString
aboutMaintainers()
{
return std::accumulate( std::cbegin( maintainers ),
std::cend( maintainers ),
QString(),
[]( QString& s, const Maintainer& m )
{
s += m.text();
return s;
} );
QStringList s;
for ( const auto& m : maintainers )
{
s.append( m.text() );
}
return s.join( QString() );
}
static QString

View File

@@ -12,7 +12,7 @@
#define DLLMACRO_H
#ifndef CALAMARES_EXPORT
#define CALAMARES_EXPORT __attribute__((visibility("default")))
#define CALAMARES_EXPORT __attribute__( ( visibility( "default" ) ) )
#endif
/*

View File

@@ -109,12 +109,23 @@ public:
* which of the jobs is "heavy" and which is not.
*/
virtual int getJobWeight() const;
/** @brief The human-readable name of this job
*
* This should be a very short statement of what the job does.
* For status and state information, see prettyStatusMessage().
*
* The job's name may be similar to the status message, but this is
* a name, and should not be an active verb phrase. The translation
* should use context @c \@label .
*
* The name of the job is used as a **fallback** when the status
* or descriptions are empty. If a job has no implementation of
* those methods, it is OK to use other contexts, but it may look
* strange in some places in the UI.
*/
virtual QString prettyName() const = 0;
/** @brief a longer human-readable description of what the job will do
*
* This **may** be used by view steps to fill in the summary
@@ -122,15 +133,23 @@ public:
* module does so.
*
* The default implementation returns an empty string.
*
* The translation should use context @c \@title .
*/
virtual QString prettyDescription() const;
/** @brief A human-readable status for progress reporting
*
* This is called from the JobQueue when progress is made, and should
* return a not-too-long description of the job's status. This
* is made visible in the progress bar of the execution view step.
*
* The job's status should say **what** the job is doing. It should be in
* present active tense. Typically the translation uses tr() context
* @c \@status . See prettyName() for examples.
*/
virtual QString prettyStatusMessage() const;
virtual JobResult exec() = 0;
bool isEmergency() const { return m_emergency; }

View File

@@ -16,13 +16,172 @@
#include "compat/Mutex.h"
#include "utils/Logger.h"
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusPendingCall>
#include <QDBusPendingReply>
#include <QMutex>
#include <QThread>
#include <memory>
namespace
{
// This power-management code is largely cribbed from KDE Discover,
// https://invent.kde.org/plasma/discover/-/blob/master/discover/PowerManagementInterface.cpp
//
// Upstream license text says:
//
// SPDX-FileCopyrightText: 2019 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
// SPDX-License-Identifier: LGPL-3.0-or-later
/** @brief Class to manage sleep / suspend on inactivity
*
* Create an object of this class on the heap. Call inhibitSleep()
* to (try to) stop system sleep / suspend. Call uninhibitSleep()
* when the object is no longer needed. The object self-deletes
* after uninhibitSleep() completes.
*/
class PowerManagementInterface : public QObject
{
Q_OBJECT
public:
PowerManagementInterface( QObject* parent = nullptr );
~PowerManagementInterface() override;
public Q_SLOTS:
void inhibitSleep();
void uninhibitSleep();
private Q_SLOTS:
void hostSleepInhibitChanged();
void inhibitDBusCallFinished( QDBusPendingCallWatcher* aWatcher );
void uninhibitDBusCallFinished( QDBusPendingCallWatcher* aWatcher );
private:
uint m_inhibitSleepCookie = 0;
bool m_inhibitedSleep = false;
};
PowerManagementInterface::PowerManagementInterface( QObject* parent )
: QObject( parent )
{
auto sessionBus = QDBusConnection::sessionBus();
sessionBus.connect( QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "/org/freedesktop/PowerManagement/Inhibit" ),
QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "HasInhibitChanged" ),
this,
SLOT( hostSleepInhibitChanged() ) );
}
PowerManagementInterface::~PowerManagementInterface() = default;
void
PowerManagementInterface::hostSleepInhibitChanged()
{
// We don't actually care
}
void
PowerManagementInterface::inhibitDBusCallFinished( QDBusPendingCallWatcher* aWatcher )
{
QDBusPendingReply< uint > reply = *aWatcher;
if ( reply.isError() )
{
cError() << "Could not inhibit sleep:" << reply.error();
// m_inhibitedSleep = false; // unchanged
}
else
{
m_inhibitSleepCookie = reply.argumentAt< 0 >();
m_inhibitedSleep = true;
cDebug() << "Sleep inhibited, cookie" << m_inhibitSleepCookie;
}
aWatcher->deleteLater();
}
void
PowerManagementInterface::uninhibitDBusCallFinished( QDBusPendingCallWatcher* aWatcher )
{
QDBusPendingReply<> reply = *aWatcher;
if ( reply.isError() )
{
cError() << "Could not uninhibit sleep:" << reply.error();
}
else
{
m_inhibitedSleep = false;
m_inhibitSleepCookie = 0;
cDebug() << "Sleep uninhibited.";
}
aWatcher->deleteLater();
this->deleteLater();
}
void
PowerManagementInterface::inhibitSleep()
{
if ( m_inhibitedSleep )
{
cDebug() << "Sleep is already inhibited.";
return;
}
auto sessionBus = QDBusConnection::sessionBus();
auto inhibitCall = QDBusMessage::createMethodCall( QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "/org/freedesktop/PowerManagement/Inhibit" ),
QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "Inhibit" ) );
inhibitCall.setArguments( { { tr( "Calamares" ) }, { tr( "Installation in progress", "@status" ) } } );
auto asyncReply = sessionBus.asyncCall( inhibitCall );
auto* replyWatcher = new QDBusPendingCallWatcher( asyncReply, this );
QObject::connect(
replyWatcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInterface::inhibitDBusCallFinished );
}
void
PowerManagementInterface::uninhibitSleep()
{
if ( !m_inhibitedSleep )
{
cDebug() << "Sleep was never inhibited.";
this->deleteLater();
return;
}
auto sessionBus = QDBusConnection::sessionBus();
auto uninhibitCall = QDBusMessage::createMethodCall( QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "/org/freedesktop/PowerManagement/Inhibit" ),
QStringLiteral( "org.freedesktop.PowerManagement.Inhibit" ),
QStringLiteral( "UnInhibit" ) );
uninhibitCall.setArguments( { { m_inhibitSleepCookie } } );
auto asyncReply = sessionBus.asyncCall( uninhibitCall );
auto replyWatcher = new QDBusPendingCallWatcher( asyncReply, this );
QObject::connect(
replyWatcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInterface::uninhibitDBusCallFinished );
}
} // namespace
namespace Calamares
{
SleepInhibitor::SleepInhibitor()
{
// Create a PowerManagementInterface object with intentionally no parent
// so it is not destroyed along with this. Instead, when this
// is destroyed, **start** the uninhibit-sleep call which will (later)
// destroy the PowerManagementInterface object.
auto* p = new PowerManagementInterface( nullptr );
p->inhibitSleep();
connect( this, &QObject::destroyed, p, &PowerManagementInterface::uninhibitSleep );
}
SleepInhibitor::~SleepInhibitor() = default;
struct WeightedJob
{
@@ -188,6 +347,13 @@ private:
// starts the job, or if the job itself reports 0.0) be more
// accepting in what gets reported: jobs with no status fall
// back to description and name, whichever is non-empty.
//
// Later calls (e.g. when percentage > 0) use the status unchanged.
// It may be empty, but the ExecutionViewStep knows about empty
// status messages and does not update the text in that case.
//
// This means that a Job can implement just prettyName() and get
// a reasonable "status" message which will update only once.
if ( percentage == 0.0 && message.isEmpty() )
{
message = jobitem.job->prettyDescription();
@@ -267,6 +433,10 @@ JobQueue::start()
m_thread->finalize();
m_finished = false;
m_thread->start();
auto* inhibitor = new PowerManagementInterface( this );
inhibitor->inhibitSleep();
connect( this, &JobQueue::finished, inhibitor, &PowerManagementInterface::uninhibitSleep );
}

View File

@@ -20,6 +20,15 @@ namespace Calamares
class GlobalStorage;
class JobThread;
///@brief RAII class to suppress sleep / suspend during its lifetime
class DLLEXPORT SleepInhibitor : public QObject
{
Q_OBJECT
public:
SleepInhibitor();
~SleepInhibitor() override;
};
class DLLEXPORT JobQueue : public QObject
{
Q_OBJECT

View File

@@ -0,0 +1,23 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2024 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*
*/
#ifndef CALAMARES_COMPAT_SIZE_H
#define CALAMARES_COMPAT_SIZE_H
#include <QVariant>
namespace Calamares
{
/* Compatibility of size types (e.g. qsizetype, STL sizes, int) between Qt5 and Qt6 */
using NumberForTr = int;
}
#endif

View File

@@ -74,7 +74,7 @@ public:
Interface interface() const { return m_interface; }
bool isEmergency() const { return m_isEmergeny; }
bool hasConfig() const { return m_hasConfig; } // TODO: 3.5 rename to noConfig() to match descriptor key
bool hasConfig() const { return m_hasConfig; } // TODO: 3.5 rename to noConfig() to match descriptor key
int weight() const { return m_weight < 1 ? 1 : m_weight; }
bool explicitWeight() const { return m_weight > 0; }

View File

@@ -11,6 +11,7 @@
#include "RequirementsChecker.h"
#include "compat/Mutex.h"
#include "compat/Size.h"
#include "modulesystem/Module.h"
#include "modulesystem/Requirement.h"
#include "modulesystem/RequirementsModel.h"
@@ -120,7 +121,7 @@ RequirementsChecker::reportProgress()
{
cDebug() << "Remaining modules:" << remaining << Logger::DebugList( remainingNames );
unsigned int posInterval = ( m_progressTimer->interval() < 0 ) ? 1000 : uint( m_progressTimer->interval() );
QString waiting = tr( "Waiting for %n module(s)…", "@status", remaining );
QString waiting = tr( "Waiting for %n module(s)…", "@status", static_cast<Calamares::NumberForTr>(remaining) );
QString elapsed = tr( "(%n second(s))", "@status", m_progressTimeouts * posInterval / 999 );
Q_EMIT requirementsProgress( waiting + QString( " " ) + elapsed );
}

View File

@@ -66,7 +66,7 @@ RequirementsModel::reCheckList()
int
RequirementsModel::rowCount( const QModelIndex& ) const
{
return m_requirements.count();
return static_cast< int >( m_requirements.count() ); // TODO 3.4 use qsizetype
}
QVariant

View File

@@ -61,8 +61,8 @@ public:
QVariant data( const QModelIndex& index, int role ) const override;
int rowCount( const QModelIndex& ) const override;
int count() const { return m_requirements.count(); }
int rowCount( const QModelIndex& ) const override; // TODO 3.4 use qsizetype
int count() const { return static_cast< int >( m_requirements.count() ); } // TODO 3.4 use qsizetype
///@brief Debugging tool, describe the checking-state
void describe() const;

View File

@@ -26,17 +26,17 @@ namespace Packages
* Returns @c true if anything was changed, @c false otherwise.
*/
DLLEXPORT bool setGSPackageAdditions( Calamares::GlobalStorage* gs,
const Calamares::ModuleSystem::InstanceKey& module,
const QVariantList& installPackages,
const QVariantList& tryInstallPackages );
const Calamares::ModuleSystem::InstanceKey& module,
const QVariantList& installPackages,
const QVariantList& tryInstallPackages );
/** @brief Sets the install-packages GS keys for the given module
*
* This replaces previously-set install-packages lists. Use this with
* plain lists of package names. It does not support try-install.
*/
DLLEXPORT bool setGSPackageAdditions( Calamares::GlobalStorage* gs,
const Calamares::ModuleSystem::InstanceKey& module,
const QStringList& installPackages );
const Calamares::ModuleSystem::InstanceKey& module,
const QStringList& installPackages );
// void setGSPackageRemovals( const Calamares::ModuleSystem::InstanceKey& key, const QVariantList& removePackages );
} // namespace Packages
} // namespace Calamares

View File

@@ -110,7 +110,8 @@ PartitionServiceTests::testUnitComparison()
}
/* Operator to make the table in testUnitNormalisation_data easier to write */
constexpr qint64 operator""_qi( unsigned long long m )
constexpr qint64
operator""_qi( unsigned long long m )
{
return qint64( m );
}

View File

@@ -55,6 +55,41 @@ get_variant_stringlist( const QVariantList& l )
return retl;
}
/** @brief Inserts the keys from @p map into @p expander as "gs"-keys
*
* For each key k in @p map, a key with literal `gs[` + prefix + '.' + key +
* literal `]` is inserted into the exapander.
*/
static void
expand_tree( Calamares::String::DictionaryExpander& expander, const QString& prefix, const QVariantMap& map )
{
// With the current prefix, turn a key into gs[prefix.key]
auto gs_key = [ &prefix ]( const QString& k ) -> QString
{ return QStringLiteral( "gs[" ) + ( prefix.isEmpty() ? QString() : prefix + '.' ) + k + ']'; };
for ( QVariantMap::const_iterator valueiter = map.cbegin(); valueiter != map.cend(); ++valueiter )
{
const QString key = valueiter.key();
const QVariant value = valueiter.value();
switch ( Calamares::typeOf( value ) )
{
case Calamares::MapVariantType:
expand_tree( expander, prefix.isEmpty() ? key : ( prefix + '.' + key ), value.toMap() );
break;
case Calamares::StringVariantType:
expander.add( gs_key( key ), value.toString() );
break;
case Calamares::IntVariantType:
expander.add( gs_key( key ), QString::number( value.toInt() ) );
break;
default:
// Silently ignore
break;
}
}
}
static Calamares::String::DictionaryExpander
get_gs_expander( System::RunLocation location )
{
@@ -88,6 +123,11 @@ get_gs_expander( System::RunLocation location )
}
}
if ( gs )
{
expand_tree( expander, QString(), gs->data() );
}
return expander;
}

View File

@@ -104,6 +104,8 @@ public:
/** @brief empty command-list with timeout to apply to entries. */
CommandList( bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) );
CommandList( const QVariant& v, bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) );
CommandList( int ) = delete;
CommandList( const QVariant&, int ) = delete;
bool doChroot() const { return m_doChroot; }
std::chrono::seconds defaultTimeout() const { return m_timeout; }

View File

@@ -282,9 +282,17 @@ LibCalamaresTests::testCommandExpansion_data()
QTest::addColumn< QString >( "command" );
QTest::addColumn< QString >( "expected" );
QTest::newRow( "empty" ) << QString() << QString();
QTest::newRow( "ls " ) << QStringLiteral( "ls" ) << QStringLiteral( "ls" );
QTest::newRow( "user " ) << QStringLiteral( "chmod $USER" ) << QStringLiteral( "chmod alice" );
QTest::newRow( "empty " ) << QString() << QString();
QTest::newRow( "ls " ) << QStringLiteral( "ls" ) << QStringLiteral( "ls" );
QTest::newRow( "$USER " ) << QStringLiteral( "chmod $USER" ) << QStringLiteral( "chmod alice" );
QTest::newRow( "${USER}" ) << QStringLiteral( "chmod ${USER}" ) << QStringLiteral( "chmod alice" );
QTest::newRow( "gs-user" ) << QStringLiteral( "chmod ${gs[username]}" ) << QStringLiteral( "chmod alice" );
QTest::newRow( "gs-* " ) << QStringLiteral(
"${gs[username]} has ${gs[branding.bootloader]} ${gs[branding.ducks]} ducks" )
<< QStringLiteral( "alice has found 3 ducks" );
// QStringList does not expand
QTest::newRow( "gs-list" ) << QStringLiteral( "colors ${gs[branding.color]}" )
<< QStringLiteral( "colors ${gs[branding.color]}" );
}
void
@@ -295,6 +303,12 @@ LibCalamaresTests::testCommandExpansion()
QVERIFY( gs );
gs->insert( QStringLiteral( "username" ), QStringLiteral( "alice" ) );
QVariantMap m;
m.insert( QStringLiteral( "bootloader" ), QStringLiteral( "found" ) );
m.insert( QStringLiteral( "ducks" ), 3 );
m.insert( QStringLiteral( "color" ), QStringList { "green", "red" } );
gs->insert( QStringLiteral( "branding" ), m );
QFETCH( QString, command );
QFETCH( QString, expected );
Calamares::CommandLine c( command, std::chrono::seconds( 0 ) );
@@ -350,8 +364,14 @@ commands:
QCOMPARE( m[ "commands" ].toList().count(), 4 );
{
// Take care! The second parameter is a bool, so "3" here means "true"
#ifdef THIS_DOES_NOT_COMPILE_AND_THATS_THE_POINT
// Take care! The second parameter is a bool, so "3" here would
// mean "true", except the int overload is deleted to prevent just that.
Calamares::CommandList cmds( m[ "commands" ], 3 );
// .. and there's no conversion from std::chrono::duration to bool either.
Calamares::CommandList cmds( m[ "commands" ], std::chrono::seconds( 3 ) );
#endif
Calamares::CommandList cmds( m[ "commands" ], true );
QCOMPARE( cmds.defaultTimeout(), std::chrono::seconds( 10 ) );
// But the 4 commands are there anyway
QCOMPARE( cmds.count(), 4 );

View File

@@ -24,39 +24,45 @@ namespace Units
{
/** User defined literals, 1_KB is 1 KiloByte (= 10^3 bytes) */
constexpr qint64 operator""_KB( unsigned long long m )
constexpr qint64
operator""_KB( unsigned long long m )
{
return qint64( m ) * 1000;
}
/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */
constexpr qint64 operator""_KiB( unsigned long long m )
constexpr qint64
operator""_KiB( unsigned long long m )
{
return qint64( m ) * 1024;
}
/** User defined literals, 1_MB is 1 MegaByte (= 10^6 bytes) */
constexpr qint64 operator""_MB( unsigned long long m )
constexpr qint64
operator""_MB( unsigned long long m )
{
return operator""_KB(m)*1000;
return operator""_KB( m ) * 1000;
}
/** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */
constexpr qint64 operator""_MiB( unsigned long long m )
constexpr qint64
operator""_MiB( unsigned long long m )
{
return operator""_KiB(m)*1024;
return operator""_KiB( m ) * 1024;
}
/** User defined literals, 1_GB is 1 GigaByte (= 10^9 bytes) */
constexpr qint64 operator""_GB( unsigned long long m )
constexpr qint64
operator""_GB( unsigned long long m )
{
return operator""_MB(m)*1000;
return operator""_MB( m ) * 1000;
}
/** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */
constexpr qint64 operator""_GiB( unsigned long long m )
constexpr qint64
operator""_GiB( unsigned long long m )
{
return operator""_MiB(m)*1024;
return operator""_MiB( m ) * 1024;
}
} // namespace Units

View File

@@ -25,4 +25,8 @@
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
#pragma clang diagnostic ignored "-Wredundant-parens"
#pragma clang diagnostic ignored "-Wreserved-identifier"
#if __clang_major__ >= 17
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
#endif
#endif

View File

@@ -14,7 +14,7 @@
#ifdef WITH_PYBIND11
#include "python/PythonJob.h"
using JobType = Calamares::Python::Job;
#elif defined(WITH_BOOST_PYTHON)
#elif defined( WITH_BOOST_PYTHON )
// Old Boost::Python version
#include "PythonJob.h"
using JobType = Calamares::PythonJob;

View File

@@ -73,9 +73,8 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent )
{
m_widget->setObjectName( "slideshow" );
m_progressBar->setObjectName( "exec-progress" );
CALAMARES_RETRANSLATE(
m_progressBar->setFormat( tr( "%p%", "Progress percentage indicator: %p is where the number 0..100 is placed" ) );
);
CALAMARES_RETRANSLATE( m_progressBar->setFormat(
tr( "%p%", "Progress percentage indicator: %p is where the number 0..100 is placed" ) ); );
m_label->setObjectName( "exec-message" );
QVBoxLayout* layout = new QVBoxLayout( m_widget );

View File

@@ -125,23 +125,28 @@ def is_zfs_root(partition):
return partition["mountPoint"] == "/" and partition["fs"] == "zfs"
def have_program_in_target(program : str):
"""Returns @c True if @p program is in path in the target"""
return libcalamares.utils.target_env_call(["/usr/bin/which", program]) == 0
def get_kernel_params(uuid):
# Configured kernel parameters (default "quiet"), if plymouth installed, add splash
# screen parameter and then "rw".
kernel_params = libcalamares.job.configuration.get("kernelParams", ["quiet"])
if have_program_in_target("plymouth"):
kernel_params.append("splash")
kernel_params.append("rw")
use_systemd_naming = have_program_in_target("dracut") or (libcalamares.utils.target_env_call(["/usr/bin/grep", "-q", "^HOOKS.*systemd", "/etc/mkinitcpio.conf"]) == 0)
partitions = libcalamares.globalstorage.value("partitions")
cryptdevice_params = []
swap_uuid = ""
swap_outer_mappername = None
swap_outer_uuid = None
cryptdevice_params = []
has_dracut = libcalamares.utils.target_env_call(["sh", "-c", "which dracut"]) == 0
uses_systemd_hook = libcalamares.utils.target_env_call(["sh", "-c",
"grep -q \"^HOOKS.*systemd\" /etc/mkinitcpio.conf"]) == 0
use_systemd_naming = has_dracut or uses_systemd_hook
# Take over swap settings:
# - unencrypted swap partition sets swap_uuid
# - encrypted root sets cryptdevice_params

View File

@@ -46,7 +46,8 @@
#
# The values after a value sub-keys are the same kinds of values
# as can be given to the *script* key in the shellprocess module.
# See shellprocess.conf for documentation on valid values.
# See shellprocess.conf for documentation on valid values and how
# variables are expanded in those commands.
---
dontChroot: false
firmwareType:

View File

@@ -376,14 +376,30 @@ class DMgdm(DisplayManager):
GDM exists with different executable names, so search
for one of them and use it.
"""
for executable, config in (
candidates = (
( "gdm", "etc/gdm/custom.conf" ),
( "gdm3", "etc/gdm3/daemon.conf" )
):
( "gdm3", "etc/gdm3/daemon.conf" ),
( "gdm3", "etc/gdm3/custom.conf" ),
)
def have_executable(executable : str):
bin_path = "{!s}/usr/bin/{!s}".format(self.root_mount_point, executable)
sbin_path = "{!s}/usr/sbin/{!s}".format(self.root_mount_point, executable)
if os.path.exists(bin_path) or os.path.exists(sbin_path):
# Keep the found-executable name around for later
return os.path.exists(bin_path) or os.path.exists(sbin_path)
def have_config(config : str):
config_path = "{!s}/{!s}".format(self.root_mount_point, config)
return os.path.exists(config_path)
# Look for an existing configuration file as a hint, then
# keep the found-executable name and config around for later.
for executable, config in candidates:
if have_config(config) and have_executable(executable):
self.executable = executable
self.config = config
return True
for executable, config in candidates:
if have_executable(executable):
self.executable = executable
self.config = config
return True
@@ -732,13 +748,13 @@ class DMsddm(DisplayManager):
name = "sddm"
executable = "sddm"
configuration_file = "etc/sddm.conf"
configuration_file = "/etc/sddm.conf"
def set_autologin(self, username, do_autologin, default_desktop_environment):
import configparser
# Systems with Sddm as Desktop Manager
sddm_conf_path = os.path.join(self.root_mount_point, self.configuration_file)
sddm_conf_path = os.path.join(self.root_mount_point, self.configuration_file.lstrip('/'))
sddm_config = configparser.ConfigParser(strict=False)
# Make everything case sensitive

View File

@@ -4,7 +4,7 @@
# We have tests to load (some) of the DMs specifically, to test their
# configuration code. Those tests conventionally live in Python
# files here in the tests/ directory. Add them.
foreach(_dmname greetd sddm)
foreach(_dmname greetd sddm gdm)
add_test(
NAME configure-displaymanager-${_dmname}
COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-dm-${_dmname}.py

View File

@@ -0,0 +1,26 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Calamares Boilerplate
import libcalamares
libcalamares.globalstorage = libcalamares.GlobalStorage(None)
libcalamares.globalstorage.insert("testing", True)
# Module prep-work
from src.modules.displaymanager import main
default_desktop_environment = main.DesktopEnvironment("startplasma-x11", "kde-plasma.desktop")
import os
import tempfile
with tempfile.TemporaryDirectory(prefix="calamares-gdm") as tempdir:
os.makedirs(tempdir + "/usr/bin")
os.makedirs(tempdir + "/etc/gdm3")
with open(tempdir + "/usr/bin/gdm3", "w") as f:
f.write("#! /bin/sh\n:\n")
# Specific DM test
d = main.DMgdm(tempdir)
assert(d.have_dm())
d.set_autologin("d", True, default_desktop_environment)
# .. and again (this time checks load/save)
d.set_autologin("d", True, default_desktop_environment)
d.set_autologin("d", True, default_desktop_environment)

View File

@@ -139,7 +139,8 @@ Config::doNotify( bool hasFailed, bool sendAnyway )
QString message;
if ( hasFailed )
{
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed", "@title" ) : tr( "Installation Failed", "@title" );
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed", "@title" )
: tr( "Installation Failed", "@title" );
message = Calamares::Settings::instance()->isSetupMode()
? tr( "The setup of %1 did not complete successfully.", "@info" )
: tr( "The installation of %1 did not complete successfully.", "@info" );
@@ -148,8 +149,9 @@ Config::doNotify( bool hasFailed, bool sendAnyway )
{
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Complete", "@title" )
: tr( "Installation Complete", "@title" );
message = Calamares::Settings::instance()->isSetupMode() ? tr( "The setup of %1 is complete.", "@info" )
: tr( "The installation of %1 is complete.", "@info" );
message = Calamares::Settings::instance()->isSetupMode()
? tr( "The setup of %1 is complete.", "@info" )
: tr( "The installation of %1 is complete.", "@info" );
}
const auto* branding = Calamares::Branding::instance();

View File

@@ -74,26 +74,30 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>All done.</h1><br/>"
"%1 has been set up on your computer.<br/>"
"You may now start using your new system.", "@info" )
"You may now start using your new system.",
"@info" )
.arg( branding->versionedName() ) );
ui->restartCheckBox->setToolTip( tr( "<html><head/><body>"
"<p>When this box is checked, your system will "
"restart immediately when you click on "
"<span style=\"font-style:italic;\">Done</span> "
"or close the setup program.</p></body></html>", "@tooltip" ) );
"or close the setup program.</p></body></html>",
"@tooltip" ) );
}
else
{
ui->mainText->setText( tr( "<h1>All done.</h1><br/>"
"%1 has been installed on your computer.<br/>"
"You may now restart into your new system, or continue "
"using the %2 Live environment.", "@info" )
"using the %2 Live environment.",
"@info" )
.arg( branding->versionedName(), branding->productName() ) );
ui->restartCheckBox->setToolTip( tr( "<html><head/><body>"
"<p>When this box is checked, your system will "
"restart immediately when you click on "
"<span style=\"font-style:italic;\">Done</span> "
"or close the installer.</p></body></html>", "@tooltip" ) );
"or close the installer.</p></body></html>",
"@tooltip" ) );
}
}
else
@@ -104,7 +108,8 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>Setup Failed</h1><br/>"
"%1 has not been set up on your computer.<br/>"
"The error message was: %2.", "@info, %1 is product name with version" )
"The error message was: %2.",
"@info, %1 is product name with version" )
.arg( branding->versionedName() )
.arg( message ) );
}
@@ -112,7 +117,8 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>Installation Failed</h1><br/>"
"%1 has not been installed on your computer.<br/>"
"The error message was: %2.", "@info, %1 is product name with version" )
"The error message was: %2.",
"@info, %1 is product name with version" )
.arg( branding->versionedName() )
.arg( message ) );
}

View File

@@ -166,8 +166,9 @@ ResizeFSJob::exec()
if ( !m_kpmcore )
{
cWarning() << "Could not load KPMCore backend (2).";
return Calamares::JobResult::error( tr( "KPMCore not available", "@error" ),
tr( "Calamares cannot start KPMCore for the file system resize job.", "@error" ) );
return Calamares::JobResult::error(
tr( "KPMCore not available", "@error" ),
tr( "Calamares cannot start KPMCore for the file system resize job.", "@error" ) );
}
m_kpmcore.backend()->initFSSupport(); // Might not be enough, see below
@@ -178,18 +179,20 @@ ResizeFSJob::exec()
return Calamares::JobResult::error(
tr( "Resize failed.", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 could not be found in this system, and cannot be resized.", "@info" ).arg( m_fsname )
: tr( "The device %1 could not be found in this system, and cannot be resized.", "@info" ).arg( m_devicename ) );
? tr( "The filesystem %1 could not be found in this system, and cannot be resized.", "@info" )
.arg( m_fsname )
: tr( "The device %1 could not be found in this system, and cannot be resized.", "@info" )
.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", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
return Calamares::JobResult::error(
tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
}
qint64 new_end = findGrownEnd( m );
@@ -198,10 +201,10 @@ ResizeFSJob::exec()
if ( new_end < 0 )
{
return Calamares::JobResult::error( tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
return Calamares::JobResult::error(
tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
}
if ( new_end == 0 )
{

View File

@@ -151,8 +151,12 @@ class FstabGenerator(object):
if not mapper_name or not luks_uuid:
return None
password = "/crypto_keyfile.bin"
crypttab_options = self.crypttab_options
# Make sure to not use missing keyfile
if os.path.isfile(os.path.join(self.root_mount_point, "crypto_keyfile.bin")):
password = "/crypto_keyfile.bin"
else:
password = "none"
# Set crypttab password for partition to none and remove crypttab options
# if root partition was not encrypted

View File

@@ -100,7 +100,7 @@ hostCPU_FreeBSD()
#if defined( Q_OS_LINUX )
static QString
hostCPUmatchARM( const QString& s )
hostCPUmatchARM( const QString& )
{
/* The "CPU implementer" line is for ARM CPUs in general.
*

View File

@@ -9,3 +9,30 @@
#
# Please note that using the systemd hooks result in no access to the emergency recovery shell
useSystemdHook: false
#
# Modifications to the standard list of hooks.
#
# There are three subkeys:
# - prepend, which puts hooks at the beginning of the
# list of hooks, in the order specified here,
# - append, which adds hooks at the end of the list of
# hooks, in the order specified here,
# - remove, which removes hooks from the list of hooks,
# wherever they may be.
#
# The example configuration here yields bogus, <stuff>, bogus
# initially, and then removes that hook again.
#
hooks:
prepend: [ bogus ]
append: [ bogus ]
remove: [ bogus ]
#
# In some cases, you may want to use a different source
# file than /etc/mkinitcpio.conf , e.g. because the live system
# does not match the target in a useful way. If unset or
# empty, defaults to /etc/mkinitcpio.conf
#
source: "/etc/mkinitcpio.conf"

View File

@@ -7,5 +7,11 @@ additionalProperties: false
type: object
properties:
useSystemdHook: { type: boolean }
hooks:
type: object
additionalProperties: false
properties:
prepend: { type: array, items: string }
append: { type: array, items: string }
remove: { type: array, items: string }
source: { type: string }

View File

@@ -97,7 +97,7 @@ def get_host_initcpio():
the lines from that file, or an empty list if it does
not exist.
"""
hostfile = "/etc/mkinitcpio.conf"
hostfile = libcalamares.job.configuration.get("source", None) or "/etc/mkinitcpio.conf"
try:
with open(hostfile, "r") as mkinitcpio_file:
mklins = [x.strip() for x in mkinitcpio_file.readlines()]
@@ -148,6 +148,7 @@ def find_initcpio_features(partitions, root_mount_point):
"""
hooks = [
"autodetect",
"microcode",
"kms",
"modconf",
"block",
@@ -167,6 +168,13 @@ def find_initcpio_features(partitions, root_mount_point):
hooks.append("keymap")
hooks.append("consolefont")
hooks_map = libcalamares.job.configuration.get("hooks", None)
if not hooks_map:
hooks_map = dict()
hooks_prepend = hooks_map.get("prepend", None) or []
hooks_append = hooks_map.get("append", None) or []
hooks_remove = hooks_map.get("remove", None) or []
modules = []
files = []
binaries = []
@@ -239,6 +247,9 @@ def find_initcpio_features(partitions, root_mount_point):
else:
hooks.append("fsck")
# Modify according to the keys in the configuration
hooks = [h for h in (hooks_prepend + hooks + hooks_append) if h not in hooks_remove]
return hooks, modules, files, binaries

View File

@@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
rootMountPoint: /tmp/mount
partitions:
- fs: ext4
mountPoint: "/"

View File

@@ -502,14 +502,16 @@ QString
Config::prettyStatus() const
{
QString status;
status += tr( "Keyboard model has been set to %1<br/>.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" )
.arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) );
status
+= tr( "Keyboard model has been set to %1<br/>.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" )
.arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) );
QString layout = m_keyboardLayoutsModel->item( m_keyboardLayoutsModel->currentIndex() ).second.description;
QString variant = m_keyboardVariantsModel->currentIndex() >= 0
? m_keyboardVariantsModel->label( m_keyboardVariantsModel->currentIndex() )
: QString( "<default>" );
status += tr( "Keyboard layout has been set to %1/%2.", "@label, %1 is layout, %2 is layout variant" ).arg( layout, variant );
status += tr( "Keyboard layout has been set to %1/%2.", "@label, %1 is layout, %2 is layout variant" )
.arg( layout, variant );
return status;
}

View File

@@ -64,7 +64,9 @@ QString
SetKeyboardLayoutJob::prettyName() const
{
return tr( "Setting keyboard model to %1, layout as %2-%3…", "@status, %1 model, %2 layout, %3 variant" )
.arg( m_model ).arg( m_layout ).arg( m_variant );
.arg( m_model )
.arg( m_layout )
.arg( m_variant );
}
@@ -365,8 +367,10 @@ SetKeyboardLayoutJob::exec()
if ( !writeVConsoleData( vconsoleConfPath, convertedKeymapPath ) )
{
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for the virtual console.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is virtual console configuration path" ).arg( vconsoleConfPath ) );
return Calamares::JobResult::error(
tr( "Failed to write keyboard configuration for the virtual console.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is virtual console configuration path" )
.arg( vconsoleConfPath ) );
}
// Get the path to the destination's /etc/X11/xorg.conf.d/00-keyboard.conf
@@ -391,8 +395,9 @@ SetKeyboardLayoutJob::exec()
if ( !writeX11Data( keyboardConfPath ) )
{
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for X11.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is keyboard configuration path" ).arg( keyboardConfPath ) );
return Calamares::JobResult::error(
tr( "Failed to write keyboard configuration for X11.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is keyboard configuration path" ).arg( keyboardConfPath ) );
}
}

View File

@@ -45,6 +45,7 @@ KeyboardLayoutTests::testSimpleLayoutLookup_data()
QTest::newRow( "turkish default" ) << QString( "tr" ) << QString() << QString() << QString( "trq" );
QTest::newRow( "turkish alt-q" ) << QString( "tr" ) << QString() << QString( "alt" ) << QString( "trq" );
QTest::newRow( "turkish f" ) << QString( "tr" ) << QString() << QString( "f" ) << QString( "trf" );
QTest::newRow( "italian" ) << QString( "it" ) << QString( "pc105" ) << QString() << QString( "it" );
}

View File

@@ -40,6 +40,7 @@ slovene si pc105 - terminate:ctrl_alt_bksp
hu101 hu pc105 qwerty terminate:ctrl_alt_bksp
jp106 jp jp106 - terminate:ctrl_alt_bksp
croat hr pc105 - terminate:ctrl_alt_bksp
it it pc105 - terminate:ctrl_alt_bksp
it2 it pc105 - terminate:ctrl_alt_bksp
hu hu pc105 - terminate:ctrl_alt_bksp
sr-latin rs pc105 latin terminate:ctrl_alt_bksp
@@ -47,7 +48,6 @@ fi fi pc105 - terminate:ctrl_alt_bksp
fr_CH ch pc105 fr terminate:ctrl_alt_bksp
dk-latin1 dk pc105 - terminate:ctrl_alt_bksp
fr fr pc105 - terminate:ctrl_alt_bksp
it it pc105 - terminate:ctrl_alt_bksp
ua-utf ua,us pc105 - terminate:ctrl_alt_bksp,grp:shifts_toggle,grp_led:scroll
fr-latin1 fr pc105 - terminate:ctrl_alt_bksp
sg-latin1 ch pc105 de_nodeadkeys terminate:ctrl_alt_bksp

View File

@@ -9,3 +9,43 @@ ua us - ua-utf
gr us - gr
he us - he
ar us - ar
ir us - fa
# This list is from /usr/share/X11/xkb/rules/base, all the non-latin
# layouts are collected in $nonlatin . Add us (English) to all of them.
af us - af
am us - am
ara us - ara
bd us - bd
bg us - bg
bt us - bt
by us - by
eg us - eg
et us - et
ge us - ge
gn us - gn
id us - id
il us - il
in us - in
jp us - jp
jv us - jv
kg us - kg
kh us - kh
kr us - kr
kz us - kz
la us - la
lk us - lk
ma us - ma
me us - me
mk us - mk
mm us - mm
mn us - mn
mv us - mv
my us - my
pk us - pk
rs us - rs
sy us - sy
th us - th
tj us - tj
tz us - tz
uz us - uz

View File

@@ -147,9 +147,11 @@ LicensePage::retranslate()
if ( !m_allLicensesOptional )
{
ui->mainText->setText( tr( "This setup procedure will install proprietary "
"software that is subject to licensing terms.", "@info" )
"software that is subject to licensing terms.",
"@info" )
+ br + review );
QString mustAcceptText( tr( "If you do not agree with the terms, the setup procedure cannot continue.", "@info" ) );
QString mustAcceptText(
tr( "If you do not agree with the terms, the setup procedure cannot continue.", "@info" ) );
ui->acceptCheckBox->setToolTip( mustAcceptText );
}
else
@@ -157,10 +159,12 @@ LicensePage::retranslate()
ui->mainText->setText( tr( "This setup procedure can install proprietary "
"software that is subject to licensing terms "
"in order to provide additional features and enhance the user "
"experience.", "@info" )
"experience.",
"@info" )
+ br + review );
QString okAcceptText( tr( "If you do not agree with the terms, proprietary software will not "
"be installed, and open source alternatives will be used instead.", "@info" ) );
"be installed, and open source alternatives will be used instead.",
"@info" ) );
ui->acceptCheckBox->setToolTip( okAcceptText );
}
ui->retranslateUi( this );

View File

@@ -107,38 +107,44 @@ LicenseWidget::retranslateUi()
case LicenseEntry::Type::Driver:
//: %1 is an untranslatable product name, example: Creative Audigy driver
productDescription = tr( "<strong>%1 driver</strong><br/>"
"by %2", "@label, %1 is product name, %2 is product vendor" )
"by %2",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::GpuDriver:
//: %1 is usually a vendor name, example: Nvidia graphics driver
productDescription = tr( "<strong>%1 graphics driver</strong><br/>"
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
"<font color=\"Grey\">by %2</font>",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::BrowserPlugin:
productDescription = tr( "<strong>%1 browser plugin</strong><br/>"
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
"<font color=\"Grey\">by %2</font>",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Codec:
productDescription = tr( "<strong>%1 codec</strong><br/>"
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
"<font color=\"Grey\">by %2</font>",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Package:
productDescription = tr( "<strong>%1 package</strong><br/>"
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
"<font color=\"Grey\">by %2</font>",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Software:
productDescription = tr( "<strong>%1</strong><br/>"
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
"<font color=\"Grey\">by %2</font>",
"@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
}
@@ -183,7 +189,8 @@ LicenseWidget::updateExpandToolTip()
{
if ( m_entry.isLocal() )
{
m_viewLicenseButton->setText( m_isExpanded ? tr( "Hide the license text", "@tooltip" ) : tr( "Show the license text", "@tooltip" ) );
m_viewLicenseButton->setText( m_isExpanded ? tr( "Hide the license text", "@tooltip" )
: tr( "Show the license text", "@tooltip" ) );
}
else
{

View File

@@ -33,7 +33,7 @@ calamares_add_plugin(locale
SHARED_LIB
)
if(DEBUG_TIMEZONES)
target_compile_definitions(${localeq_TARGET} PRIVATE DEBUG_TIMEZONES)
target_compile_definitions(${locale_TARGET} PRIVATE DEBUG_TIMEZONES)
endif()
calamares_add_test(

View File

@@ -29,7 +29,8 @@ LCLocaleDialog::LCLocaleDialog( const QString& guessedLCLocale, const QStringLis
upperText->setWordWrap( true );
upperText->setText( tr( "The system locale setting affects the language and character "
"set for some command line user interface elements.<br/>"
"The current setting is <strong>%1</strong>.", "@info" )
"The current setting is <strong>%1</strong>.",
"@info" )
.arg( guessedLCLocale ) );
mainLayout->addWidget( upperText );
setMinimumWidth( upperText->fontMetrics().height() * 24 );
@@ -85,5 +86,5 @@ QString
LCLocaleDialog::selectedLCLocale()
{
const auto items = m_localesWidget->selectedItems();
return items.isEmpty() ? QString{} : items.first()->text();
return items.isEmpty() ? QString {} : items.first()->text();
}

View File

@@ -67,9 +67,10 @@ SetTimezoneJob::exec()
int ec = Calamares::System::instance()->targetEnvCall( { "ln", "-s", zoneinfoPath, localtimeSlink } );
if ( ec )
{
return Calamares::JobResult::error(
tr( "Cannot set timezone.", "@error" ),
tr( "Link creation failed, target: %1; link name: %2", "@info" ).arg( zoneinfoPath ).arg( "/etc/localtime" ) );
return Calamares::JobResult::error( tr( "Cannot set timezone.", "@error" ),
tr( "Link creation failed, target: %1; link name: %2", "@info" )
.arg( zoneinfoPath )
.arg( "/etc/localtime" ) );
}
QFile timezoneFile( gs->value( "rootMountPoint" ).toString() + "/etc/timezone" );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,6 +1,6 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020 - 2022 Anke Boersma <demm@kaosx.us>
* SPDX-FileCopyrightText: 2020 - 2024 Anke Boersma <demm@kaosx.us>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
@@ -112,7 +112,7 @@ Column {
Plugin {
id: mapPlugin
preferred: ["osm", "esri"] // "esri", "here", "itemsoverlay", "mapbox", "mapboxgl", "osm"
name: ["osm"]
}
Map {
@@ -177,6 +177,30 @@ Column {
getTzOffline();
}
}
WheelHandler {
id: wheel
acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland"
? PointerDevice.Mouse | PointerDevice.TouchPad
: PointerDevice.Mouse
rotationScale: 1/120
property: "zoomLevel"
}
DragHandler {
id: drag
target: null
onTranslationChanged: (delta) => map.pan(-delta.x, -delta.y)
}
Shortcut {
enabled: map.zoomLevel < map.maximumZoomLevel
sequence: StandardKey.ZoomIn
onActivated: map.zoomLevel = Math.round(map.zoomLevel + 1)
}
Shortcut {
enabled: map.zoomLevel > map.minimumZoomLevel
sequence: StandardKey.ZoomOut
onActivated: map.zoomLevel = Math.round(map.zoomLevel - 1)
}
}
Column {

View File

@@ -101,10 +101,8 @@ MachineIdJob::exec()
QObject::tr( "Directory not found" ),
QObject::tr( "Could not create new random file <pre>%1</pre>." ).arg( entropy_file ) );
}
auto r = createEntropy( m_entropy_copy ? EntropyGeneration::CopyFromHost
: EntropyGeneration::New,
root,
entropy_file );
auto r = createEntropy(
m_entropy_copy ? EntropyGeneration::CopyFromHost : EntropyGeneration::New, root, entropy_file );
if ( !r )
{
return r;

View File

@@ -74,13 +74,14 @@ def is_ssd_disk(partition):
return False
def get_mount_options(filesystem, mount_options, partition):
def get_mount_options(filesystem, mount_options, partition, efi_location = None):
"""
Returns the mount options for the partition object and filesystem
:param filesystem: A string containing the filesystem
:param mount_options: A list of dicts that descripes the mount options for each mountpoint
:param partition: A dict containing information about the partition
:param efi_location: A string holding the location of the EFI partition or None
:return: A comma seperated string containing the mount options suitable for passing to mount
"""
@@ -92,7 +93,13 @@ def get_mount_options(filesystem, mount_options, partition):
if mount_options is None:
return "defaults"
options = next((x for x in mount_options if x["filesystem"] == filesystem), None)
# The EFI partition uses special mounting options
if efi_location and partition["mountPoint"] == efi_location:
effective_filesystem = "efi"
else:
effective_filesystem = filesystem
options = next((x for x in mount_options if x["filesystem"] == effective_filesystem), None)
# If there is no match then check for default options
if options is None:
@@ -214,7 +221,7 @@ def mount_zfs(root_mount_point, partition):
raise ZfsException(_("Failed to set zfs mountpoint"))
def mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list):
def mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list, efi_location):
"""
Do a single mount of @p partition inside @p root_mount_point.
@@ -223,6 +230,7 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
:param partitions: The full list of partitions used to filter out btrfs subvols which have duplicate mountpoints
:param mount_options: The mount options from the config file
:param mount_options_list: A list of options for each mountpoint to be placed in global storage for future modules
:param efi_location: A string holding the location of the EFI partition or None
:return:
"""
# Create mount point with `+` rather than `os.path.join()` because
@@ -235,7 +243,9 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
# Ensure that the created directory has the correct SELinux context on
# SELinux-enabled systems.
os.makedirs(mount_point, exist_ok=True)
try:
subprocess.call(['chcon', '--reference=' + raw_mount_point, mount_point])
except FileNotFoundError as e:
@@ -259,7 +269,7 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
if fstype == "zfs":
mount_zfs(root_mount_point, partition)
else: # fstype == "zfs"
mount_options_string = get_mount_options(fstype, mount_options, partition)
mount_options_string = get_mount_options(fstype, mount_options, partition, efi_location)
if libcalamares.utils.mount(device,
mount_point,
fstype,
@@ -349,7 +359,10 @@ def run():
if not extra_mounts:
libcalamares.utils.warning("No extra mounts defined. Does mount.conf exist?")
if libcalamares.globalstorage.value("firmwareType") != "efi":
efi_location = None
if libcalamares.globalstorage.value("firmwareType") == "efi":
efi_location = libcalamares.globalstorage.value("efiSystemPartition")
else:
for mount in extra_mounts:
if mount.get("efi", None) is True:
extra_mounts.remove(mount)
@@ -365,7 +378,7 @@ def run():
mount_options_list = []
try:
for partition in mountable_partitions:
mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list)
mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list, efi_location)
except ZfsException as ze:
return _("zfs mounting error"), ze.message

View File

@@ -21,7 +21,7 @@
static inline quint64
sizeOrder( const QSize& size )
{
return static_cast<quint64>(size.width()) * static_cast<quint64>(size.height());
return static_cast< quint64 >( size.width() ) * static_cast< quint64 >( size.height() );
}
/// @brief Sets a screenshot in @p map from @p screenshot, if a usable one is found
@@ -55,15 +55,9 @@ static PackageItem
fromComponent( AppStream::Pool& pool, AppStream::Component& component )
{
#if HAVE_APPSTREAM_VERSION == 0
auto setActiveLocale = [&component](const QString & locale)
{
component.setActiveLocale( locale );
};
auto setActiveLocale = [ &component ]( const QString& locale ) { component.setActiveLocale( locale ); };
#else
auto setActiveLocale = [&pool](const QString & locale)
{
pool.setLocale( locale );
};
auto setActiveLocale = [ &pool ]( const QString& locale ) { pool.setLocale( locale ); };
#endif
QVariantMap map;

View File

@@ -28,9 +28,11 @@
#define HAVE_APPSTREAM_HEADERS AppStreamQt
#endif
// clang-format off
#include CALAMARES_LT HAVE_APPSTREAM_HEADERS/pool.h CALAMARES_GT
#include CALAMARES_LT HAVE_APPSTREAM_HEADERS/image.h CALAMARES_GT
#include CALAMARES_LT HAVE_APPSTREAM_HEADERS/screenshot.h CALAMARES_GT
// clang-format on
#undef CALAMARES_LT
#undef CALAMARES_GT

View File

@@ -60,6 +60,7 @@ if(KPMcore_FOUND)
core/DeviceList.cpp
core/DeviceModel.cpp
core/KPMHelpers.cpp
core/OsproberEntry.cpp
core/PartitionActions.cpp
core/PartitionCoreModule.cpp
core/PartitionInfo.cpp

View File

@@ -444,6 +444,7 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
m_allowZfsEncryption = Calamares::getBool( configurationMap, "allowZfsEncryption", true );
m_allowManualPartitioning = Calamares::getBool( configurationMap, "allowManualPartitioning", true );
m_preCheckEncryption = Calamares::getBool( configurationMap, "preCheckEncryption", false );
m_showNotEncryptedBootMessage = Calamares::getBool( configurationMap, "showNotEncryptedBootMessage", true );
m_requiredPartitionTableType = Calamares::getStringList( configurationMap, "requiredPartitionTableType" );

View File

@@ -35,7 +35,7 @@ class Config : public QObject
replaceModeFilesystemChanged )
Q_PROPERTY( bool allowManualPartitioning READ allowManualPartitioning CONSTANT FINAL )
Q_PROPERTY( bool preCheckEncryption READ preCheckEncryption CONSTANT FINAL )
Q_PROPERTY( bool showNotEncryptedBootMessage READ showNotEncryptedBootMessage CONSTANT FINAL )
public:
@@ -148,6 +148,13 @@ public:
/// @brief Is manual partitioning allowed (not explicitly disabled in the config file)?
bool allowManualPartitioning() const { return m_allowManualPartitioning; }
/** @brief Pre-check encryption checkbox.
*
* This is meaningful only if enableLuksAutomatedPartitioning is @c true.
* Default value is @c false
*/
bool preCheckEncryption() const { return m_preCheckEncryption; }
/// @brief Show "Boot partition not encrypted" warning (not explicitly disabled in the config file)?
bool showNotEncryptedBootMessage() const { return m_showNotEncryptedBootMessage; }
@@ -199,6 +206,7 @@ private:
QStringList m_requiredPartitionTableType;
bool m_allowZfsEncryption = true;
bool m_allowManualPartitioning = true;
bool m_preCheckEncryption = false;
bool m_showNotEncryptedBootMessage = true;
};

View File

@@ -223,9 +223,15 @@ PartitionViewStep::prettyStatus() const
const QList< PartitionCoreModule::SummaryInfo > list = m_core->createSummaryInfo();
cDebug() << "Summary for Partition" << list.length() << choice;
auto joinDiskInfo = [ choice = choice ]( QString& s, const PartitionCoreModule::SummaryInfo& i )
{ return s + diskDescription( 1, i, choice ); };
const QString diskInfoLabel = std::accumulate( list.begin(), list.end(), QString(), joinDiskInfo );
const QString diskInfoLabel = [ &choice, &list ]()
{
QStringList s;
for ( const auto& i : list )
{
s.append( diskDescription( 1, i, choice ) );
}
return s.join( QString() );
}();
const QString jobsLabel = jobDescriptions( jobs() ).join( QStringLiteral( "<br/>" ) );
return diskInfoLabel + "<br/>" + jobsLabel;
}
@@ -497,11 +503,12 @@ shouldWarnForNotEncryptedBoot( const Config* config, const PartitionCoreModule*
Partition* root_p = core->findPartitionByMountPoint( "/" );
Partition* boot_p = core->findPartitionByMountPoint( "/boot" );
if ( root_p and boot_p )
if ( root_p && boot_p )
{
if ( ( root_p->fileSystem().type() == FileSystem::Luks && boot_p->fileSystem().type() != FileSystem::Luks )
|| ( root_p->fileSystem().type() == FileSystem::Luks2
&& boot_p->fileSystem().type() != FileSystem::Luks2 ) )
const auto encryptionMismatch
= [ root_t = root_p->fileSystem().type(), boot_t = boot_p->fileSystem().type() ]( FileSystem::Type t )
{ return root_t == t && boot_t != t; };
if ( encryptionMismatch( FileSystem::Luks ) || encryptionMismatch( FileSystem::Luks2 ) )
{
return true;
}

View File

@@ -0,0 +1,63 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
* SPDX-FileCopyrightText: 2018-2019, 2024 Adriaan de Groot <groot@kde.org>
* SPDX-FileCopyrightText: 2019 Collabora Ltd <arnaud.ferraris@collabora.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
#include "OsproberEntry.h"
bool
FstabEntry::isValid() const
{
return !partitionNode.isEmpty() && !mountPoint.isEmpty() && !fsType.isEmpty();
}
FstabEntry
FstabEntry::fromEtcFstab( const QString& rawLine )
{
QString line = rawLine.simplified();
if ( line.startsWith( '#' ) )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
QStringList splitLine = line.split( ' ' );
if ( splitLine.length() != 6 )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
return FstabEntry {
splitLine.at( 0 ), // path, or UUID, or LABEL, etc.
splitLine.at( 1 ), // mount point
splitLine.at( 2 ), // fs type
splitLine.at( 3 ), // options
splitLine.at( 4 ).toInt(), //dump
splitLine.at( 5 ).toInt() //pass
};
}
namespace Calamares
{
FstabEntryList
fromEtcFstabContents( const QStringList& fstabLines )
{
FstabEntryList fstabEntries;
for ( const QString& rawLine : fstabLines )
{
fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) );
}
const auto invalidEntries = std::remove_if(
fstabEntries.begin(), fstabEntries.end(), []( const FstabEntry& x ) { return !x.isValid(); } );
fstabEntries.erase( invalidEntries, fstabEntries.end() );
return fstabEntries;
}
} // namespace Calamares

View File

@@ -32,11 +32,24 @@ struct FstabEntry
* If the string isn't valid (e.g. comment-line, or broken
* fstab entry) then the entry that is returned is invalid.
*/
static FstabEntry fromEtcFstab( const QString& ); // implemented in Partutils.cpp
static FstabEntry fromEtcFstab( const QString& );
};
typedef QList< FstabEntry > FstabEntryList;
namespace Calamares
{
/** @brief Returns valid entries from the lines of a fstab file */
FstabEntryList fromEtcFstabContents( const QStringList& fstabLines );
/** @brief Returns valid entries from the byte-contents of a fstab file */
inline FstabEntryList
fromEtcFstabContents( const QByteArray& contents )
{
return fromEtcFstabContents( QString::fromLocal8Bit( contents ).split( '\n' ) );
}
} // namespace Calamares
struct OsproberEntry
{
QString prettyName;

View File

@@ -254,30 +254,25 @@ lookForFstabEntries( const QString& partitionPath )
if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
{
const QStringList fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ).split( '\n' );
for ( const QString& rawLine : fstabLines )
{
fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) );
}
const auto fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ).split( '\n' );
fstabFile.close();
const int lineCount = fstabEntries.count();
std::remove_if(
fstabEntries.begin(), fstabEntries.end(), []( const FstabEntry& x ) { return !x.isValid(); } );
cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries from" << lineCount
const auto fstabEntries = Calamares::fromEtcFstabContents( fstabLines );
cDebug() << Logger::SubEntry << "got" << fstabEntries.count() << "fstab entries from" << fstabLines.count()
<< "lines in" << fstabFile.fileName();
return fstabEntries;
}
else
{
cWarning() << "Could not read fstab from mounted fs";
return {};
}
}
else
{
cWarning() << "Could not mount existing fs";
return {};
}
return fstabEntries;
}
static QString
@@ -581,12 +576,7 @@ efiFilesystemMinimumSize()
uefisys_part_sizeB = v > 0 ? v : 0;
}
// There is a lower limit of what can be configured
if ( uefisys_part_sizeB < efiSpecificationHardMinimumSize )
{
uefisys_part_sizeB = efiSpecificationHardMinimumSize;
}
return uefisys_part_sizeB;
return efiSpecificationHardMinimumSize;
return std::max( uefisys_part_sizeB, efiSpecificationHardMinimumSize );
}
QString
@@ -646,36 +636,3 @@ canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType )
}
} // namespace PartUtils
/* Implementation of methods for FstabEntry, from OsproberEntry.h */
bool
FstabEntry::isValid() const
{
return !partitionNode.isEmpty() && !mountPoint.isEmpty() && !fsType.isEmpty();
}
FstabEntry
FstabEntry::fromEtcFstab( const QString& rawLine )
{
QString line = rawLine.simplified();
if ( line.startsWith( '#' ) )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
QStringList splitLine = line.split( ' ' );
if ( splitLine.length() != 6 )
{
return FstabEntry { QString(), QString(), QString(), QString(), 0, 0 };
}
return FstabEntry {
splitLine.at( 0 ), // path, or UUID, or LABEL, etc.
splitLine.at( 1 ), // mount point
splitLine.at( 2 ), // fs type
splitLine.at( 3 ), // options
splitLine.at( 4 ).toInt(), //dump
splitLine.at( 5 ).toInt() //pass
};
}

View File

@@ -185,7 +185,6 @@ ChoicePage::init( PartitionCoreModule* core )
setModelToComboBox( m_drivesCombo, core->deviceModel() );
connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice );
connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged );
connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged );
@@ -468,6 +467,8 @@ ChoicePage::onActionChanged()
{
m_encryptWidget->setFilesystem( FileSystem::typeForName( m_replaceFsTypesChoiceComboBox->currentText() ) );
}
m_encryptWidget->setEncryptionCheckbox( m_config->preCheckEncryption() );
}
Device* currd = selectedDevice();
@@ -679,7 +680,11 @@ ChoicePage::onLeave()
{
if ( m_config->installChoice() == InstallChoice::Alongside )
{
doAlongsideApply();
if ( m_afterPartitionSplitterWidget->splitPartitionSize() >= 0
&& m_afterPartitionSplitterWidget->newPartitionSize() >= 0 )
{
doAlongsideApply();
}
}
if ( m_isEfi
@@ -1057,7 +1062,8 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice )
Q_UNUSED( path )
sizeLabel->setText(
tr( "%1 will be shrunk to %2MiB and a new "
"%3MiB partition will be created for %4.", "@info, %1 is partition name, %4 is product name" )
"%3MiB partition will be created for %4.",
"@info, %1 is partition name, %4 is product name" )
.arg( m_beforePartitionBarsView->selectionModel()->currentIndex().data().toString() )
.arg( Calamares::BytesToMiB( size ) )
.arg( Calamares::BytesToMiB( sizeNext ) )
@@ -1188,14 +1194,16 @@ ChoicePage::setupEfiSystemPartitionSelector()
{
m_efiLabel->setText( tr( "An EFI system partition cannot be found anywhere "
"on this system. Please go back and use manual "
"partitioning to set up %1.", "@info, %1 is product name" )
"partitioning to set up %1.",
"@info, %1 is product name" )
.arg( Calamares::Branding::instance()->shortProductName() ) );
updateNextEnabled();
}
else if ( efiSystemPartitions.count() == 1 ) //probably most usual situation
{
m_efiLabel->setText( tr( "The EFI system partition at %1 will be used for "
"starting %2.", "@info, %1 is partition path, %2 is product name" )
"starting %2.",
"@info, %1 is partition path, %2 is product name" )
.arg( efiSystemPartitions.first()->partitionPath() )
.arg( Calamares::Branding::instance()->shortProductName() ) );
}
@@ -1505,7 +1513,8 @@ ChoicePage::setupActions()
{
if ( atLeastOneIsMounted )
{
m_messageLabel->setText( tr( "This storage device has one of its partitions <strong>mounted</strong>.", "@info" ) );
m_messageLabel->setText(
tr( "This storage device has one of its partitions <strong>mounted</strong>.", "@info" ) );
}
else
{
@@ -1575,7 +1584,10 @@ ChoicePage::calculateNextEnabled() const
}
}
if ( m_config->installChoice() != InstallChoice::Manual && m_encryptWidget->isVisible() )
// You can have an invisible encryption checkbox, which is
// still checked -- then do the encryption.
if ( m_config->installChoice() != InstallChoice::Manual
&& ( m_encryptWidget->isVisible() || m_encryptWidget->isEncryptionCheckboxChecked() ) )
{
switch ( m_encryptWidget->state() )
{

View File

@@ -70,6 +70,18 @@ EncryptWidget::EncryptWidget( QWidget* parent )
CALAMARES_RETRANSLATE_SLOT( &EncryptWidget::retranslate );
}
bool
EncryptWidget::isEncryptionCheckboxChecked()
{
return m_ui->m_encryptCheckBox->isChecked();
}
void
EncryptWidget::setEncryptionCheckbox( bool preCheckEncrypt )
{
m_ui->m_encryptCheckBox->setChecked( preCheckEncrypt );
}
void
EncryptWidget::reset( bool checkVisible )
{
@@ -155,7 +167,8 @@ EncryptWidget::updateState( const bool notify )
else if ( m_filesystem == FileSystem::Zfs && p1.length() < ZFS_MIN_LENGTH )
{
applyPixmap( m_ui->m_iconLabel, Calamares::StatusError );
m_ui->m_iconLabel->setToolTip( tr( "Password must be a minimum of %1 characters.", "@tooltip" ).arg( ZFS_MIN_LENGTH ) );
m_ui->m_iconLabel->setToolTip(
tr( "Password must be a minimum of %1 characters.", "@tooltip" ).arg( ZFS_MIN_LENGTH ) );
}
else if ( p1 == p2 )
{
@@ -169,15 +182,10 @@ EncryptWidget::updateState( const bool notify )
}
}
Encryption newState = state();
if ( newState != m_state )
m_state = state();
if ( notify )
{
m_state = newState;
if ( notify )
{
Q_EMIT stateChanged( m_state );
}
Q_EMIT stateChanged( m_state );
}
}

View File

@@ -36,8 +36,10 @@ public:
explicit EncryptWidget( QWidget* parent = nullptr );
void setEncryptionCheckbox( bool preCheckEncrypt = false);
void reset( bool checkVisible = true );
bool isEncryptionCheckboxChecked();
Encryption state() const;
void setText( const QString& text );

View File

@@ -65,7 +65,8 @@ ScanningDialog::run( const QFuture< void >& future,
void
ScanningDialog::run( const QFuture< void >& future, const std::function< void() >& callback, QWidget* parent )
{
ScanningDialog::run( future, tr( "Scanning storage devices…", "@status" ), tr( "Partitioning…", "@status" ), callback, parent );
ScanningDialog::run(
future, tr( "Scanning storage devices…", "@status" ), tr( "Partitioning…", "@status" ), callback, parent );
}
void

View File

@@ -193,7 +193,7 @@ initialSwapChoice: none
# Default filesystem type, used when a "new" partition is made.
#
# When replacing a partition, the new filesystem type will be from the
# When replacing a partition, the new filesystem type will be from the
# defaultFileSystemType value. In other cases, e.g. Erase and Alongside,
# as well as when using manual partitioning and creating a new
# partition, this filesystem type is pre-selected. Note that
@@ -240,6 +240,11 @@ defaultFileSystemType: "ext4"
# If nothing is specified, LUKS is enabled in automated modes.
#enableLuksAutomatedPartitioning: true
# When enableLuksAutomatedPartitioning is true, this option will pre-check
# encryption checkbox. This option is only usefull to help people to not forget
# to cypher their disk when installing in enterprise (for exemple).
#preCheckEncryption: false
# Partition layout.
#
# This optional setting specifies a custom partition layout.
@@ -248,9 +253,9 @@ defaultFileSystemType: "ext4"
# for root that uses 100% of the space and uses the filesystem defined by
# defaultFileSystemType.
#
# Note: the EFI system partition is prepend automatically to the layout if
# needed; the swap partition is appended to the layout if enabled (small of
# suspend).
# Note: the EFI system partition is prepended automatically to the layout if
# needed; the swap partition is appended to the layout if enabled (selections
# "small" or "suspend" in *userSwapChoices*).
#
# Otherwise, the partition layout is defined as follow:
#

View File

@@ -34,6 +34,7 @@ properties:
luksGeneration: { type: string, enum: [luks1, luks2] } # Also allows "luks" as alias of "luks1"
enableLuksAutomatedPartitioning: { type: boolean, default: false }
preCheckEncryption: { type: boolean, default: false }
allowManualPartitioning: { type: boolean, default: true }
showNotEncryptedBootMessage: { type: boolean, default: true }

View File

@@ -14,6 +14,12 @@ include_directories(
${CMAKE_CURRENT_BINARY_DIR}
)
set(PartitionModule_basic_SRC
${PartitionModule_SOURCE_DIR}/core/OsproberEntry.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
)
calamares_add_test(
partitionjobtest
SOURCES
@@ -40,10 +46,9 @@ calamares_add_test(
partitioncreatelayoutstest
SOURCES
CreateLayoutsTests.cpp
${PartitionModule_basic_SRC}
${PartitionModule_SOURCE_DIR}/core/KPMHelpers.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionLayout.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp
LIBRARIES calamares::kpmcore Calamares::calamaresui
DEFINITIONS ${_partition_defs}
@@ -66,9 +71,8 @@ calamares_add_test(
partitionconfigtest
SOURCES
ConfigTests.cpp
${PartitionModule_basic_SRC}
${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
${PartitionModule_SOURCE_DIR}/Config.cpp
LIBRARIES calamares::kpmcore Calamares::calamaresui
DEFINITIONS

View File

@@ -9,6 +9,7 @@
#include "Config.h"
#include "core/OsproberEntry.h"
#include "core/PartUtils.h"
#include "GlobalStorage.h"
@@ -17,6 +18,7 @@
#include "utils/System.h"
#include "utils/Yaml.h"
#include <QByteArray>
#include <QObject>
#include <QtTest/QtTest>
@@ -35,6 +37,9 @@ private Q_SLOTS:
void testLegacySize();
void testAll();
void testWeirdConfig();
void testNormalFstab();
void testWeirdFstab();
};
ConfigTests::ConfigTests() = default;
@@ -222,6 +227,48 @@ ConfigTests::testWeirdConfig()
}
}
void
ConfigTests::testNormalFstab()
{
const auto contents
= QByteArrayLiteral( "# A FreeBSD fstab\n"
"/dev/nvd0p3 none swap sw 0 0\n" );
const auto entries = Calamares::fromEtcFstabContents( contents );
for ( const auto& e : entries )
{
QVERIFY( e.isValid() );
}
QCOMPARE( entries.count(), 1 );
}
void
ConfigTests::testWeirdFstab()
{
const auto contents
= QByteArrayLiteral( "# <file system> <mount point> <type> <options> <dump> <pass>\n"
"UUID=dae80d0a-f6c7-46f4-a04a-6761f2cfd9b6 / ext4 defaults,noatime 0 1\n"
"UUID=423892d5-a929-41a9-a846-f410cf3fe25b swap swap defaults,noatime 0 2\n"
"# another comment\n"
"borked 2\n"
"ok /dev1 ext4 none 0 0\n"
"bogus /dev2 ext4 none no later\n"
"# comment\n" );
const auto entries = Calamares::fromEtcFstabContents( contents );
QCOMPARE( entries.count(), 4 );
QStringList mountPoints;
for ( const auto& e : entries )
{
mountPoints.append( e.mountPoint );
}
mountPoints.sort();
QCOMPARE( mountPoints,
QStringList() << "/"
<< "/dev1"
<< "/dev2"
<< "swap" );
}
QTEST_GUILESS_MAIN( ConfigTests )

View File

@@ -51,6 +51,11 @@ DevicesTests::testKPMScanDevices()
cDebug() << "Getting devices via KPMCore";
CoreBackend* backend = CoreBackendManager::self()->backend();
#ifdef Q_OS_FREEBSD
QEXPECT_FAIL( "", "Test backend not expected on FreeBSD", Continue );
QVERIFY( backend );
return;
#endif
QVERIFY( backend );
auto devices = backend->scanDevices( ScanFlag( ~0 ) ); // These flags try to get "all"
cDebug() << Logger::SubEntry << "Done getting devices.";

View File

@@ -48,9 +48,7 @@ class PlymouthController:
def setTheme(self):
plymouth_theme = libcalamares.job.configuration["plymouth_theme"]
target_env_call(["sed", "-e", 's|^.*Theme=.*|Theme=' +
plymouth_theme + '|', "-i",
"/etc/plymouth/plymouthd.conf"])
target_env_call(["plymouth-set-default-theme", plymouth_theme])
def run(self):
if detect_plymouth():

View File

@@ -126,7 +126,7 @@ class RawFSItem:
config["source"], device))
self.source = os.path.realpath(config["source"])
# If source is a mount point, look for the actual device mounted on it
if os.path.ismount(self.source):
if os.path.ismount(self.source) and not libcalamares.job.configuration.get("bogus", False):
procmounts = open("/proc/mounts", "r")
for line in procmounts:
if self.source in line.split():
@@ -146,9 +146,10 @@ def update_global_storage(item, gs):
ret = subprocess.run(["blkid", "-s", "UUID", "-o", "value", item.destination],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
if ret.returncode == 0:
uuid = ret.stdout.rstrip()
libcalamares.utils.debug("Setting {} UUID to {}".format(item.destination,
ret.stdout.rstrip()))
gs[gs.index(partition)]["uuid"] = ret.stdout.rstrip()
uuid or "<empty>"))
gs[gs.index(partition)]["uuid"] = uuid
gs[gs.index(partition)]["source"] = item.source
libcalamares.globalstorage.remove("partitions")

View File

@@ -5,8 +5,10 @@
# Special cases for rawfs tests
#
# - On FreeBSD, /proc/mounts doesn't exist (/proc is only about processes,
# and is rarely used). Expect the test to fail.
# and is rarely used). The test would fail, except it catches that
# kind of error and ends up doing nothing.
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
set_tests_properties(load-rawfs-1 PROPERTIES WILL_FAIL TRUE)
# set_tests_properties(load-rawfs-1 PROPERTIES WILL_FAIL TRUE)
message(STATUS "rawfs tests are useless on FreeBSD")
endif()

Some files were not shown because too many files have changed in this diff Show More