From 157ec0e2c6a5f97d472ea6d42d29e6dca7cf989a Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Tue, 2 Jun 2020 17:54:08 -0300 Subject: [PATCH] [improvement][arch] new 'automatch_providers' settings --- CHANGELOG.md | 7 ++++ README.md | 1 + bauh/gems/arch/config.py | 3 +- bauh/gems/arch/controller.py | 8 +++++ bauh/gems/arch/dependencies.py | 39 +++++++++++++++------ bauh/gems/arch/resources/locale/ca | 2 ++ bauh/gems/arch/resources/locale/de | 2 ++ bauh/gems/arch/resources/locale/en | 2 ++ bauh/gems/arch/resources/locale/es | 2 ++ bauh/gems/arch/resources/locale/it | 2 ++ bauh/gems/arch/resources/locale/pt | 2 ++ bauh/gems/arch/resources/locale/ru | 2 ++ bauh/gems/arch/resources/locale/tr | 2 ++ bauh/gems/arch/updates.py | 3 +- pictures/releases/0.9.5/arch_providers.png | Bin 0 -> 20717 bytes 15 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 pictures/releases/0.9.5/arch_providers.png diff --git a/CHANGELOG.md b/CHANGELOG.md index de14e879..2ce7e9f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [0.9.5] 2020 ### Improvements +- Arch + - new **automatch_providers** settings: bauh will automatically choose which provider will be used for a package dependency when both names are equal. +

+ +

