diff --git a/CHANGELOG.md b/CHANGELOG.md index ba8147dc..7cb96018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixes - AppImage - some desktop entries not being displayed on the desktop environment menu (requires the AppImage to be reinstalled) [#287](https://github.com/vinifmor/bauh/issues/287) +- Arch + - not detecting some package replacements when upgrading due to conflict information having logic operators (e.g: `at-spi2-core: 2.44.1 -> 2.46.0` should replace the installed `at-spi2-atk: 2.38`) - GUI - management panel not fully maximizing diff --git a/bauh/gems/arch/dependencies.py b/bauh/gems/arch/dependencies.py index fe4d4164..f84ff783 100644 --- a/bauh/gems/arch/dependencies.py +++ b/bauh/gems/arch/dependencies.py @@ -2,7 +2,7 @@ import re import traceback from logging import Logger from threading import Thread -from typing import Set, List, Tuple, Dict, Iterable, Optional, Generator +from typing import Set, List, Tuple, Dict, Iterable, Optional, Generator, Pattern from bauh.api.abstract.handler import ProcessWatcher from bauh.gems.arch import pacman, message, sorting, confirmation @@ -14,12 +14,20 @@ from bauh.view.util.translation import I18n class DependenciesAnalyser: + _re_dep_operator: Optional[Pattern] = None + def __init__(self, aur_client: AURClient, i18n: I18n, logger: Logger): self.aur_client = aur_client self.i18n = i18n - self.re_dep_operator = re.compile(r'([<>=]+)') self._log = logger + @classmethod + def re_dep_operator(cls) -> Pattern: + if not cls._re_dep_operator: + cls._re_dep_operator = re.compile(r'([<>=]+)') + + return cls._re_dep_operator + def _fill_repository(self, name: str, output: List[Tuple[str, str]]): repository = pacman.read_repository_from_info(name) @@ -225,7 +233,7 @@ class DependenciesAnalyser: raise Exception(f"Could not retrieve information from providers: " f"{', '.join(data_not_found)}") - split_informed_dep = self.re_dep_operator.split(dep_exp) + split_informed_dep = self.re_dep_operator().split(dep_exp) version_required = split_informed_dep[2] exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '==' @@ -237,7 +245,7 @@ class DependenciesAnalyser: info = missing_providers_data[p] for provided_exp in info['p']: - split_dep = self.re_dep_operator.split(provided_exp) + split_dep = self.re_dep_operator().split(provided_exp) if len(split_dep) == 3 and split_dep[0] == dep_name: version_provided = split_dep[2] @@ -253,7 +261,7 @@ class DependenciesAnalyser: return else: for _, dep_data in self.aur_client.gen_updates_data((dep_name,)): - split_informed_dep = self.re_dep_operator.split(dep_exp) + split_informed_dep = self.re_dep_operator().split(dep_exp) version_required = split_informed_dep[2] exp_op = split_informed_dep[1].strip() @@ -270,7 +278,7 @@ class DependenciesAnalyser: if dep_name == dep_exp: version_required, exp_op = None, None else: - split_informed_dep = self.re_dep_operator.split(dep_exp) + split_informed_dep = self.re_dep_operator().split(dep_exp) version_required = split_informed_dep[2] exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '==' @@ -405,7 +413,7 @@ class DependenciesAnalyser: if dep in pkgs_data: continue if dep not in provided_map: - dep_split = self.re_dep_operator.split(dep) + dep_split = self.re_dep_operator().split(dep) dep_name = dep_split[0].strip() if dep_name not in deps_checked: diff --git a/bauh/gems/arch/updates.py b/bauh/gems/arch/updates.py index e4c55844..75f77425 100644 --- a/bauh/gems/arch/updates.py +++ b/bauh/gems/arch/updates.py @@ -149,12 +149,14 @@ class UpdatesSummarizer: for p, data in context.pkgs_data.items(): if data['c']: for c in data['c']: - if c and c != p and c in context.installed_names: - # source = provided_map[c] - root_conflict[c] = p + if c: + pkg_name = DependenciesAnalyser.re_dep_operator().split(c)[0] + if pkg_name != p and pkg_name in context.installed_names: + # source = provided_map[c] + root_conflict[pkg_name] = p - if (p, c) in root_conflict.items(): - mutual_conflicts[c] = p + if (p, pkg_name) in root_conflict.items(): + mutual_conflicts[pkg_name] = p if mutual_conflicts: for pkg1, pkg2 in mutual_conflicts.items():