From 12b7acc5591a6f16d826b141bfc1dc85e56d9cd0 Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Wed, 12 Aug 2020 10:28:00 -0300 Subject: [PATCH] [flatpak] fix -> installation fails when there are multiple references for a given package --- CHANGELOG.md | 4 +++ bauh/commons/system.py | 12 +++++++-- bauh/gems/flatpak/controller.py | 31 ++++++++++++++++++++--- bauh/gems/flatpak/flatpak.py | 7 ++--- bauh/gems/flatpak/resources/locale/ca | 2 ++ bauh/gems/flatpak/resources/locale/de | 2 ++ bauh/gems/flatpak/resources/locale/en | 2 ++ bauh/gems/flatpak/resources/locale/es | 2 ++ bauh/gems/flatpak/resources/locale/it | 2 ++ bauh/gems/flatpak/resources/locale/pt | 2 ++ bauh/gems/flatpak/resources/locale/ru | 2 ++ bauh/gems/flatpak/resources/locale/tr | 2 ++ pictures/releases/0.9.7/flatpak_refs.png | Bin 0 -> 26246 bytes 13 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 pictures/releases/0.9.7/flatpak_refs.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 068953cf..004d4679 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Flatpak - downgrading crashing with version 1.8.X - history: the top commit is returned as "(null)" + - installation fails when there are multiple references for a given package (e.g: openh264) +

+ +

