diff --git a/CHANGELOG.md b/CHANGELOG.md index 48b321a1..6676c69b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixes - Arch + - not stopping the upgrade process if a transaction error happens - wrong dialog titles + ## [0.9.0] - 2020-04-15 ### Features diff --git a/bauh/commons/system.py b/bauh/commons/system.py index d2e67220..20eb0aff 100644 --- a/bauh/commons/system.py +++ b/bauh/commons/system.py @@ -65,7 +65,7 @@ class SimpleProcess: def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None, global_interpreter: bool = USE_GLOBAL_INTERPRETER, lang: str = DEFAULT_LANG, root_password: str = None, - extra_paths: Set[str] = None): + extra_paths: Set[str] = None, error_phrases: Set[str] = None): pwdin, final_cmd = None, [] if root_password is not None: @@ -76,6 +76,7 @@ class SimpleProcess: self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin, extra_paths=extra_paths) self.expected_code = expected_code + self.error_phrases = error_phrases def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None, extra_paths: Set[str] = None) -> subprocess.Popen: @@ -175,8 +176,18 @@ class ProcessHandler: self._notify_watcher(line) + proc.instance.wait() output.seek(0) - return proc.instance.returncode == proc.expected_code, output.read() + + success = proc.instance.returncode == proc.expected_code, + string_output = output.read() + + if proc.error_phrases: + for phrase in proc.error_phrases: + if phrase in string_output: + success = False + break + return success, string_output def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False, print_error: bool = True, diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 3a8b744f..ef4ed038 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -741,7 +741,7 @@ class ArchManager(SoftwareManager): disk.save_several(repo_pkgs_names, repo_map=repo_map, overwrite=True, maintainer=None) else: - self.logger.error("'pacman' returned an unexpected response after upgrading the repository packages") + self.logger.error("'pacman' returned an unexpected response or error phrase after upgrading the repository packages") return False except: watcher.change_substatus('') diff --git a/bauh/gems/arch/pacman.py b/bauh/gems/arch/pacman.py index df85427e..9a8c2d3b 100644 --- a/bauh/gems/arch/pacman.py +++ b/bauh/gems/arch/pacman.py @@ -141,7 +141,10 @@ def install_as_process(pkgpaths: Iterable[str], root_password: str, file: bool, else: cmd = ['pacman', '-S', *pkgpaths, '--noconfirm'] # pkgpath = pkgname - return SimpleProcess(cmd=cmd, root_password=root_password, cwd=pkgdir) + return SimpleProcess(cmd=cmd, + root_password=root_password, + cwd=pkgdir, + error_phrases={"error: failed to prepare transaction"}) def list_desktop_entries(pkgnames: Set[str]) -> List[str]: @@ -692,7 +695,9 @@ def list_installed_names() -> Set[str]: def upgrade_several(pkgnames: Iterable[str], root_password: str) -> SimpleProcess: - return SimpleProcess(cmd=['pacman', '-S', *pkgnames, '--noconfirm'], root_password=root_password) + return SimpleProcess(cmd=['pacman', '-S', *pkgnames, '--noconfirm'], + root_password=root_password, + error_phrases={'error: failed to prepare transaction'}) def remove_several(pkgnames: Iterable[str], root_password: str) -> SystemProcess: