[gems.arch] fix: not detecting some package replacements when upgrading due to conflict information having logic operators

This commit is contained in:
Vinicius Moreira
2022-10-25 17:36:28 -03:00
parent 361afb108b
commit 3d267ff3d1
3 changed files with 24 additions and 12 deletions

View File

@@ -9,6 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixes ### Fixes
- AppImage - 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) - 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 - GUI
- management panel not fully maximizing - management panel not fully maximizing

View File

@@ -2,7 +2,7 @@ import re
import traceback import traceback
from logging import Logger from logging import Logger
from threading import Thread 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.api.abstract.handler import ProcessWatcher
from bauh.gems.arch import pacman, message, sorting, confirmation from bauh.gems.arch import pacman, message, sorting, confirmation
@@ -14,12 +14,20 @@ from bauh.view.util.translation import I18n
class DependenciesAnalyser: class DependenciesAnalyser:
_re_dep_operator: Optional[Pattern] = None
def __init__(self, aur_client: AURClient, i18n: I18n, logger: Logger): def __init__(self, aur_client: AURClient, i18n: I18n, logger: Logger):
self.aur_client = aur_client self.aur_client = aur_client
self.i18n = i18n self.i18n = i18n
self.re_dep_operator = re.compile(r'([<>=]+)')
self._log = logger 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]]): def _fill_repository(self, name: str, output: List[Tuple[str, str]]):
repository = pacman.read_repository_from_info(name) repository = pacman.read_repository_from_info(name)
@@ -225,7 +233,7 @@ class DependenciesAnalyser:
raise Exception(f"Could not retrieve information from providers: " raise Exception(f"Could not retrieve information from providers: "
f"{', '.join(data_not_found)}") 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] version_required = split_informed_dep[2]
exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '==' exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '=='
@@ -237,7 +245,7 @@ class DependenciesAnalyser:
info = missing_providers_data[p] info = missing_providers_data[p]
for provided_exp in info['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: if len(split_dep) == 3 and split_dep[0] == dep_name:
version_provided = split_dep[2] version_provided = split_dep[2]
@@ -253,7 +261,7 @@ class DependenciesAnalyser:
return return
else: else:
for _, dep_data in self.aur_client.gen_updates_data((dep_name,)): 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] version_required = split_informed_dep[2]
exp_op = split_informed_dep[1].strip() exp_op = split_informed_dep[1].strip()
@@ -270,7 +278,7 @@ class DependenciesAnalyser:
if dep_name == dep_exp: if dep_name == dep_exp:
version_required, exp_op = None, None version_required, exp_op = None, None
else: 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] version_required = split_informed_dep[2]
exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '==' exp_op = split_informed_dep[1] if split_informed_dep[1] != '=' else '=='
@@ -405,7 +413,7 @@ class DependenciesAnalyser:
if dep in pkgs_data: if dep in pkgs_data:
continue continue
if dep not in provided_map: 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() dep_name = dep_split[0].strip()
if dep_name not in deps_checked: if dep_name not in deps_checked:

View File

@@ -149,12 +149,14 @@ class UpdatesSummarizer:
for p, data in context.pkgs_data.items(): for p, data in context.pkgs_data.items():
if data['c']: if data['c']:
for c in data['c']: for c in data['c']:
if c and c != p and c in context.installed_names: if c:
# source = provided_map[c] pkg_name = DependenciesAnalyser.re_dep_operator().split(c)[0]
root_conflict[c] = p 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(): if (p, pkg_name) in root_conflict.items():
mutual_conflicts[c] = p mutual_conflicts[pkg_name] = p
if mutual_conflicts: if mutual_conflicts:
for pkg1, pkg2 in mutual_conflicts.items(): for pkg1, pkg2 in mutual_conflicts.items():