From fa10bb8dd35cf58d52c83b11e94e1aaeb28d0bae Mon Sep 17 00:00:00 2001 From: dalto Date: Thu, 25 Nov 2021 11:52:41 -0600 Subject: [PATCH 1/5] [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 2/5] [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 3/5] [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 4/5] [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 bd07db544f693168cb12463804dd1fa3ccbd522f Mon Sep 17 00:00:00 2001 From: dalto Date: Sun, 28 Nov 2021 15:56:16 -0600 Subject: [PATCH 5/5] [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