From f37a77597798bfea39853bbb3812d629412e381d Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 19 Nov 2021 10:46:23 -0600 Subject: [PATCH 01/33] [zfs] Update module documentation --- src/modules/zfs/README.md | 3 +++ src/modules/zfs/zfs.conf | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/modules/zfs/README.md b/src/modules/zfs/README.md index 9138a0598..1d64e3a89 100644 --- a/src/modules/zfs/README.md +++ b/src/modules/zfs/README.md @@ -6,7 +6,10 @@ There are a few considerations to be aware of when enabling the zfs module * You must provide zfs kernel modules or kernel support on the ISO for the zfs module to function + * The zfs kernel module must be loaded prior to the partition module running + * One way to acheive this is by running `modprobe zfs` * Support for zfs in the partition module is conditional on the zfs module being enabled +* The config for the default pools and datasets is configured and described in modules/zfs.conf * If you use grub with zfs, you must have `ZPOOL_VDEV_NAME_PATH=1` in your environment when running grub-install or grub-mkconfig. * Calamares will ensure this happens during the bootloader module. * It will also add it to `/etc/environment` so it will be available in the installation diff --git a/src/modules/zfs/zfs.conf b/src/modules/zfs/zfs.conf index f2f8f52b0..e5a0aa348 100644 --- a/src/modules/zfs/zfs.conf +++ b/src/modules/zfs/zfs.conf @@ -10,6 +10,9 @@ poolName: zpcala # A list of options that will be passed to zpool create +# +# Encryption options should generally not be added here since they will be added by +# selecting the encrypt disk option in the partition module poolOptions: "-f -o ashift=12 -O mountpoint=none -O acltype=posixacl -O relatime=on" # A list of options that will be passed to zfs create when creating each dataset @@ -17,6 +20,10 @@ poolOptions: "-f -o ashift=12 -O mountpoint=none -O acltype=posixacl -O relatime datasetOptions: "-o compression=lz4 -o atime=off -o xattr=sa" # An array of datasets that will be created on the zpool mounted at / +# +# This default configuration is commonly used when support for booting more than one distro +# out of a single zpool is desired. If you decide to keep this default configuration, +# you should replace "distro" with an identifier that represents your distro. datasets: - dsName: ROOT mountpoint: none From ee032b43fec3383dc6d18ceeb8602a716028fa14 Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 19 Nov 2021 14:24:36 -0600 Subject: [PATCH 02/33] [zfs] Fix spelling error in readme --- src/modules/zfs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/zfs/README.md b/src/modules/zfs/README.md index 1d64e3a89..992fa5cb3 100644 --- a/src/modules/zfs/README.md +++ b/src/modules/zfs/README.md @@ -7,7 +7,7 @@ There are a few considerations to be aware of when enabling the zfs module * You must provide zfs kernel modules or kernel support on the ISO for the zfs module to function * The zfs kernel module must be loaded prior to the partition module running - * One way to acheive this is by running `modprobe zfs` + * One way to achieve this is by running `modprobe zfs` * Support for zfs in the partition module is conditional on the zfs module being enabled * The config for the default pools and datasets is configured and described in modules/zfs.conf * If you use grub with zfs, you must have `ZPOOL_VDEV_NAME_PATH=1` in your environment when running grub-install or grub-mkconfig. From fa10bb8dd35cf58d52c83b11e94e1aaeb28d0bae Mon Sep 17 00:00:00 2001 From: dalto Date: Thu, 25 Nov 2021 11:52:41 -0600 Subject: [PATCH 03/33] [packages] Add support for more pacman options --- src/modules/packages/main.py | 49 +++++++++++++++++++---- src/modules/packages/packages.conf | 16 ++++++++ src/modules/packages/packages.schema.yaml | 4 ++ 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 98faa9b63..3dd93576a 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -379,6 +379,7 @@ class PMPacman(PackageManager): def __init__(self): import re progress_match = re.compile("^\\((\\d+)/(\\d+)\\)") + def line_cb(line): if line.startswith(":: "): self.in_package_changes = "package changes" in line @@ -396,30 +397,64 @@ class PMPacman(PackageManager): self.in_package_changes = False self.line_cb = line_cb + self.pacman_num_retries = libcalamares.job.configuration.get("pacman_num_retries", 0) + self.pacman_disable_timeout = libcalamares.job.configuration.get("pacman_disable_download_timeout", False) + self.pacman_needed_only = libcalamares.job.configuration.get("pacman_needed_only", False) + def reset_progress(self): self.in_package_changes = False # These are globals self.progress_fraction = (completed_packages * 1.0 / total_packages) + def run_pacman(self, command): + # Call pacman in a loop until it is successful or the number of retries is exceeded + pacman_count = 0 + while pacman_count <= self.pacman_num_retries: + pacman_count += 1 + try: + libcalamares.utils.target_env_process_output(command, self.line_cb) + return + except subprocess.CalledProcessError: + if pacman_count <= self.pacman_num_retries: + pass + else: + raise + def install(self, pkgs, from_local=False): + command = ["pacman"] + if from_local: - pacman_flags = "-U" + command.append("-U") else: - pacman_flags = "-S" + command.append("-S") + + command.append("--noconfirm") + + if self.pacman_needed_only is True: + command.append("--needed") + + if self.pacman_disable_timeout is True: + command.append("--disable-download-timeout") + + command += pkgs + + self.run_pacman(command) self.reset_progress() - libcalamares.utils.target_env_process_output(["pacman", pacman_flags, - "--noconfirm"] + pkgs, self.line_cb) def remove(self, pkgs): self.reset_progress() - libcalamares.utils.target_env_process_output(["pacman", "-Rs", "--noconfirm"] + pkgs, self.line_cb) + self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs) def update_db(self): - check_target_env_call(["pacman", "-Sy"]) + self.run_pacman(["pacman", "-Sy"]) def update_system(self): - check_target_env_call(["pacman", "-Su", "--noconfirm"]) + command = ["pacman", "-Su", "--noconfirm"] + if self.pacman_disable_timeout is True: + command.append("--disable-download-timeout") + + self.run_pacman(command) class PMPamac(PackageManager): diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf index 49fdbb6d6..8d76060a0 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -62,6 +62,22 @@ skip_if_no_internet: false update_db: true update_system: false +# pacman specific options +# +# pacman_num_retries should be a positive integer which sepcifies the +# number of times the call to pacman will be retried in the event of a +# failure. If it is missing, it will be set to 0 +# +# pacman_disable_download_timeout is a boolean that, when true, includes +# the flag --disable-download-timeout on calls to pacman. When missing, +# false is assumed +# +# pacman_needed_only is a boolean that includes the pacman argument --needed +# when set to true. If missing, false is assumed +pacman_num_retries: 0 +pacman_disable_download_timeout: false +pacman_needed_only: false + # # List of maps with package operations such as install or remove. # Distro developers can provide a list of packages to remove diff --git a/src/modules/packages/packages.schema.yaml b/src/modules/packages/packages.schema.yaml index 989bf11dd..bc0a1f9ea 100644 --- a/src/modules/packages/packages.schema.yaml +++ b/src/modules/packages/packages.schema.yaml @@ -26,6 +26,10 @@ properties: update_system: { type: boolean, default: false } skip_if_no_internet: { type: boolean, default: false } + pacman_num_retries: { type: integer, default: 0 } + pacman_disable_download_timeout: { type: boolean, default: false } + pacman_needed_only: { type: boolean, default: false } + operations: type: array items: From e1e29780f2447f30e40e2c35711d2ddf6a3cb1ea Mon Sep 17 00:00:00 2001 From: dalto Date: Thu, 25 Nov 2021 15:55:22 -0600 Subject: [PATCH 04/33] [packages] Change callbacks --- src/modules/packages/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 3dd93576a..a0033cf4f 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -406,13 +406,13 @@ class PMPacman(PackageManager): # These are globals self.progress_fraction = (completed_packages * 1.0 / total_packages) - def run_pacman(self, command): + def run_pacman(self, command, callback=None): # Call pacman in a loop until it is successful or the number of retries is exceeded pacman_count = 0 while pacman_count <= self.pacman_num_retries: pacman_count += 1 try: - libcalamares.utils.target_env_process_output(command, self.line_cb) + libcalamares.utils.target_env_process_output(command, callback) return except subprocess.CalledProcessError: if pacman_count <= self.pacman_num_retries: @@ -438,13 +438,13 @@ class PMPacman(PackageManager): command += pkgs - self.run_pacman(command) + self.run_pacman(command, self.line_cb) self.reset_progress() def remove(self, pkgs): self.reset_progress() - self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs) + self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs, self.line_cb) def update_db(self): self.run_pacman(["pacman", "-Sy"]) @@ -454,7 +454,7 @@ class PMPacman(PackageManager): if self.pacman_disable_timeout is True: command.append("--disable-download-timeout") - self.run_pacman(command) + self.run_pacman(command, self.line_cb) class PMPamac(PackageManager): From c80b4ff4c2f7ecae7cbf46244187c3808e70c779 Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 26 Nov 2021 08:30:18 -0600 Subject: [PATCH 05/33] [packages] Make callback logic more sensible --- src/modules/packages/main.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index a0033cf4f..93f5dac94 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -406,13 +406,17 @@ class PMPacman(PackageManager): # These are globals self.progress_fraction = (completed_packages * 1.0 / total_packages) - def run_pacman(self, command, callback=None): + def run_pacman(self, command, callback=False): # Call pacman in a loop until it is successful or the number of retries is exceeded pacman_count = 0 while pacman_count <= self.pacman_num_retries: pacman_count += 1 try: - libcalamares.utils.target_env_process_output(command, callback) + if callback is True: + libcalamares.utils.target_env_process_output(command, self.line_cb) + else: + libcalamares.utils.target_env_process_output(command) + return except subprocess.CalledProcessError: if pacman_count <= self.pacman_num_retries: @@ -438,13 +442,13 @@ class PMPacman(PackageManager): command += pkgs - self.run_pacman(command, self.line_cb) + self.run_pacman(command, True) self.reset_progress() def remove(self, pkgs): self.reset_progress() - self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs, self.line_cb) + self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs, True) def update_db(self): self.run_pacman(["pacman", "-Sy"]) @@ -454,7 +458,7 @@ class PMPacman(PackageManager): if self.pacman_disable_timeout is True: command.append("--disable-download-timeout") - self.run_pacman(command, self.line_cb) + self.run_pacman(command, True) class PMPamac(PackageManager): From bb24ee1b3b5cff8ad4376d736be3553b2422872d Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 26 Nov 2021 10:56:32 -0600 Subject: [PATCH 06/33] [packages] Fix location of call to reset_progress() --- src/modules/packages/main.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 93f5dac94..688cf6340 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -442,9 +442,8 @@ class PMPacman(PackageManager): command += pkgs - self.run_pacman(command, True) - self.reset_progress() + self.run_pacman(command, True) def remove(self, pkgs): self.reset_progress() @@ -458,7 +457,7 @@ class PMPacman(PackageManager): if self.pacman_disable_timeout is True: command.append("--disable-download-timeout") - self.run_pacman(command, True) + self.run_pacman(command) class PMPamac(PackageManager): From df3e049e1c2969b5053d7098a6412b1dc838779b Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 26 Nov 2021 12:36:15 -0600 Subject: [PATCH 07/33] [fstab] Use different options for the btrfs swap subvolume --- src/modules/fstab/fstab.conf | 4 ++++ src/modules/fstab/fstab.schema.yaml | 1 + src/modules/fstab/main.py | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/modules/fstab/fstab.conf b/src/modules/fstab/fstab.conf index 385161d2d..c05f1929a 100644 --- a/src/modules/fstab/fstab.conf +++ b/src/modules/fstab/fstab.conf @@ -15,9 +15,13 @@ # With kernels 5.15 and newer be cautious of adding the option space_cache # to the btrfs mount options. The default in 5.15 changed to space_cache=v2. # If space_cache or space_cache=v1 are specified, it may fail to remount. +# +# btrfs_swap options are used when a swapfile is chosen with a btrfs root +# the options are applied to the subvolume which holds the swap partition mountOptions: default: defaults,noatime btrfs: defaults,noatime,autodefrag,compress=zstd + btrfs_swap: defaults,noatime # Mount options to use for the EFI System Partition. If not defined, the # *mountOptions* for *vfat* are used, or if that is not set either, diff --git a/src/modules/fstab/fstab.schema.yaml b/src/modules/fstab/fstab.schema.yaml index fc68fd2c5..087e82cac 100644 --- a/src/modules/fstab/fstab.schema.yaml +++ b/src/modules/fstab/fstab.schema.yaml @@ -22,6 +22,7 @@ properties: xfs: { type: string } swap: { type: string } btrfs: { type: string } + btrfs_swap: { type: string } efiMountOptions: { type: string } crypttabOptions: { type: string } required: [ mountOptions ] diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 3a2dbcf41..55e9b3dc6 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -236,7 +236,10 @@ class FstabGenerator(object): libcalamares.utils.debug("Ignoring foreign swap {!s} {!s}".format(disk_name, partition.get("uuid", None))) return None - options = self.get_mount_options(filesystem, mount_point) + if filesystem == "btrfs" and partition["subvol"] == "/@swap": + options = self.get_mount_options("btrfs_swap", mount_point) + else: + options = self.get_mount_options(filesystem, mount_point) if is_ssd: extra = self.ssd_extra_mount_options.get(filesystem) From 6b838bbf3dfa597e5b1a2f602ca1a5203334b33b Mon Sep 17 00:00:00 2001 From: dalto Date: Fri, 26 Nov 2021 13:00:30 -0600 Subject: [PATCH 08/33] [fstab] Add comment explaining logic --- src/modules/fstab/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 55e9b3dc6..261d3cadb 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -236,6 +236,7 @@ class FstabGenerator(object): libcalamares.utils.debug("Ignoring foreign swap {!s} {!s}".format(disk_name, partition.get("uuid", None))) return None + # If this is btrfs subvol a dedicated to a swapfile, use different options than a normal btrfs subvol if filesystem == "btrfs" and partition["subvol"] == "/@swap": options = self.get_mount_options("btrfs_swap", mount_point) else: From bd07db544f693168cb12463804dd1fa3ccbd522f Mon Sep 17 00:00:00 2001 From: dalto Date: Sun, 28 Nov 2021 15:56:16 -0600 Subject: [PATCH 09/33] [packages] Update doumentation for run_pacman() to be more complete --- src/modules/packages/main.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 688cf6340..7be143363 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -407,7 +407,13 @@ class PMPacman(PackageManager): self.progress_fraction = (completed_packages * 1.0 / total_packages) def run_pacman(self, command, callback=False): - # Call pacman in a loop until it is successful or the number of retries is exceeded + """ + Call pacman in a loop until it is successful or the number of retries is exceeded + :param command: The pacman command to run + :param callback: An optional boolean that indicates if this pacman run should use the callback + :return: + """ + pacman_count = 0 while pacman_count <= self.pacman_num_retries: pacman_count += 1 From 8a1e5d35fa1bada125c96bc73dbea07ea25825ae Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 11:59:09 +0100 Subject: [PATCH 10/33] [packages] Move pacman-options into their own key with subkeys --- src/modules/packages/main.py | 12 +++++++++--- src/modules/packages/packages.conf | 19 ++++++++++--------- src/modules/packages/packages.schema.yaml | 10 +++++++--- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 7be143363..518ff4907 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -397,9 +397,15 @@ class PMPacman(PackageManager): self.in_package_changes = False self.line_cb = line_cb - self.pacman_num_retries = libcalamares.job.configuration.get("pacman_num_retries", 0) - self.pacman_disable_timeout = libcalamares.job.configuration.get("pacman_disable_download_timeout", False) - self.pacman_needed_only = libcalamares.job.configuration.get("pacman_needed_only", False) + pacman = libcalamares.job.configuration.get("pacman", None) + if pacman is None: + pacman = dict() + if type(pacman) is not dict: + libcalamares.utils.warning("Job configuration *pacman* will be ignored.") + pacman = dict() + self.pacman_num_retries = pacman.get("pacman_num_retries", 0) + self.pacman_disable_timeout = pacman.get("pacman_disable_download_timeout", False) + self.pacman_needed_only = pacman.get("pacman_needed_only", False) def reset_progress(self): self.in_package_changes = False diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf index 8d76060a0..6e62f4b5f 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -64,19 +64,20 @@ update_system: false # pacman specific options # -# pacman_num_retries should be a positive integer which sepcifies the +# *num_retries* should be a positive integer which specifies the # number of times the call to pacman will be retried in the event of a -# failure. If it is missing, it will be set to 0 +# failure. If it is missing, it will be set to 0. # -# pacman_disable_download_timeout is a boolean that, when true, includes +# *disable_download_timeout* is a boolean that, when true, includes # the flag --disable-download-timeout on calls to pacman. When missing, -# false is assumed +# false is assumed. # -# pacman_needed_only is a boolean that includes the pacman argument --needed -# when set to true. If missing, false is assumed -pacman_num_retries: 0 -pacman_disable_download_timeout: false -pacman_needed_only: false +# *needed_only* is a boolean that includes the pacman argument --needed +# when set to true. If missing, false is assumed. +pacman: + num_retries: 0 + disable_download_timeout: false + needed_only: false # # List of maps with package operations such as install or remove. diff --git a/src/modules/packages/packages.schema.yaml b/src/modules/packages/packages.schema.yaml index bc0a1f9ea..d12f0507e 100644 --- a/src/modules/packages/packages.schema.yaml +++ b/src/modules/packages/packages.schema.yaml @@ -26,9 +26,13 @@ properties: update_system: { type: boolean, default: false } skip_if_no_internet: { type: boolean, default: false } - pacman_num_retries: { type: integer, default: 0 } - pacman_disable_download_timeout: { type: boolean, default: false } - pacman_needed_only: { type: boolean, default: false } + pacman: + additionalProperties: false + type: object + properties: + num_retries: { type: integer, default: 0 } + disable_download_timeout: { type: boolean, default: false } + needed_only: { type: boolean, default: false } operations: type: array From e9970474f5591e2c3c39531359ee4f3eac5a2721 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 12:22:02 +0100 Subject: [PATCH 11/33] [libcalamares] Allow Python to log an Error as well --- src/libcalamares/PythonJobApi.cpp | 15 +++++++++++++-- src/libcalamares/PythonJobApi.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index 1713569a4..b1ff536be 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -139,17 +139,28 @@ check_target_env_output( const bp::list& args, const std::string& stdin, int tim } static const char output_prefix[] = "[PYTHON JOB]:"; +static inline void +log_action( unsigned int level, const std::string& s ) +{ + Logger::CDebug( level ) << output_prefix << QString::fromStdString( s ); +} void debug( const std::string& s ) { - Logger::CDebug( Logger::LOGDEBUG ) << output_prefix << QString::fromStdString( s ); + log_action( Logger::LOGDEBUG, s ); } void warning( const std::string& s ) { - Logger::CDebug( Logger::LOGWARNING ) << output_prefix << QString::fromStdString( s ); + log_action( Logger::LOGWARNING, s ); +} + +void +error( const std::string& s ) +{ + log_action( Logger::LOGERROR, s ); } PythonJobInterface::PythonJobInterface( Calamares::PythonJob* parent ) diff --git a/src/libcalamares/PythonJobApi.h b/src/libcalamares/PythonJobApi.h index 48bd4f87c..0ecc43abd 100644 --- a/src/libcalamares/PythonJobApi.h +++ b/src/libcalamares/PythonJobApi.h @@ -60,6 +60,7 @@ boost::python::list gettext_languages(); void debug( const std::string& s ); void warning( const std::string& s ); +void error( const std::string& s ); class PythonJobInterface { From 7f643010b259017bc7af90186b3f25d7f6fade93 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 12:26:07 +0100 Subject: [PATCH 12/33] [libcalamares] Expose error() and warn() to Python --- src/libcalamares/PythonJob.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libcalamares/PythonJob.cpp b/src/libcalamares/PythonJob.cpp index afeebbe07..6176f0312 100644 --- a/src/libcalamares/PythonJob.cpp +++ b/src/libcalamares/PythonJob.cpp @@ -85,6 +85,12 @@ BOOST_PYTHON_MODULE( libcalamares ) &CalamaresPython::warning, bp::args( "s" ), "Writes the given string to the Calamares warning stream." ); + bp::def( "warn", + &CalamaresPython::warning, + bp::args( "s" ), + "Writes the given string to the Calamares warning stream." ); + bp::def( + "error", &CalamaresPython::warning, bp::args( "s" ), "Writes the given string to the Calamares error stream." ); bp::def( "mount", &CalamaresPython::mount, From fcbe8d3a3e6dae3de9c08eaf292b5c9093aac395 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 12:46:12 +0100 Subject: [PATCH 13/33] [libcalamares] API for YAML-loading from Python --- src/libcalamares/PythonJob.cpp | 11 ++++++++++- src/libcalamares/PythonJobApi.cpp | 8 ++++++++ src/libcalamares/PythonJobApi.h | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/libcalamares/PythonJob.cpp b/src/libcalamares/PythonJob.cpp index 6176f0312..291adbc54 100644 --- a/src/libcalamares/PythonJob.cpp +++ b/src/libcalamares/PythonJob.cpp @@ -79,6 +79,7 @@ BOOST_PYTHON_MODULE( libcalamares ) bp::scope utilsScope = utilsModule; Q_UNUSED( utilsScope ) + // .. Logging functions bp::def( "debug", &CalamaresPython::debug, bp::args( "s" ), "Writes the given string to the Calamares debug stream." ); bp::def( "warning", @@ -92,6 +93,11 @@ BOOST_PYTHON_MODULE( libcalamares ) bp::def( "error", &CalamaresPython::warning, bp::args( "s" ), "Writes the given string to the Calamares error stream." ); + + // .. YAML functions + bp::def( "load_yaml", &CalamaresPython::load_yaml, bp::args( "path" ), "Loads YAML from a file." ); + + // .. Filesystem functions bp::def( "mount", &CalamaresPython::mount, mount_overloads( bp::args( "device_path", "mount_point", "filesystem_name", "options" ), @@ -100,6 +106,8 @@ BOOST_PYTHON_MODULE( libcalamares ) "-1 = QProcess crash\n" "-2 = QProcess cannot start\n" "-3 = bad arguments" ) ); + + // .. Process functions bp::def( "target_env_call", static_cast< int ( * )( const std::string&, const std::string&, int ) >( &CalamaresPython::target_env_call ), @@ -158,6 +166,7 @@ BOOST_PYTHON_MODULE( libcalamares ) host_env_process_output_overloads( bp::args( "command", "callback", "stdin", "timeout" ), "Runs the specified command in the host system." ) ); + // .. String functions bp::def( "obscure", &CalamaresPython::obscure, bp::args( "s" ), @@ -166,7 +175,7 @@ BOOST_PYTHON_MODULE( libcalamares ) "Applying the function to a string obscured by this function will result " "in the original string." ); - + // .. Translation functions bp::def( "gettext_languages", &CalamaresPython::gettext_languages, "Returns list of languages (most to least-specific) for gettext." ); diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index b1ff536be..869bda81e 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -19,6 +19,7 @@ #include "utils/RAII.h" #include "utils/Runner.h" #include "utils/String.h" +#include "utils/Yaml.h" #include #include @@ -163,6 +164,13 @@ error( const std::string& s ) log_action( Logger::LOGERROR, s ); } +boost::python::dict +load_yaml( const std::string& path ) +{ + return variantMapToPyDict( CalamaresUtils::loadYaml( QString::fromStdString( path ) ) ); +} + + PythonJobInterface::PythonJobInterface( Calamares::PythonJob* parent ) : m_parent( parent ) { diff --git a/src/libcalamares/PythonJobApi.h b/src/libcalamares/PythonJobApi.h index 0ecc43abd..62346ceda 100644 --- a/src/libcalamares/PythonJobApi.h +++ b/src/libcalamares/PythonJobApi.h @@ -62,6 +62,11 @@ void debug( const std::string& s ); void warning( const std::string& s ); void error( const std::string& s ); +/** @brief Loads YAML and returns (nested) dicts representing it + * + */ +boost::python::dict load_yaml( const std::string& path ); + class PythonJobInterface { public: From 3e0c9ba0569eef55af35437cae9712a9030f4006 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 13:04:44 +0100 Subject: [PATCH 14/33] [packages] Expand tests with PM-specific bits --- src/modules/packages/tests/1.global | 3 +++ .../packages/{test.yaml => tests/2.job} | 0 src/modules/packages/tests/CMakeTests.txt | 13 +++++++++++ src/modules/packages/tests/test-pm-pacman.py | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 src/modules/packages/tests/1.global rename src/modules/packages/{test.yaml => tests/2.job} (100%) create mode 100644 src/modules/packages/tests/CMakeTests.txt create mode 100644 src/modules/packages/tests/test-pm-pacman.py diff --git a/src/modules/packages/tests/1.global b/src/modules/packages/tests/1.global new file mode 100644 index 000000000..ee06ccfe1 --- /dev/null +++ b/src/modules/packages/tests/1.global @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: no +# SPDX-License-Identifier: CC0-1.0 +rootMountPoint: /tmp diff --git a/src/modules/packages/test.yaml b/src/modules/packages/tests/2.job similarity index 100% rename from src/modules/packages/test.yaml rename to src/modules/packages/tests/2.job diff --git a/src/modules/packages/tests/CMakeTests.txt b/src/modules/packages/tests/CMakeTests.txt new file mode 100644 index 000000000..6e343533c --- /dev/null +++ b/src/modules/packages/tests/CMakeTests.txt @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: no +# SPDX-License-Identifier: CC0-1.0 +# +# We have tests to load (some) of the package-managers specifically, to +# test their configuration code and implementation. Those tests conventionally +# live in Python files here in the tests/ directory. Add them. +foreach(_pm pacman) + add_test( + NAME configure-packages-${_pm} + COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +endforeach() diff --git a/src/modules/packages/tests/test-pm-pacman.py b/src/modules/packages/tests/test-pm-pacman.py new file mode 100644 index 000000000..aa0df2f7e --- /dev/null +++ b/src/modules/packages/tests/test-pm-pacman.py @@ -0,0 +1,22 @@ +# 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.packages import main + +# .. we don't have a job in this test, so fake one +class Job(object): + def __init__(self): + self.configuration = libcalamares.utils.load_yaml("pm-pacman.yaml") +libcalamares.job = Job() + +# Specific PM test +p = main.PMPacman() +assert p.pacman_num_retries == 0 +assert p.pacman_disable_timeout == False +assert p.pacman_needed_only == False From 1260d3fcb9e67c6d59707fc21d8ebb01fb4bc820 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 13:21:50 +0100 Subject: [PATCH 15/33] [packages] Expand tests for PM-specifics more --- src/modules/packages/tests/CMakeTests.txt | 25 +++++++++++++------ src/modules/packages/tests/pm-pacman-1.yaml | 11 +++++++++ src/modules/packages/tests/pm-pacman-2.yaml | 10 ++++++++ src/modules/packages/tests/test-pm-pacman.py | 26 +++++++++++++++----- 4 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 src/modules/packages/tests/pm-pacman-1.yaml create mode 100644 src/modules/packages/tests/pm-pacman-2.yaml diff --git a/src/modules/packages/tests/CMakeTests.txt b/src/modules/packages/tests/CMakeTests.txt index 6e343533c..9ee9c6682 100644 --- a/src/modules/packages/tests/CMakeTests.txt +++ b/src/modules/packages/tests/CMakeTests.txt @@ -4,10 +4,21 @@ # We have tests to load (some) of the package-managers specifically, to # test their configuration code and implementation. Those tests conventionally # live in Python files here in the tests/ directory. Add them. -foreach(_pm pacman) - add_test( - NAME configure-packages-${_pm} - COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) -endforeach() + +# Pacman (Arch) tests +set(_pm pacman) +add_test( + NAME configure-packages-${_pm} + COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +add_test( + NAME configure-packages-${_pm}-ops-1 + COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py ${CMAKE_CURRENT_LIST_DIR}/pm-pacman-1.yaml 4 1 1 + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +add_test( + NAME configure-packages-${_pm}-ops-2 + COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py ${CMAKE_CURRENT_LIST_DIR}/pm-pacman-2.yaml 3 0 0 + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) diff --git a/src/modules/packages/tests/pm-pacman-1.yaml b/src/modules/packages/tests/pm-pacman-1.yaml new file mode 100644 index 000000000..1ad048b61 --- /dev/null +++ b/src/modules/packages/tests/pm-pacman-1.yaml @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: no +# SPDX-License-Identifier: CC0-1.0 +backend: pacman +rootMountPoint: /tmp/mount +operations: [] + +pacman: + num_retries: 4 + disable_timeout: yes + needed_only: true + diff --git a/src/modules/packages/tests/pm-pacman-2.yaml b/src/modules/packages/tests/pm-pacman-2.yaml new file mode 100644 index 000000000..2bbf70758 --- /dev/null +++ b/src/modules/packages/tests/pm-pacman-2.yaml @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: no +# SPDX-License-Identifier: CC0-1.0 +backend: pacman +rootMountPoint: /tmp/mount +operations: [] + +# Leave some things unspecified +pacman: + num_retries: 3 + diff --git a/src/modules/packages/tests/test-pm-pacman.py b/src/modules/packages/tests/test-pm-pacman.py index aa0df2f7e..f57e2a761 100644 --- a/src/modules/packages/tests/test-pm-pacman.py +++ b/src/modules/packages/tests/test-pm-pacman.py @@ -11,12 +11,26 @@ from src.modules.packages import main # .. we don't have a job in this test, so fake one class Job(object): - def __init__(self): - self.configuration = libcalamares.utils.load_yaml("pm-pacman.yaml") -libcalamares.job = Job() + def __init__(self, filename): + self.configuration = libcalamares.utils.load_yaml(filename) if filename is not None else dict() + +import sys +if len(sys.argv) > 4: + filename = sys.argv[1] + retry = int(sys.argv[2]) + timeout = bool(int(sys.argv[3])) + needed = bool(int(sys.argv[4])) +else: + filename = None + retry = 0 + timeout = False + needed = False + +libcalamares.utils.warning("Expecting {!s} retry={!s} timeout={!s} needed={!s}".format(filename, retry, timeout, needed)) # Specific PM test +libcalamares.job = Job(filename) p = main.PMPacman() -assert p.pacman_num_retries == 0 -assert p.pacman_disable_timeout == False -assert p.pacman_needed_only == False +assert p.pacman_num_retries == retry, "{!r} vs {!r}".format(p.pacman_num_retries, retry) +assert p.pacman_disable_timeout == timeout +assert p.pacman_needed_only == needed From 65488ca174b3cddeb6cba1a6eaca19e871bacb50 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:19:06 +0100 Subject: [PATCH 16/33] [libcalamares] More verbose when loading YAML for Python --- src/libcalamares/PythonJobApi.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index 869bda81e..bb2b8749e 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -167,7 +167,14 @@ error( const std::string& s ) boost::python::dict load_yaml( const std::string& path ) { - return variantMapToPyDict( CalamaresUtils::loadYaml( QString::fromStdString( path ) ) ); + const QString filePath = QString::fromStdString( path ); + bool ok = false; + auto map = CalamaresUtils::loadYaml( filePath, &ok ); + if ( !ok ) + { + cWarning() << "Loading YAML from" << filePath << "failed."; + } + return variantMapToPyDict( map ); } From 474aaf7603b2a3322735c6b96b71501be4cafb8e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:23:15 +0100 Subject: [PATCH 17/33] [packages] Fix loading of the subkeys for pacman --- src/modules/packages/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 518ff4907..10371777e 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -403,9 +403,9 @@ class PMPacman(PackageManager): if type(pacman) is not dict: libcalamares.utils.warning("Job configuration *pacman* will be ignored.") pacman = dict() - self.pacman_num_retries = pacman.get("pacman_num_retries", 0) - self.pacman_disable_timeout = pacman.get("pacman_disable_download_timeout", False) - self.pacman_needed_only = pacman.get("pacman_needed_only", False) + self.pacman_num_retries = pacman.get("num_retries", 0) + self.pacman_disable_timeout = pacman.get("disable_download_timeout", False) + self.pacman_needed_only = pacman.get("needed_only", False) def reset_progress(self): self.in_package_changes = False From 61e0d538e9f0b83f66b11f3c63d55b8495eb8ac2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:44:12 +0100 Subject: [PATCH 18/33] [packages] Be more explicit in test failures, fix test data --- src/modules/packages/tests/pm-pacman-1.yaml | 2 +- src/modules/packages/tests/test-pm-pacman.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/packages/tests/pm-pacman-1.yaml b/src/modules/packages/tests/pm-pacman-1.yaml index 1ad048b61..3fa75d481 100644 --- a/src/modules/packages/tests/pm-pacman-1.yaml +++ b/src/modules/packages/tests/pm-pacman-1.yaml @@ -6,6 +6,6 @@ operations: [] pacman: num_retries: 4 - disable_timeout: yes + disable_download_timeout: yes needed_only: true diff --git a/src/modules/packages/tests/test-pm-pacman.py b/src/modules/packages/tests/test-pm-pacman.py index f57e2a761..ee814b620 100644 --- a/src/modules/packages/tests/test-pm-pacman.py +++ b/src/modules/packages/tests/test-pm-pacman.py @@ -32,5 +32,5 @@ libcalamares.utils.warning("Expecting {!s} retry={!s} timeout={!s} needed={!s}". libcalamares.job = Job(filename) p = main.PMPacman() assert p.pacman_num_retries == retry, "{!r} vs {!r}".format(p.pacman_num_retries, retry) -assert p.pacman_disable_timeout == timeout -assert p.pacman_needed_only == needed +assert p.pacman_disable_timeout == timeout, "{!r} vs {!r}".format(p.pacman_disable_timeout, timeout) +assert p.pacman_needed_only == needed, "{!r} vs {!r}".format(p.pacman_needed_only, needed) From 864dcdb2c2c94f2d485510edb9a9384f5f624f85 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:45:30 +0100 Subject: [PATCH 19/33] FreeBSD: Calamares is in the official ports-tree already --- data/FreeBSD/Makefile | 37 ------- data/FreeBSD/distinfo | 3 - data/FreeBSD/pkg-descr | 14 --- data/FreeBSD/pkg-plist | 224 ----------------------------------------- 4 files changed, 278 deletions(-) delete mode 100644 data/FreeBSD/Makefile delete mode 100644 data/FreeBSD/distinfo delete mode 100644 data/FreeBSD/pkg-descr delete mode 100644 data/FreeBSD/pkg-plist diff --git a/data/FreeBSD/Makefile b/data/FreeBSD/Makefile deleted file mode 100644 index d9b7e5043..000000000 --- a/data/FreeBSD/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# $FreeBSD$ -# -# SPDX-FileCopyrightText: 2020 Adriaan de Groot -# SPDX-License-Identifier: BSD-2-Clause - -PORTNAME= calamares -DISTVERSION= 3.2.25 -CATEGORIES= sysutils -MASTER_SITES= https://github.com/${PORTNAME}/${PORTNAME}/releases/download/v${DISTVERSION}/ - -MAINTAINER= adridg@FreeBSD.org -COMMENT= GUI System installer and OEM configurator - -LICENSE= GPLv3 -LICENSE_FILE= ${WRKSRC}/LICENSE - -LIB_DEPENDS= libyaml-cpp.so:devel/yaml-cpp \ - libpwquality.so:security/libpwquality \ - libboost_python${PYTHON_SUFFIX}.so:devel/boost-python-libs - -USES= cmake compiler:c++17-lang gettext kde:5 pkgconfig \ - python:3.3+ qt:5 -USE_QT= concurrent core dbus declarative gui \ - network quickcontrols2 svg widgets xml \ - buildtools_build linguist_build qmake_build -USE_KDE= coreaddons dbusaddons parts service \ - ecm_build -USE_LDCONFIG= yes - -CMAKE_OFF= WITH_KF5Crash \ - INSTALL_CONFIG \ - INSTALL_COMPLETION \ - INSTALL_POLKIT -CMAKE_ON= CMAKE_DISABLE_FIND_PACKAGE_KPMcore -CMAKE_ARGS= -DSKIP_MODULES="webview" - -.include diff --git a/data/FreeBSD/distinfo b/data/FreeBSD/distinfo deleted file mode 100644 index e333963a8..000000000 --- a/data/FreeBSD/distinfo +++ /dev/null @@ -1,3 +0,0 @@ -TIMESTAMP = 1592339404 -SHA256 (calamares-3.2.25.tar.gz) = 797ce33db7d4e4c06bbccef95f6c4023f7628e91bd142896695565fed4ae8c4b -SIZE (calamares-3.2.25.tar.gz) = 3580197 diff --git a/data/FreeBSD/pkg-descr b/data/FreeBSD/pkg-descr deleted file mode 100644 index 39cb4335c..000000000 --- a/data/FreeBSD/pkg-descr +++ /dev/null @@ -1,14 +0,0 @@ -Calamares is an installer framework. By design it is very customizable, -in order to satisfy a wide variety of needs and use cases. - -Calamares aims to be easy, usable, beautiful, pragmatic, inclusive and -distribution-agnostic. - -Got a Linux distribution but no system installer? Grab Calamares, mix -and match any number of Calamares modules (or write your own in Python -or C++), throw together some branding, package it up and you are ready -to ship! - -(The above applies to FreeBSD as well) - -WWW: https://calamares.io/ diff --git a/data/FreeBSD/pkg-plist b/data/FreeBSD/pkg-plist deleted file mode 100644 index 7f588b7a9..000000000 --- a/data/FreeBSD/pkg-plist +++ /dev/null @@ -1,224 +0,0 @@ -bin/calamares -include/libcalamares/CalamaresConfig.h -include/libcalamares/CppJob.h -include/libcalamares/DllMacro.h -include/libcalamares/GlobalStorage.h -include/libcalamares/Job.h -include/libcalamares/JobExample.h -include/libcalamares/JobQueue.h -include/libcalamares/ProcessJob.h -include/libcalamares/PythonHelper.h -include/libcalamares/PythonJob.h -include/libcalamares/PythonJobApi.h -include/libcalamares/Settings.h -include/libcalamares/utils/BoostPython.h -include/libcalamares/utils/CalamaresUtilsSystem.h -include/libcalamares/utils/CommandList.h -include/libcalamares/utils/Dirs.h -include/libcalamares/utils/Entropy.h -include/libcalamares/utils/Logger.h -include/libcalamares/utils/NamedEnum.h -include/libcalamares/utils/NamedSuffix.h -include/libcalamares/utils/PluginFactory.h -include/libcalamares/utils/RAII.h -include/libcalamares/utils/Retranslator.h -include/libcalamares/utils/String.h -include/libcalamares/utils/Tests.h -include/libcalamares/utils/UMask.h -include/libcalamares/utils/Units.h -include/libcalamares/utils/Variant.h -include/libcalamares/utils/Yaml.h -include/libcalamares/utils/moc-warnings.h -lib/calamares/libcalamares.so -lib/calamares/modules/bootloader/main.py -lib/calamares/modules/bootloader/module.desc -lib/calamares/modules/bootloader/test.yaml -lib/calamares/modules/contextualprocess/libcalamares_job_contextualprocess.so -lib/calamares/modules/contextualprocess/module.desc -lib/calamares/modules/displaymanager/main.py -lib/calamares/modules/displaymanager/module.desc -lib/calamares/modules/dracut/main.py -lib/calamares/modules/dracut/module.desc -lib/calamares/modules/dracutlukscfg/libcalamares_job_dracutlukscfg.so -lib/calamares/modules/dracutlukscfg/module.desc -lib/calamares/modules/dummycpp/libcalamares_job_dummycpp.so -lib/calamares/modules/dummycpp/module.desc -lib/calamares/modules/dummyprocess/module.desc -lib/calamares/modules/dummypython/main.py -lib/calamares/modules/dummypython/module.desc -lib/calamares/modules/finished/libcalamares_viewmodule_finished.so -lib/calamares/modules/finished/module.desc -lib/calamares/modules/fstab/main.py -lib/calamares/modules/fstab/module.desc -lib/calamares/modules/fstab/test.yaml -lib/calamares/modules/grubcfg/main.py -lib/calamares/modules/grubcfg/module.desc -lib/calamares/modules/hostinfo/libcalamares_job_hostinfo.so -lib/calamares/modules/hostinfo/module.desc -lib/calamares/modules/hwclock/main.py -lib/calamares/modules/hwclock/module.desc -lib/calamares/modules/initcpio/libcalamares_job_initcpio.so -lib/calamares/modules/initcpio/module.desc -lib/calamares/modules/initcpiocfg/main.py -lib/calamares/modules/initcpiocfg/module.desc -lib/calamares/modules/initramfs/libcalamares_job_initramfs.so -lib/calamares/modules/initramfs/module.desc -lib/calamares/modules/initramfscfg/encrypt_hook -lib/calamares/modules/initramfscfg/encrypt_hook_nokey -lib/calamares/modules/initramfscfg/main.py -lib/calamares/modules/initramfscfg/module.desc -lib/calamares/modules/interactiveterminal/libcalamares_viewmodule_interactiveterminal.so -lib/calamares/modules/interactiveterminal/module.desc -lib/calamares/modules/keyboard/libcalamares_viewmodule_keyboard.so -lib/calamares/modules/keyboard/module.desc -lib/calamares/modules/keyboardq/libcalamares_viewmodule_keyboardq.so -lib/calamares/modules/keyboardq/module.desc -lib/calamares/modules/license/libcalamares_viewmodule_license.so -lib/calamares/modules/license/module.desc -lib/calamares/modules/locale/libcalamares_viewmodule_locale.so -lib/calamares/modules/locale/module.desc -lib/calamares/modules/localecfg/main.py -lib/calamares/modules/localecfg/module.desc -lib/calamares/modules/localeq/libcalamares_viewmodule_localeq.so -lib/calamares/modules/localeq/module.desc -lib/calamares/modules/luksbootkeyfile/libcalamares_job_luksbootkeyfile.so -lib/calamares/modules/luksbootkeyfile/module.desc -lib/calamares/modules/luksopenswaphookcfg/main.py -lib/calamares/modules/luksopenswaphookcfg/module.desc -lib/calamares/modules/machineid/libcalamares_job_machineid.so -lib/calamares/modules/machineid/module.desc -lib/calamares/modules/mount/main.py -lib/calamares/modules/mount/module.desc -lib/calamares/modules/mount/test.yaml -lib/calamares/modules/netinstall/libcalamares_viewmodule_netinstall.so -lib/calamares/modules/netinstall/module.desc -lib/calamares/modules/networkcfg/main.py -lib/calamares/modules/networkcfg/module.desc -lib/calamares/modules/notesqml/libcalamares_viewmodule_notesqml.so -lib/calamares/modules/notesqml/module.desc -lib/calamares/modules/oemid/libcalamares_viewmodule_oemid.so -lib/calamares/modules/oemid/module.desc -lib/calamares/modules/openrcdmcryptcfg/main.py -lib/calamares/modules/openrcdmcryptcfg/module.desc -lib/calamares/modules/packagechooser/libcalamares_viewmodule_packagechooser.so -lib/calamares/modules/packagechooser/module.desc -lib/calamares/modules/packages/main.py -lib/calamares/modules/packages/module.desc -lib/calamares/modules/packages/test.yaml -lib/calamares/modules/plymouthcfg/main.py -lib/calamares/modules/plymouthcfg/module.desc -lib/calamares/modules/preservefiles/libcalamares_job_preservefiles.so -lib/calamares/modules/preservefiles/module.desc -lib/calamares/modules/rawfs/main.py -lib/calamares/modules/rawfs/module.desc -lib/calamares/modules/removeuser/libcalamares_job_removeuser.so -lib/calamares/modules/removeuser/module.desc -lib/calamares/modules/services-openrc/main.py -lib/calamares/modules/services-openrc/module.desc -lib/calamares/modules/services-systemd/main.py -lib/calamares/modules/services-systemd/module.desc -lib/calamares/modules/shellprocess/libcalamares_job_shellprocess.so -lib/calamares/modules/shellprocess/module.desc -lib/calamares/modules/summary/libcalamares_viewmodule_summary.so -lib/calamares/modules/summary/module.desc -lib/calamares/modules/tracking/libcalamares_viewmodule_tracking.so -lib/calamares/modules/tracking/module.desc -lib/calamares/modules/umount/main.py -lib/calamares/modules/umount/module.desc -lib/calamares/modules/unpackfs/main.py -lib/calamares/modules/unpackfs/module.desc -lib/calamares/modules/unpackfs/runtests.sh -lib/calamares/modules/users/libcalamares_viewmodule_users.so -lib/calamares/modules/users/module.desc -lib/calamares/modules/welcome/libcalamares_viewmodule_welcome.so -lib/calamares/modules/welcome/module.desc -lib/calamares/modules/welcomeq/libcalamares_viewmodule_welcomeq.so -lib/calamares/modules/welcomeq/module.desc -lib/cmake/Calamares/CMakeColors.cmake -lib/cmake/Calamares/CalamaresAddBrandingSubdirectory.cmake -lib/cmake/Calamares/CalamaresAddLibrary.cmake -lib/cmake/Calamares/CalamaresAddModuleSubdirectory.cmake -lib/cmake/Calamares/CalamaresAddPlugin.cmake -lib/cmake/Calamares/CalamaresAddTest.cmake -lib/cmake/Calamares/CalamaresAddTranslations.cmake -lib/cmake/Calamares/CalamaresAutomoc.cmake -lib/cmake/Calamares/CalamaresConfig.cmake -lib/cmake/Calamares/CalamaresConfigVersion.cmake -lib/cmake/Calamares/CalamaresLibraryDepends-%%CMAKE_BUILD_TYPE%%.cmake -lib/cmake/Calamares/CalamaresLibraryDepends.cmake -lib/cmake/Calamares/CalamaresUse.cmake -lib/libcalamares.so -lib/libcalamares.so.3.2.25 -lib/libcalamaresui.so -lib/libcalamaresui.so.3.2.25 -man/man8/calamares.8.gz -share/applications/calamares.desktop -%%DATADIR%%/branding/default/banner.png -%%DATADIR%%/branding/default/branding.desc -%%DATADIR%%/branding/default/lang/calamares-default_ar.qm -%%DATADIR%%/branding/default/lang/calamares-default_en.qm -%%DATADIR%%/branding/default/lang/calamares-default_eo.qm -%%DATADIR%%/branding/default/lang/calamares-default_fr.qm -%%DATADIR%%/branding/default/lang/calamares-default_nl.qm -%%DATADIR%%/branding/default/languages.png -%%DATADIR%%/branding/default/show.qml -%%DATADIR%%/branding/default/squid.png -%%DATADIR%%/branding/default/stylesheet.qss -%%DATADIR%%/qml/calamares/slideshow/BackButton.qml -%%DATADIR%%/qml/calamares/slideshow/ForwardButton.qml -%%DATADIR%%/qml/calamares/slideshow/NavButton.qml -%%DATADIR%%/qml/calamares/slideshow/Presentation.qml -%%DATADIR%%/qml/calamares/slideshow/Slide.qml -%%DATADIR%%/qml/calamares/slideshow/SlideCounter.qml -%%DATADIR%%/qml/calamares/slideshow/qmldir -share/icons/hicolor/scalable/apps/calamares.svg -share/locale/ar/LC_MESSAGES/calamares-python.mo -share/locale/as/LC_MESSAGES/calamares-python.mo -share/locale/ast/LC_MESSAGES/calamares-python.mo -share/locale/be/LC_MESSAGES/calamares-python.mo -share/locale/bg/LC_MESSAGES/calamares-python.mo -share/locale/ca/LC_MESSAGES/calamares-python.mo -share/locale/cs_CZ/LC_MESSAGES/calamares-python.mo -share/locale/da/LC_MESSAGES/calamares-python.mo -share/locale/de/LC_MESSAGES/calamares-python.mo -share/locale/el/LC_MESSAGES/calamares-python.mo -share/locale/en_GB/LC_MESSAGES/calamares-python.mo -share/locale/eo/LC_MESSAGES/calamares-python.mo -share/locale/es/LC_MESSAGES/calamares-python.mo -share/locale/es_MX/LC_MESSAGES/calamares-python.mo -share/locale/es_PR/LC_MESSAGES/calamares-python.mo -share/locale/et/LC_MESSAGES/calamares-python.mo -share/locale/eu/LC_MESSAGES/calamares-python.mo -share/locale/fi_FI/LC_MESSAGES/calamares-python.mo -share/locale/fr/LC_MESSAGES/calamares-python.mo -share/locale/gl/LC_MESSAGES/calamares-python.mo -share/locale/he/LC_MESSAGES/calamares-python.mo -share/locale/hi/LC_MESSAGES/calamares-python.mo -share/locale/hr/LC_MESSAGES/calamares-python.mo -share/locale/hu/LC_MESSAGES/calamares-python.mo -share/locale/id/LC_MESSAGES/calamares-python.mo -share/locale/is/LC_MESSAGES/calamares-python.mo -share/locale/it_IT/LC_MESSAGES/calamares-python.mo -share/locale/ja/LC_MESSAGES/calamares-python.mo -share/locale/ko/LC_MESSAGES/calamares-python.mo -share/locale/lt/LC_MESSAGES/calamares-python.mo -share/locale/ml/LC_MESSAGES/calamares-python.mo -share/locale/mr/LC_MESSAGES/calamares-python.mo -share/locale/nb/LC_MESSAGES/calamares-python.mo -share/locale/nl/LC_MESSAGES/calamares-python.mo -share/locale/pl/LC_MESSAGES/calamares-python.mo -share/locale/pt_BR/LC_MESSAGES/calamares-python.mo -share/locale/pt_PT/LC_MESSAGES/calamares-python.mo -share/locale/ro/LC_MESSAGES/calamares-python.mo -share/locale/ru/LC_MESSAGES/calamares-python.mo -share/locale/sk/LC_MESSAGES/calamares-python.mo -share/locale/sl/LC_MESSAGES/calamares-python.mo -share/locale/sq/LC_MESSAGES/calamares-python.mo -share/locale/sr/LC_MESSAGES/calamares-python.mo -share/locale/sr@latin/LC_MESSAGES/calamares-python.mo -share/locale/sv/LC_MESSAGES/calamares-python.mo -share/locale/th/LC_MESSAGES/calamares-python.mo -share/locale/tr_TR/LC_MESSAGES/calamares-python.mo -share/locale/uk/LC_MESSAGES/calamares-python.mo -share/locale/zh_CN/LC_MESSAGES/calamares-python.mo -share/locale/zh_TW/LC_MESSAGES/calamares-python.mo From ec1b73be2bdeb230bc2bd6b2e0a87426a446d85c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:56:15 +0100 Subject: [PATCH 20/33] CMake: don't cmake in the source-directory (during development) --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 67bb1f319..bd4d3eb3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,9 @@ project( CALAMARES ) set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development +if( CALAMARES_VERSION_RC EQUAL 1 AND CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) + message( FATAL_ERROR "Do not build development versions in the source-directory." ) +endif() ### OPTIONS # From 28bd7370620ecf1d8ad6869df3149af63f3fa486 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 14:44:49 +0100 Subject: [PATCH 21/33] [packages] Validate test-configs, too - The config-files has a typo, so didn't validate, so the loaded data was wrong, leading to test-failures. See 61e0d538e9f0b83f66b11f3c63d55b8495eb8ac2 . --- src/modules/packages/tests/CMakeTests.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/modules/packages/tests/CMakeTests.txt b/src/modules/packages/tests/CMakeTests.txt index 9ee9c6682..4f7d6185f 100644 --- a/src/modules/packages/tests/CMakeTests.txt +++ b/src/modules/packages/tests/CMakeTests.txt @@ -22,3 +22,21 @@ add_test( COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-pm-${_pm}.py ${CMAKE_CURRENT_LIST_DIR}/pm-pacman-2.yaml 3 0 0 WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) + +if ( BUILD_TESTING AND BUILD_SCHEMA_TESTING AND PYTHONINTERP_FOUND AND PYTHON_EXECUTABLE ) + set( _module packages ) + set( _schema_file "${CMAKE_CURRENT_SOURCE_DIR}/${_module}/${_module}.schema.yaml" ) + message(STATUS "Schema ${_schema_file}") + foreach( _cf pm-pacman-1.yaml pm-pacman-2.yaml ) + set( _conf_file "${CMAKE_CURRENT_SOURCE_DIR}/${_module}/tests/${_cf}" ) + if ( EXISTS "${_schema_file}" AND EXISTS "${_conf_file}" ) + add_test( + NAME validate-packages-${_cf} + COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/ci/configvalidator.py" "${_schema_file}" "${_conf_file}" + ) + else() + message(FATAL_ERROR "Missing ${_conf_file}") + endif() + endforeach() +endif() + From dfd13b4948596b11fd5c77827b3fb5b3a5be1072 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 15:02:05 +0100 Subject: [PATCH 22/33] [packages] Remove bad config-lines - rootMountPoint is a global thing, not a job-configuration item --- src/modules/packages/tests/2.job | 1 - src/modules/packages/tests/pm-pacman-1.yaml | 1 - src/modules/packages/tests/pm-pacman-2.yaml | 1 - 3 files changed, 3 deletions(-) diff --git a/src/modules/packages/tests/2.job b/src/modules/packages/tests/2.job index 130214dfd..ba205ed44 100644 --- a/src/modules/packages/tests/2.job +++ b/src/modules/packages/tests/2.job @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: no # SPDX-License-Identifier: CC0-1.0 backend: dummy -rootMountPoint: /tmp/mount operations: - install: - pre-script: touch /tmp/foo diff --git a/src/modules/packages/tests/pm-pacman-1.yaml b/src/modules/packages/tests/pm-pacman-1.yaml index 3fa75d481..e876bd0fe 100644 --- a/src/modules/packages/tests/pm-pacman-1.yaml +++ b/src/modules/packages/tests/pm-pacman-1.yaml @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: no # SPDX-License-Identifier: CC0-1.0 backend: pacman -rootMountPoint: /tmp/mount operations: [] pacman: diff --git a/src/modules/packages/tests/pm-pacman-2.yaml b/src/modules/packages/tests/pm-pacman-2.yaml index 2bbf70758..8b0bda397 100644 --- a/src/modules/packages/tests/pm-pacman-2.yaml +++ b/src/modules/packages/tests/pm-pacman-2.yaml @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: no # SPDX-License-Identifier: CC0-1.0 backend: pacman -rootMountPoint: /tmp/mount operations: [] # Leave some things unspecified From 7cea1cb56ee90baefa9b6a2518f28a7b69e245d2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 17:06:10 +0100 Subject: [PATCH 23/33] Changes: document fstab --- CHANGES-3.2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES-3.2 b/CHANGES-3.2 index c2b0416da..9f60e0ab8 100644 --- a/CHANGES-3.2 +++ b/CHANGES-3.2 @@ -20,6 +20,9 @@ This release contains contributions from (alphabetically by first name): This may be the most useful for test-scripts. ## Modules ## + - *fstab* now has a separate, special, flags-setting for swap subvolumes + on btrfs. A swap subvolume is created if a swap **file** (not a separate + partition) is selected in the auto-partitioning page. (Thanks Evan) - The *packages* module now has some special settings for the `pacman` package manager (generally used on Arch-derivatives). This allows tweaking of the installation process, if downloads are slow or From 3845e058346c3a9cef65d8f96e726746b81aa748 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 29 Nov 2021 22:03:51 +0100 Subject: [PATCH 24/33] [locale] Correct timezone 5.0 / 5.5 Timezones 5.0 and 5.5 have considerable overlap; clear up most of it. Since a pixel is about 55x55km on the ground, and the translation of latitude and longitude is sketchy at best, accuracy on this timezone map is not very good. FIXES #1832 --- src/modules/locale/images/timezone_5.0.png | Bin 15918 -> 15043 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/modules/locale/images/timezone_5.0.png b/src/modules/locale/images/timezone_5.0.png index e8ea14466a852dc81a104b69da9da34f6103c5ab..a15aaccc09ddb9fdd6491ac3aab70342d72da645 100644 GIT binary patch literal 15043 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 literal 15918 zcmch8bySqy_b>0OqLhd<5+c&w4FUqv62s6bIdnHjDj^Ee-Q69-5DH3n!_eIfUH2J$ z-+O=G-&((Q|GDcfam_sQoW0LJ`|PvN*`Krb=l6=zSm-3^C@3gcGVk81prAa!L_zsW z?FlOI%V*)HU%}H@D1Lz` zD3`!bej6w#&TJ?sTLvg70`Vv)gm%e|%0j>kR3ka*w7@e z|Gy;X*nuxXw=!?V)ZC_b=bYWt%-YKjqu&?5$*8U;I9mv;Z|d#kr==7RbmNFhcw&F{ z@+bZH63b8Kcb~qZ>~_!W)(y|q>DJY0v(B`8ab`GK#MQp1YQ1SHT~B;1&taE(&CWaE z-jDMT1?514Xf<)%q**^$38pyl-~3KAl*x%J#x(cf``cO zZ`fvqiKLoLo&oAXL1}vfj1SPvgEr*HGfcQD+v|Vc9B{XNoe!8o{{95j|1aRnK zi&6cS^N9~fwktxAJ-WTq2tVxg*&`1S6Xaced$cp@&F;8_{T6=qX@){rS((%JdsxPc z5He)bAO3B6`e~Njwh@ROqV;b#v==A4q8B0|o1T|n9DQ>KG{ACC1%ZYKzaDi+-c%n% z+zN;EZcN!`)*V;}(-Q=W80+wD0qh%pUc+<0Q8OoeqI)$$C}6+4)c^B*mq?;FIE zx3t054T@4pd4SjdC>F*4qXF=Qa-bVPIo2HV=iy0k6Q9 z`7heEJ!|YQ^MqF@*-s+5`7bj18)DuQKEwRSu>N#;KROgR4N>sGmpMoMw!xhBml@k5 z5-_&Z9czyr?ypqHMJgoQ#@5a3{R3Lcrtzrkw9YHjk#*!uGf^sp73+9{i7y*y(@OP5 z#}*G&{^|vn5eH-Q3?JNxcl!qwNeH4$U-w*y1VQLrJ6&Z_JI!fPM{bKHXstV4 zype*@b%7U7s9^%oqmU~?QI#N`q#T@x-xc#0ERN5=6bc_1Q*CuSAt zE`1`Yd!TYoIQ{YWHuf9;e){7NiIDLuIES}(kel7a1j|~ z*2U*cvYf!_>ax> ze>04$PiOWR)HBj72wUz#lWh~PW=wHZ2^&{Bq@ zAb;lLi4~hjt+W==GsHC9Dez(WFR&KxcJ#)5Oj_D&fBOg#Nj!Cl6>JqeFxH z-Hg76`AiqbLuCN#tI@Trny&j`Cbo6^JuIwrPME;5>^CoZzvQjDUZqolYNv(7PMEtO z`alp2H1_;jOw;&4@G$Av^*qLkZa@U*Dte1ii~?W($(8EbP<+~V9rO#&UC@-q9D}dc zJl&mcl|%!hLyXarf82MA+&r#;)6TSEc9>6h??%e!wZ7kaL7vBJWu>~&?p(Kpn+i8D zn5A<@G5gByMg)IT@mK`?QIv_?@jx)F;T*I%-ra$}8Elib)~wpOmwZvw!~20e45sd7 ze@h_`KOWc`Pv2f!$J74~{{m0fSdCjYS&!cs{mt7GjfV6`)6qV--b~Vb7BmB&rU`r* z32F&hgb1!I-Hi{L^zqT_Lfok-m*2I=q*F7-x)JWuv60F*XpFt`Z9X5<&SSvWjlYXs z{JQ4v0q$H3EZGckx>`!&YQo)CJ)`A{9o&76 z{i6hoWh4c3=;yMsX;|gi`)NAX$~J#OAeYx%_~@x=NJ+7l_85b=18bYXQ~%@g z({a{G9{kiFE|y|~*4JUqSEJcw({#GtlD9wb2zW)Wu1990m+m@k4-$WbBW-Dyndns= zO%j->H}0*oJS-nWQ?H_SE%bU5`cMKSH`p}|Ey%NSj^irT?Ba-W&7~-Jwu+G2v%Nxv(RLLFp}B3u!Z2 zXcV8X^$7;`38k<8b)lCMJjq$!D)p|pEY2}=BwF?RDFIXp+xkk-d26P?8Y!P!s|ObM z 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 av@>C`budfX6CyzlLPk>YZK=3{|NjC@PL Date: Wed, 1 Dec 2021 23:06:02 +0100 Subject: [PATCH 25/33] [mount] Experimental: accept 'no' for subvolumes If there is no subvolume set, skip creation of that subvolume. This allows root to be on a bare FS, without a tag or subvolume name. To achieve this, use subvolume: no (no quotes there) in the YAML. --- src/modules/mount/main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/mount/main.py b/src/modules/mount/main.py index 900342e6d..f186b0d26 100644 --- a/src/modules/mount/main.py +++ b/src/modules/mount/main.py @@ -191,6 +191,8 @@ def mount_partition(root_mount_point, partition, partitions): libcalamares.globalstorage.insert("btrfsSubvolumes", btrfs_subvolumes) # Create the subvolumes that are in the completed list for s in btrfs_subvolumes: + if not s["subvolume"]: + continue subprocess.check_call(["btrfs", "subvolume", "create", root_mount_point + s["subvolume"]]) if s["mountPoint"] == "/": From 96ccf256b207fa3f41dae816d31b4686b492ec1c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Dec 2021 22:02:14 +0100 Subject: [PATCH 26/33] [mount] Add documentation to the config file --- src/modules/mount/mount.conf | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/modules/mount/mount.conf b/src/modules/mount/mount.conf index 6168e97cc..84dca05a7 100644 --- a/src/modules/mount/mount.conf +++ b/src/modules/mount/mount.conf @@ -42,15 +42,24 @@ extraMountsEfi: mountPoint: /sys/firmware/efi/efivars # Btrfs subvolumes to create if root filesystem is on btrfs volume. -# If mountpoint is mounted already to another partition, it is ignored. +# If *mountpoint* is mounted already to another partition, it is ignored. # Separate subvolume for swapfile is handled separately and automatically. +# +# It is possible to prevent subvolume creation -- this is likely only relevant +# for the root (/) subvolume -- by giving an empty string as a subvolume +# name. In this case no subvolume will be created. When using snapper as +# a rollback mechanism, it is recommended to **not** create a subvolume +# for root. btrfsSubvolumes: - mountPoint: / subvolume: /@ + # As an alternative: + # + # subvolume: "" - mountPoint: /home subvolume: /@home - mountPoint: /var/cache subvolume: /@cache - mountPoint: /var/log - subvolume: /@log \ No newline at end of file + subvolume: /@log From f26c81700d7c34b5411038acd245ef797f95fdd6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 2 Dec 2021 22:08:17 +0100 Subject: [PATCH 27/33] [fstab] Suppress empty subvol= options in fstab --- src/modules/fstab/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 261d3cadb..426761453 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -258,7 +258,8 @@ class FstabGenerator(object): if mount_point == "/": self.root_is_ssd = is_ssd - if filesystem == "btrfs" and "subvol" in partition: + # If there's a set-and-not-empty subvolume set, add it + if filesystem == "btrfs" and partition.get("subvol",None): options = "subvol={},".format(partition["subvol"]) + options if has_luks: From 209c48d67f6e1f85542adf0f2c679f1341133c92 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Fri, 3 Dec 2021 23:30:27 +0100 Subject: [PATCH 28/33] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_pt_BR.ts | 10 +++++----- lang/calamares_pt_PT.ts | 8 ++++---- lang/calamares_ru.ts | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lang/calamares_pt_BR.ts b/lang/calamares_pt_BR.ts index 435f398e4..517a84b3a 100644 --- a/lang/calamares_pt_BR.ts +++ b/lang/calamares_pt_BR.ts @@ -689,27 +689,27 @@ O instalador será fechado e todas as alterações serão perdidas. Successfully unmounted %1. - + %1 desmontado com sucesso. Successfully disabled swap %1. - + Swap %1 desativada com sucesso. Successfully cleared swap %1. - + Swap %1 limpa com sucesso. Successfully closed mapper device %1. - + Dispositivo de mapeamento %1 fechado com sucesso. Successfully disabled volume group %1. - + Grupo de volume %1 desativado com sucesso. diff --git a/lang/calamares_pt_PT.ts b/lang/calamares_pt_PT.ts index dbbc088a9..951645ab1 100644 --- a/lang/calamares_pt_PT.ts +++ b/lang/calamares_pt_PT.ts @@ -789,7 +789,7 @@ O instalador será encerrado e todas as alterações serão perdidas. The system language will be set to %1. - A linguagem do sistema será definida para %1. + O idioma do sistema será definido para %1. @@ -1684,7 +1684,7 @@ O instalador será encerrado e todas as alterações serão perdidas. Collecting information about your machine. - A recolher informação acerca da sua máquina. + A recolher informação sobre a sua máquina. @@ -3988,7 +3988,7 @@ Saída de Dados: %1 support - %1 suporte + Suporte do %1 @@ -3998,7 +3998,7 @@ Saída de Dados: About %1 installer - Acerca %1 instalador + Acerca do instalador %1 diff --git a/lang/calamares_ru.ts b/lang/calamares_ru.ts index 712662224..c722e2359 100644 --- a/lang/calamares_ru.ts +++ b/lang/calamares_ru.ts @@ -189,7 +189,7 @@ Run command '%1' in target system. - Запустить комманду'%1'в целевой системе. + Запустить команду '%1' в целевой системе. @@ -274,10 +274,10 @@ (%n second(s)) - (% секунда) - (% секунд) - (% секунд) + (%n секунда) + (%n секунды) (%n секунд) + (%n секунд(ы)) @@ -2673,7 +2673,7 @@ The installer will quit and all changes will be lost. EFI system - Система EFI + Системный раздел EFI From 0178fe6782af7ea8afcda931822e986e1cb3350b Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Fri, 3 Dec 2021 23:30:27 +0100 Subject: [PATCH 29/33] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calamares.desktop b/calamares.desktop index 761a7db01..bfe3955b1 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -236,7 +236,7 @@ Comment[es_MX]=Calamares - Instalador del sistema Name[pt_PT]=Instalar Sistema Icon[pt_PT]=calamares GenericName[pt_PT]=Instalador de Sistema -Comment[pt_PT]=Calamares - Instalador de Sistema +Comment[pt_PT]=Instalador de Sistema - Calamares Name[tr_TR]=Sistemi Yükle Icon[tr_TR]=calamares GenericName[tr_TR]=Sistem Yükleyici From 5b767e147decb1d6180b27340f07780b0c747652 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Fri, 3 Dec 2021 23:30:28 +0100 Subject: [PATCH 30/33] i18n: [python] Automatic merge of Transifex translations --- lang/python/pt_BR/LC_MESSAGES/python.po | 4 +++- lang/python/vi/LC_MESSAGES/python.po | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lang/python/pt_BR/LC_MESSAGES/python.po b/lang/python/pt_BR/LC_MESSAGES/python.po index d3cf730a0..f8f3e8ca7 100644 --- a/lang/python/pt_BR/LC_MESSAGES/python.po +++ b/lang/python/pt_BR/LC_MESSAGES/python.po @@ -330,7 +330,7 @@ msgstr "Não é possível habilitar o alvo {name!s} do systemd." #: src/modules/services-systemd/main.py:67 msgid "Cannot enable systemd timer {name!s}." -msgstr "" +msgstr "Não foi possível ativar o cronômetro systemd {name!s}." #: src/modules/services-systemd/main.py:71 msgid "Cannot disable systemd target {name!s}." @@ -410,6 +410,8 @@ msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed." msgstr "" +"Não foi possível encontrar o unsquashfs, certifique-se de que o pacote " +"squashfs-tools foi instalado." #: src/modules/unpackfs/main.py:479 msgid "The destination \"{}\" in the target system is not a directory" diff --git a/lang/python/vi/LC_MESSAGES/python.po b/lang/python/vi/LC_MESSAGES/python.po index 83928edd6..900b99454 100644 --- a/lang/python/vi/LC_MESSAGES/python.po +++ b/lang/python/vi/LC_MESSAGES/python.po @@ -5,6 +5,7 @@ # # Translators: # T. Tran , 2020 +# Th1nhhdk, 2021 # #, fuzzy msgid "" @@ -13,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-02 15:45+0100\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: T. Tran , 2020\n" +"Last-Translator: Th1nhhdk, 2021\n" "Language-Team: Vietnamese (https://www.transifex.com/calamares/teams/20061/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -61,13 +62,15 @@ msgstr "Đang cài đặt bộ khởi động." #: src/modules/bootloader/main.py:508 msgid "Bootloader installation error" -msgstr "" +msgstr "Lỗi cài đặt trình khởi động(bootloader)" #: src/modules/bootloader/main.py:509 msgid "" "The bootloader could not be installed. The installation command " "
{!s}
returned error code {!s}." msgstr "" +"Trình khởi động(bootloader) không thể được cài đặt. Lệnh cài đặt " +"
{!s}
đã trả mã lỗi {!s}." #: src/modules/fstab/main.py:29 msgid "Writing fstab." From 5277892e4f9a4bc0d0b098ff3b526e3421cc6a02 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 3 Dec 2021 23:47:16 +0100 Subject: [PATCH 31/33] Changes: pre-release housekeeping --- CHANGES-3.2 | 5 ++++- CMakeLists.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES-3.2 b/CHANGES-3.2 index 9f60e0ab8..baaf261d4 100644 --- a/CHANGES-3.2 +++ b/CHANGES-3.2 @@ -7,7 +7,7 @@ contributors are listed. Note that Calamares does not have a historical changelog -- this log starts with version 3.2.0. The release notes on the website will have to do for older versions. -# 3.2.48 (unreleased) # +# 3.2.48 (2021-12-03) # This release contains contributions from (alphabetically by first name): - Evan James @@ -23,6 +23,9 @@ This release contains contributions from (alphabetically by first name): - *fstab* now has a separate, special, flags-setting for swap subvolumes on btrfs. A swap subvolume is created if a swap **file** (not a separate partition) is selected in the auto-partitioning page. (Thanks Evan) + - When using btrfs, the *mount* module creates subvolumes. It was not + possible to **avoid** having a subvolume name created for the root. + This is now possible. #1837 - The *packages* module now has some special settings for the `pacman` package manager (generally used on Arch-derivatives). This allows tweaking of the installation process, if downloads are slow or diff --git a/CMakeLists.txt b/CMakeLists.txt index bd4d3eb3a..c998d43d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ project( CALAMARES LANGUAGES C CXX ) -set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development +set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development if( CALAMARES_VERSION_RC EQUAL 1 AND CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) message( FATAL_ERROR "Do not build development versions in the source-directory." ) endif() From c22bbea5281d65674ad271ee95dea05d6f24600a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 4 Dec 2021 02:04:24 +0100 Subject: [PATCH 32/33] [packages] Fix tests; YAML interpretation of 'yes' is not a bool --- src/modules/packages/tests/pm-pacman-1.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/packages/tests/pm-pacman-1.yaml b/src/modules/packages/tests/pm-pacman-1.yaml index e876bd0fe..aeb5b8625 100644 --- a/src/modules/packages/tests/pm-pacman-1.yaml +++ b/src/modules/packages/tests/pm-pacman-1.yaml @@ -5,6 +5,6 @@ operations: [] pacman: num_retries: 4 - disable_download_timeout: yes + disable_download_timeout: true needed_only: true From ceb9ec4115e9038b1faa0869fe4d1e6c1034f008 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 4 Dec 2021 02:15:33 +0100 Subject: [PATCH 33/33] [fstab] Avoid KeyError when no subvol is set (from dalto8) --- src/modules/fstab/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 426761453..6a771a24b 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -237,7 +237,7 @@ class FstabGenerator(object): return None # If this is btrfs subvol a dedicated to a swapfile, use different options than a normal btrfs subvol - if filesystem == "btrfs" and partition["subvol"] == "/@swap": + if filesystem == "btrfs" and partition.get("subvol", None) == "/@swap": options = self.get_mount_options("btrfs_swap", mount_point) else: options = self.get_mount_options(filesystem, mount_point)