+ - minor UI improvements - download clients parameters + ### Fixes - regressions (from **0.9.4**) - resetting the main configuration when tray mode is active [#118](https://github.com/vinifmor/bauh/issues/118) diff --git a/README.md b/README.md index 74a70996..c3522458 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,7 @@ mirrors_sort_limit: 5 # defines the maximum number of mirrors that will be used aur: true # allows to manage AUR packages repositories: true # allows to manage packages from the configured repositories repositories_mthread_download: true # enable multi-threaded download for repository packages if aria2 is installed +automatch_providers: true # if a possible provider for a given package dependency exactly matches its name, it will be chosen instead of asking for the user to decide (false). ``` - Required dependencies: - **pacman** diff --git a/bauh/gems/arch/config.py b/bauh/gems/arch/config.py index c40674d3..2c511bc3 100644 --- a/bauh/gems/arch/config.py +++ b/bauh/gems/arch/config.py @@ -11,5 +11,6 @@ def read_config(update_file: bool = False) -> dict: "refresh_mirrors_startup": False, "sync_databases_startup": True, 'mirrors_sort_limit': 5, - 'repositories_mthread_download': True} + 'repositories_mthread_download': True, + 'automatch_providers': True} return read(CONFIG_FILE, template, update_file=update_file) diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 5423ffa8..c9766c3c 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -1514,6 +1514,7 @@ class ArchManager(SoftwareManager): sort=True, remote_provided_map=context.get_remote_provided_map(), remote_repo_map=context.get_remote_repo_map(), + automatch_providers=context.config['automatch_providers'], watcher=context.watcher) tf = time.time() @@ -1615,6 +1616,7 @@ class ArchManager(SoftwareManager): watcher=context.watcher, remote_provided_map=remote_provided_map, remote_repo_map=remote_repo_map, + automatch_providers=context.config['automatch_providers'], sort=False) if missing_deps is None: @@ -2122,6 +2124,11 @@ class ArchManager(SoftwareManager): tooltip_key='arch.config.optimize.tip', value=bool(local_config['optimize']), max_width=max_width), + self._gen_bool_selector(id_='autoprovs', + label_key='arch.config.automatch_providers', + tooltip_key='arch.config.automatch_providers.tip', + value=bool(local_config['automatch_providers']), + max_width=max_width), self._gen_bool_selector(id_='mthread_download', label_key='arch.config.pacman_mthread_download', tooltip_key='arch.config.pacman_mthread_download.tip', @@ -2167,6 +2174,7 @@ class ArchManager(SoftwareManager): config['refresh_mirrors_startup'] = form_install.get_component('ref_mirs').get_selected() config['mirrors_sort_limit'] = form_install.get_component('mirrors_sort_limit').get_int_value() config['repositories_mthread_download'] = form_install.get_component('mthread_download').get_selected() + config['automatch_providers'] = form_install.get_component('autoprovs').get_selected() try: save_config(config, CONFIG_FILE) diff --git a/bauh/gems/arch/dependencies.py b/bauh/gems/arch/dependencies.py index ed4ee018..24404504 100644 --- a/bauh/gems/arch/dependencies.py +++ b/bauh/gems/arch/dependencies.py @@ -178,7 +178,8 @@ class DependenciesAnalyser: def _fill_missing_dep(self, dep_name: str, dep_exp: str, aur_index: Iterable[str], missing_deps: Set[Tuple[str, str]], remote_provided_map: Dict[str, Set[str]], remote_repo_map: Dict[str, str], - repo_deps: Set[str], aur_deps: Set[str], deps_data: Dict[str, dict], watcher: ProcessWatcher): + repo_deps: Set[str], aur_deps: Set[str], deps_data: Dict[str, dict], watcher: ProcessWatcher, + automatch_providers: bool): if dep_name == dep_exp: providers = remote_provided_map.get(dep_name) @@ -222,7 +223,16 @@ class DependenciesAnalyser: if providers: if len(providers) > 1: - dep_data = (dep_name, '__several__') + dep_data = None + + if automatch_providers: + exact_matches = [p for p in providers if p == dep_name] + + if exact_matches: + dep_data = (exact_matches[0], remote_repo_map.get(exact_matches[0])) + + if not dep_data: + dep_data = (dep_name, '__several__') else: real_name = providers.pop() dep_data = (real_name, remote_repo_map.get(real_name)) @@ -246,7 +256,8 @@ class DependenciesAnalyser: def map_missing_deps(self, pkgs_data: Dict[str, dict], provided_map: Dict[str, Set[str]], remote_provided_map: Dict[str, Set[str]], remote_repo_map: Dict[str, str], aur_index: Iterable[str], deps_checked: Set[str], deps_data: Dict[str, dict], - sort: bool, watcher: ProcessWatcher, choose_providers: bool = True) -> List[Tuple[str, str]]: + sort: bool, watcher: ProcessWatcher, choose_providers: bool = True, + automatch_providers: bool = False) -> List[Tuple[str, str]]: sorted_deps = [] # it will hold the proper order to install the missing dependencies missing_deps, repo_missing, aur_missing = set(), set(), set() @@ -271,7 +282,8 @@ class DependenciesAnalyser: remote_provided_map=remote_provided_map, remote_repo_map=remote_repo_map, repo_deps=repo_missing, aur_deps=aur_missing, watcher=watcher, - deps_data=deps_data) + deps_data=deps_data, + automatch_providers=automatch_providers) else: version_pattern = '{}='.format(dep_name) version_found = [p for p in provided_map if p.startswith(version_pattern)] @@ -297,7 +309,8 @@ class DependenciesAnalyser: remote_repo_map=remote_repo_map, repo_deps=repo_missing, aur_deps=aur_missing, watcher=watcher, - deps_data=deps_data) + deps_data=deps_data, + automatch_providers=automatch_providers) else: self._fill_missing_dep(dep_name=dep_name, dep_exp=dep, aur_index=aur_index, missing_deps=missing_deps, @@ -305,7 +318,8 @@ class DependenciesAnalyser: remote_repo_map=remote_repo_map, repo_deps=repo_missing, aur_deps=aur_missing, watcher=watcher, - deps_data=deps_data) + deps_data=deps_data, + automatch_providers=automatch_providers) if missing_deps: if repo_missing: @@ -339,6 +353,7 @@ class DependenciesAnalyser: watcher=watcher, remote_provided_map=remote_provided_map, remote_repo_map=remote_repo_map, + automatch_providers=automatch_providers, choose_providers=False) if missing_subdeps: @@ -353,7 +368,8 @@ class DependenciesAnalyser: return self.fill_providers_deps(missing_deps=sorted_deps, provided_map=provided_map, remote_provided_map=remote_provided_map, remote_repo_map=remote_repo_map, watcher=watcher, sort=sort, already_checked=deps_checked, - aur_idx=aur_index, deps_data=deps_data) + aur_idx=aur_index, deps_data=deps_data, + automatch_providers=automatch_providers) return sorted_deps @@ -361,7 +377,7 @@ class DependenciesAnalyser: provided_map: Dict[str, Set[str]], remote_repo_map: Dict[str, str], already_checked: Set[str], remote_provided_map: Dict[str, Set[str]], deps_data: Dict[str, dict], aur_idx: Iterable[str], sort: bool, - watcher: ProcessWatcher) -> List[Tuple[str, str]]: + watcher: ProcessWatcher, automatch_providers: bool) -> List[Tuple[str, str]]: """ :param missing_deps: :param provided_map: @@ -372,6 +388,7 @@ class DependenciesAnalyser: :param aur_idx: :param sort: :param watcher: + :param automatch_providers :return: all deps sorted or None if the user declined the providers options """ @@ -404,7 +421,8 @@ class DependenciesAnalyser: remote_provided_map=remote_provided_map, remote_repo_map=remote_repo_map, watcher=watcher, - choose_providers=True) + choose_providers=True, + automatch_providers=automatch_providers) # cleaning the already mapped providers deps: to_remove = [] @@ -427,7 +445,8 @@ class DependenciesAnalyser: if not self.fill_providers_deps(missing_deps=missing_deps, provided_map=provided_map, remote_repo_map=remote_repo_map, already_checked=already_checked, aur_idx=aur_idx, remote_provided_map=remote_provided_map, - deps_data=deps_data, sort=False, watcher=watcher): + deps_data=deps_data, sort=False, watcher=watcher, + automatch_providers=automatch_providers): return if sort: diff --git a/bauh/gems/arch/resources/locale/ca b/bauh/gems/arch/resources/locale/ca index b6d7882b..7f114f37 100644 --- a/bauh/gems/arch/resources/locale/ca +++ b/bauh/gems/arch/resources/locale/ca @@ -22,6 +22,8 @@ arch.checking.missing_deps=Verificació de les dependències que falten de {} arch.clone=S’està clonant el dipòsit {} de l’AUR arch.config.aur=AUR packages arch.config.aur.tip=It allows to manage AUR packages +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Elimina les versions antigues arch.config.clean_cache.tip=Si cal eliminar les versions antigues d'un paquet emmagatzemat al disc durant la desinstal·lació arch.config.mirrors_sort_limit=Mirrors sort limit diff --git a/bauh/gems/arch/resources/locale/de b/bauh/gems/arch/resources/locale/de index f67865a0..3f556069 100644 --- a/bauh/gems/arch/resources/locale/de +++ b/bauh/gems/arch/resources/locale/de @@ -22,6 +22,8 @@ arch.checking.missing_deps=Überprüfen der fehlenden Abhängigkeiten von {} arch.clone=AUR Repository {} wird kopiert arch.config.aur=AUR packages arch.config.aur.tip=It allows to manage AUR packages +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Remove old versions arch.config.clean_cache.tip=Whether old versions of a package stored on disk should be removed during uninstall arch.config.mirrors_sort_limit=Mirrors sort limit diff --git a/bauh/gems/arch/resources/locale/en b/bauh/gems/arch/resources/locale/en index 59fa52f5..e50f16c5 100644 --- a/bauh/gems/arch/resources/locale/en +++ b/bauh/gems/arch/resources/locale/en @@ -22,6 +22,8 @@ arch.checking.missing_deps=Verifying missing dependencies of {} arch.clone=Cloning the AUR repository {} arch.config.aur=AUR packages arch.config.aur.tip=It allows to manage AUR packages +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Remove old versions arch.config.clean_cache.tip=Whether old versions of a package stored on disk should be removed during uninstall arch.config.mirrors_sort_limit=Mirrors sort limit diff --git a/bauh/gems/arch/resources/locale/es b/bauh/gems/arch/resources/locale/es index 1c912e65..62ddba54 100644 --- a/bauh/gems/arch/resources/locale/es +++ b/bauh/gems/arch/resources/locale/es @@ -22,6 +22,8 @@ arch.checking.missing_deps=Verificando las dependencias faltantes de {} arch.clone=Clonando el repositorio {} de AUR arch.config.aur=Paquetes de AUR arch.config.aur.tip=Permite gestionar paquetes del AUR +arch.config.automatch_providers=Autodefinir proveedores de dependencia +arch.config.automatch_providers.tip=Elige automáticamente qué proveedor se usará para una dependencia de paquete cuando ambos nombres son iguales. arch.config.clean_cache=Eliminar versiones antiguas arch.config.clean_cache.tip=Si las versiones antiguas de un paquete almacenado en el disco deben ser eliminadas durante la desinstalación arch.config.mirrors_sort_limit=Límite de ordenación de espejos diff --git a/bauh/gems/arch/resources/locale/it b/bauh/gems/arch/resources/locale/it index 12df9b7f..ec76bfa3 100644 --- a/bauh/gems/arch/resources/locale/it +++ b/bauh/gems/arch/resources/locale/it @@ -22,6 +22,8 @@ arch.checking.missing_deps=Verifica delle dipendenze mancanti di {} arch.clone=Clonazione del repository AUR {} arch.config.aur=AUR packages arch.config.aur.tip=It allows to manage AUR packages +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Rimuovi le vecchie versioni arch.config.clean_cache.tip=Se le vecchie versioni di un pacchetto memorizzate sul disco devono essere rimosse durante la disinstallazione arch.config.mirrors_sort_limit=Mirrors sort limit diff --git a/bauh/gems/arch/resources/locale/pt b/bauh/gems/arch/resources/locale/pt index d817da5e..0c80cfcb 100644 --- a/bauh/gems/arch/resources/locale/pt +++ b/bauh/gems/arch/resources/locale/pt @@ -22,6 +22,8 @@ arch.checking.missing_deps=Verificando dependências ausentes de {} arch.clone=Clonando o repositório {} do AUR arch.config.aur=Pacotes do AUR arch.config.aur.tip=Permite gerenciar pacotes dos AUR +arch.config.automatch_providers=Auto-definir provedores de dependências +arch.config.automatch_providers.tip=Escolhe automaticamente qual provedor será utilizado para determinada dependência de um pacote caso os nomes de ambos sejam iguais. arch.config.clean_cache=Remover versões antigas arch.config.clean_cache.tip=Se versões antigas de um pacote armazenadas em disco devem ser removidas durante a desinstalação arch.config.mirrors_sort_limit=Limite de ordenação de espelhos diff --git a/bauh/gems/arch/resources/locale/ru b/bauh/gems/arch/resources/locale/ru index cdf5eeac..67d9b0f8 100644 --- a/bauh/gems/arch/resources/locale/ru +++ b/bauh/gems/arch/resources/locale/ru @@ -22,6 +22,8 @@ arch.checking.missing_deps=Проверка отсутствующих зави arch.clone=Клонирование AUR-репозитория {} arch.config.aur=пакеты AUR arch.config.aur.tip=Это позволяет управлять пакетами AUR +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Remove old versions arch.config.clean_cache.tip=Whether old versions of a package stored on disk should be removed during uninstall arch.config.mirrors_sort_limit=Ограничение сортировки зеркал diff --git a/bauh/gems/arch/resources/locale/tr b/bauh/gems/arch/resources/locale/tr index 98b2d95e..3fec7930 100644 --- a/bauh/gems/arch/resources/locale/tr +++ b/bauh/gems/arch/resources/locale/tr @@ -22,6 +22,8 @@ arch.checking.missing_deps={} eksik bağımlılıkları kontrol ediliyor arch.clone=AUR deposu kopyalanıyor {} arch.config.aur=AUR paketleri arch.config.aur.tip=AUR paketlerinin yönetilmesine izin verir +arch.config.automatch_providers=Auto-define dependency providers +arch.config.automatch_providers.tip=It automatically chooses which provider will be used for a package dependency when both names are equal. arch.config.clean_cache=Önbelleği temizle arch.config.clean_cache.tip=Disk üzerinde kurulu bir paketin eski sürümlerinin kaldırma sırasında kaldırılıp kaldırılmayacağı arch.config.mirrors_sort_limit=Yansı sıralama sınırı diff --git a/bauh/gems/arch/updates.py b/bauh/gems/arch/updates.py index 7819b59c..9a6a8ad7 100644 --- a/bauh/gems/arch/updates.py +++ b/bauh/gems/arch/updates.py @@ -253,7 +253,8 @@ class UpdatesSummarizer: deps_data=deps_data, remote_provided_map=context.remote_provided_map, remote_repo_map=context.remote_repo_map, - watcher=self.watcher) + watcher=self.watcher, + automatch_providers=context.arch_config['automatch_providers']) if deps is None: tf = time.time() diff --git a/pictures/releases/0.9.5/arch_providers.png b/pictures/releases/0.9.5/arch_providers.png new file mode 100644 index 0000000000000000000000000000000000000000..fca8674598829aa778d40363de1ba97fea4cd902 GIT binary patch literal 20717 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 literal 0 HcmV?d00001