- UI - crashing when nothing can be upgraded - random C++ wrapper errors with some forms due to missing references diff --git a/bauh/commons/system.py b/bauh/commons/system.py index 4624578e..1684682b 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 = 0, global_interpreter: bool = USE_GLOBAL_INTERPRETER, lang: str = DEFAULT_LANG, root_password: str = None, - extra_paths: Set[str] = None, error_phrases: Set[str] = None): + extra_paths: Set[str] = None, error_phrases: Set[str] = None, wrong_error_phrases: Set[str] = None): pwdin, final_cmd = None, [] if root_password is not None: @@ -77,6 +77,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 + self.wrong_error_phrases = wrong_error_phrases def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None, extra_paths: Set[str] = None) -> subprocess.Popen: @@ -182,11 +183,18 @@ class ProcessHandler: success = proc.instance.returncode == proc.expected_code string_output = output.read() - if proc.error_phrases: + if not success and proc.wrong_error_phrases: + for phrase in proc.wrong_error_phrases: + if phrase in string_output: + success = True + break + + if success and proc.error_phrases: for phrase in proc.error_phrases: if phrase in string_output: success = False break + return success, string_output diff --git a/bauh/gems/flatpak/controller.py b/bauh/gems/flatpak/controller.py index cd0e41a5..d91b49d1 100644 --- a/bauh/gems/flatpak/controller.py +++ b/bauh/gems/flatpak/controller.py @@ -1,4 +1,5 @@ import os +import re import traceback from datetime import datetime from math import floor @@ -25,6 +26,7 @@ from bauh.gems.flatpak.model import FlatpakApplication from bauh.gems.flatpak.worker import FlatpakAsyncDataLoader, FlatpakUpdateLoader DATE_FORMAT = '%Y-%m-%dT%H:%M:%S.000Z' +RE_INSTALL_REFS = re.compile(r'\d+\)\s+(.+)') class FlatpakManager(SoftwareManager): @@ -387,9 +389,30 @@ class FlatpakManager(SoftwareManager): if not self._make_exports_dir(handler.watcher): return TransactionResult(success=False, installed=[], removed=[]) - res = handler.handle(SystemProcess(subproc=flatpak.install(str(pkg.id), pkg.origin, pkg.installation), wrong_error_phrase='Warning')) + installed, output = handler.handle_simple(flatpak.install(str(pkg.id), pkg.origin, pkg.installation)) - if res: + if not installed and 'error: No ref chosen to resolve matches' in output: + ref_opts = RE_INSTALL_REFS.findall(output) + + if ref_opts and len(ref_opts) > 1: + view_opts = [InputOption(label=o, value=o.strip()) for o in ref_opts if o] + ref_select = SingleSelectComponent(type_=SelectViewType.RADIO, options=view_opts, default_option=view_opts[0], label='') + if watcher.request_confirmation(title=self.i18n['flatpak.install.ref_choose.title'], + body=self.i18n['flatpak.install.ref_choose.body'].format(bold(pkg.name)), + components=[ref_select], + confirmation_label=self.i18n['proceed'].capitalize(), + deny_label=self.i18n['cancel'].capitalize()): + ref = ref_select.get_selected() + installed, output = handler.handle_simple(flatpak.install(ref, pkg.origin, pkg.installation)) + pkg.ref = ref + pkg.runtime = 'runtime' in ref + else: + watcher.print('Aborted by the user') + return TransactionResult.fail() + else: + return TransactionResult.fail() + + if installed: try: fields = flatpak.get_fields(str(pkg.id), pkg.branch, ['Ref', 'Branch']) @@ -399,7 +422,7 @@ class FlatpakManager(SoftwareManager): except: traceback.print_exc() - if res: + if installed: new_installed = [pkg] current_installed = flatpak.list_installed(flatpak_version) current_installed_by_level = [p for p in current_installed if p['installation'] == pkg.installation] if current_installed else None @@ -413,7 +436,7 @@ class FlatpakManager(SoftwareManager): new_installed.append(self._map_to_model(app_json=p, installed=True, disk_loader=disk_loader, internet=net_available)) - return TransactionResult(success=res, installed=new_installed, removed=[]) + return TransactionResult(success=installed, installed=new_installed, removed=[]) else: return TransactionResult.fail() diff --git a/bauh/gems/flatpak/flatpak.py b/bauh/gems/flatpak/flatpak.py index e16fa310..640a2129 100755 --- a/bauh/gems/flatpak/flatpak.py +++ b/bauh/gems/flatpak/flatpak.py @@ -355,9 +355,10 @@ def search(version: str, word: str, installation: str, app_id: bool = False) -> return found -def install(app_id: str, origin: str, installation: str): - return new_subprocess(cmd=['flatpak', 'install', origin, app_id, '-y', '--{}'.format(installation)], - extra_paths={EXPORTS_PATH}) +def install(app_id: str, origin: str, installation: str) -> SimpleProcess: + return SimpleProcess(cmd=['flatpak', 'install', origin, app_id, '-y', '--{}'.format(installation)], + extra_paths={EXPORTS_PATH}, + wrong_error_phrases={'Warning'}) def set_default_remotes(installation: str, root_password: str = None) -> SimpleProcess: diff --git a/bauh/gems/flatpak/resources/locale/ca b/bauh/gems/flatpak/resources/locale/ca index 89eec7dd..a20ee7bd 100644 --- a/bauh/gems/flatpak/resources/locale/ca +++ b/bauh/gems/flatpak/resources/locale/ca @@ -48,6 +48,8 @@ flatpak.info.version=versió flatpak.install.bad_install_level.body=Valor invàlid per a {field} al fitxer de configuració {file} flatpak.install.install_level.body=S'ha d'instal·lar {} per a tots els usuaris del dispositiu ( sistema ) ? flatpak.install.install_level.title=Tipus d'instal·lació +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=Si no voleu utilitzar aplicacions Flatpak, desmarqueu {} a {} flatpak.notification.no_remotes=No hi ha dipòsits («remotes») del Flatpak configurats. No podreu cercar aplicacions Flatpak. flatpak.remotes.system_flathub.error=No s'ha pogut afegir Flathub com a dipòsit del sistema ( remote ) diff --git a/bauh/gems/flatpak/resources/locale/de b/bauh/gems/flatpak/resources/locale/de index 6ead2323..dcc8bbc9 100644 --- a/bauh/gems/flatpak/resources/locale/de +++ b/bauh/gems/flatpak/resources/locale/de @@ -48,6 +48,8 @@ flatpak.info.version=Version flatpak.install.bad_install_level.body=Ungültiger Wert für {field} in der Konfigurationsdatei {file} flatpak.install.install_level.body=Sollte {} für alle Gerätebenutzer installiert werden ( system ) ? flatpak.install.install_level.title=Installationstyp +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=Um keine Flatpak Anwendungen zu verwenden deaktiviere {} unter {} flatpak.notification.no_remotes=Keine Flatpak Remotes sind konfiguriert. Die Suche nach Flatpak Apps ist nicht möglich. flatpak.remotes.system_flathub.error=Flathub konnte nicht als System-Repository ( remote ) hinzugefügt werden diff --git a/bauh/gems/flatpak/resources/locale/en b/bauh/gems/flatpak/resources/locale/en index 10ae4ff9..253b3229 100644 --- a/bauh/gems/flatpak/resources/locale/en +++ b/bauh/gems/flatpak/resources/locale/en @@ -48,6 +48,8 @@ flatpak.info.version=version flatpak.install.bad_install_level.body=Invalid value for {field} in the configuration file {file} flatpak.install.install_level.body=Should {} be installed for all the device users ( system ) ? flatpak.install.install_level.title=Installation type +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=If you do not want to use Flatpak applications, uncheck {} in {} flatpak.notification.no_remotes=No Flatpak remotes set. It will not be possible to search for Flatpak apps. flatpak.remotes.system_flathub.error=It was not possible to add Flathub as a system repository ( remote ) diff --git a/bauh/gems/flatpak/resources/locale/es b/bauh/gems/flatpak/resources/locale/es index 2c0fc09e..af99e2cc 100644 --- a/bauh/gems/flatpak/resources/locale/es +++ b/bauh/gems/flatpak/resources/locale/es @@ -48,6 +48,8 @@ flatpak.info.version=versión flatpak.install.bad_install_level.body=Valor inválido para {field} en el archivo de configuración {file} flatpak.install.install_level.body=¿Debería {} estar instalado para todos los usuarios del dispositivo ( sistema )? flatpak.install.install_level.title=Tipo de instalación +flatpak.install.ref_choose.title=Varias referencias +flatpak.install.ref_choose.body=Hay varias referencias para {}. Seleccione una para proceder: flatpak.notification.disable=Si no desea usar aplicativos Flatpak, desmarque {} en {} flatpak.notification.no_remotes=No hay repositorios (remotes) Flatpak configurados. No será posible buscar aplicativos Flatpak. flatpak.remotes.system_flathub.error=No fue posible agregar Flathub como repositorio del sistema ( remote ) diff --git a/bauh/gems/flatpak/resources/locale/it b/bauh/gems/flatpak/resources/locale/it index ff3a5ec1..b7015d8a 100644 --- a/bauh/gems/flatpak/resources/locale/it +++ b/bauh/gems/flatpak/resources/locale/it @@ -48,6 +48,8 @@ flatpak.info.version=version flatpak.install.bad_install_level.body=Valore non valido per {field} nel file di configurazione {file} flatpak.install.install_level.body={} deve essere installato per tutti gli utenti del dispositivo ( sistema ) ? flatpak.install.install_level.title=Tipo di installazione +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=Ise non si desidera utilizzare le applicazioni Flatpak, deselezionare {} in {} flatpak.notification.no_remotes=Nessun set remoti Flatpak. Non sarà possibile cercare app Flatpak. flatpak.remotes.system_flathub.error=Non è stato possibile aggiungere Flathub come repository di sistema ( remote ) diff --git a/bauh/gems/flatpak/resources/locale/pt b/bauh/gems/flatpak/resources/locale/pt index 36b9dd68..8b0632b8 100644 --- a/bauh/gems/flatpak/resources/locale/pt +++ b/bauh/gems/flatpak/resources/locale/pt @@ -48,6 +48,8 @@ flatpak.info.version=versão flatpak.install.bad_install_level.body=Valor inválido para {field} no arquivo de configuração {file} flatpak.install.install_level.body={} deve ser instalado para todos os usuários desse dispositivo ( sistema ) ? flatpak.install.install_level.title=Tipo de instalação +flatpak.install.ref_choose.title=Múltiplas referências +flatpak.install.ref_choose.body=Existem múltiplas referências para {}. Selecione uma para continuar: flatpak.notification.disable=Se não deseja usar aplicativos Flatpak, desmarque {} em {} flatpak.notification.no_remotes=Não há repositórios (remotes) Flatpak configurados. Não será possível buscar aplicativos Flatpak. flatpak.remotes.system_flathub.error=Não foi possível adicionar o Flathub como um repositório do sistema ( remote ) diff --git a/bauh/gems/flatpak/resources/locale/ru b/bauh/gems/flatpak/resources/locale/ru index 4005a082..850b0e45 100644 --- a/bauh/gems/flatpak/resources/locale/ru +++ b/bauh/gems/flatpak/resources/locale/ru @@ -48,6 +48,8 @@ flatpak.info.version=Версия flatpak.install.bad_install_level.body=Недопустимое значение для {field} в файле конфигурации {file} flatpak.install.install_level.body=Должен ли {} быть установлен для всех пользователей устройства (системы)? flatpak.install.install_level.title=Тип установки +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=Если вы не хотите использовать приложения Flatpak, снимите флажок {} в {} flatpak.notification.no_remotes=Поддержка Flatpak не установлена. Поиск приложений Flatpak будет невозможен. flatpak.remotes.system_flathub.error=Не удалось добавить Flathub в качестве системного репозитория (удаленного) diff --git a/bauh/gems/flatpak/resources/locale/tr b/bauh/gems/flatpak/resources/locale/tr index 8d1b187c..cc5aabaf 100644 --- a/bauh/gems/flatpak/resources/locale/tr +++ b/bauh/gems/flatpak/resources/locale/tr @@ -48,6 +48,8 @@ flatpak.info.version=sürüm flatpak.install.bad_install_level.body={file} yapılandırma dosyasında {field} için geçersiz değer flatpak.install.install_level.body=Tüm cihaz kullanıcıları (sistem) için {} kurulmalı mı ? flatpak.install.install_level.title=Kurulum türü +flatpak.install.ref_choose.title=Multiple references +flatpak.install.ref_choose.body=There are multiple references for {}. Select one to proceed: flatpak.notification.disable=If you do not want to use Flatpak applications, uncheck {} in {} flatpak.notification.no_remotes=Flatpak uygulamalarını kullanmak istemiyorsanız, {} içindeki {} işaretini kaldırın flatpak.remotes.system_flathub.error=Flathub sistem havuzu (uzak) olarak eklenemedi diff --git a/pictures/releases/0.9.7/flatpak_refs.png b/pictures/releases/0.9.7/flatpak_refs.png new file mode 100644 index 0000000000000000000000000000000000000000..299a50e47b97a4fa540c31d5e59d213cf88a08e4 GIT binary patch literal 26246 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

wWNii*N+OJ7@FUyp#pxj^rj(3rX;UhkS{tMI~5 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