diff --git a/CHANGELOG.md b/CHANGELOG.md index dd035d76..7aaf7b59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

+ - upgrade: only removing packages after downloading the required ones (when multi-threaded download is enabled) ### Fixes - Arch diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 752ae501..c33bee57 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -769,16 +769,15 @@ class ArchManager(SoftwareManager): return files def _upgrade_repo_pkgs(self, pkgs: List[str], handler: ProcessHandler, root_password: str, arch_config: dict, overwrite_files: bool = False, - status_handler: TransactionStatusHandler = None, already_downloaded: bool = False, sizes: Dict[str, int] = None) -> bool: + status_handler: TransactionStatusHandler = None, skip_download: bool = False, sizes: Dict[str, int] = None, already_downloaded: int = 0) -> bool: - downloaded = 0 - - if not already_downloaded: - if self._should_download_packages(arch_config): - try: - downloaded = self._download_packages(pkgs, handler, root_password, sizes) - except ArchDownloadException: - return False + if not skip_download and self._should_download_packages(arch_config): + try: + downloaded = self._download_packages(pkgs, handler, root_password, sizes) + except ArchDownloadException: + return False + else: + downloaded = already_downloaded try: if status_handler: @@ -823,7 +822,7 @@ class ArchManager(SoftwareManager): root_password=root_password, overwrite_files=True, status_handler=output_handler, - already_downloaded=True, + skip_download=True, arch_config=arch_config, sizes=sizes) else: @@ -843,6 +842,37 @@ class ArchManager(SoftwareManager): traceback.print_exc() return False + def _remove_transaction_packages(self, requirements: UpgradeRequirements, handler: ProcessHandler, root_password: str) -> bool: + to_remove_names = {r.pkg.name for r in requirements.to_remove} + output_handler = TransactionStatusHandler(watcher=handler.watcher, + i18n=self.i18n, + pkgs_to_sync=0, + logger=self.logger, + pkgs_to_remove=len(to_remove_names)) + output_handler.start() + try: + success = handler.handle(pacman.remove_several(pkgnames=to_remove_names, root_password=root_password, skip_checks=True), + output_handler=output_handler.handle) + + if not success: + self.logger.error("Could not remove packages: {}".format(', '.join(to_remove_names))) + output_handler.stop_working() + output_handler.join() + return False + + return True + except: + self.logger.error("An error occured while removing packages: {}".format(', '.join(to_remove_names))) + traceback.print_exc() + output_handler.stop_working() + output_handler.join() + return False + + def _show_upgrade_download_failed(self, watcher: ProcessWatcher): + watcher.show_message(title=self.i18n['error'].capitalize(), + body=self.i18n['arch.upgrade.mthreaddownload.fail'], + type_=MessageType.ERROR) + def upgrade(self, requirements: UpgradeRequirements, root_password: str, watcher: ProcessWatcher) -> bool: self.aur_client.clean_caches() watcher.change_status("{}...".format(self.i18n['manage_window.status.upgrading'])) @@ -869,31 +899,32 @@ class ArchManager(SoftwareManager): arch_config = read_config() self._sync_databases(arch_config=arch_config, root_password=root_password, handler=handler) - if requirements.to_remove: - to_remove_names = {r.pkg.name for r in requirements.to_remove} - output_handler = TransactionStatusHandler(watcher=handler.watcher, - i18n=self.i18n, - pkgs_to_sync=0, - logger=self.logger, - pkgs_to_remove=len(to_remove_names)) - output_handler.start() - try: - success = handler.handle(pacman.remove_several(to_remove_names, root_password), output_handler=output_handler.handle) + # for now if the multithreaded-download is disabled packages will be removed before the download: + multithreaded_download = self._should_download_packages(arch_config) - if not success: - self.logger.error("Could not remove packages: {}".format(', '.join(to_remove_names))) - output_handler.stop_working() - output_handler.join() - return False - except: - self.logger.error("An error occured while removing packages: {}".format(', '.join(to_remove_names))) - traceback.print_exc() - output_handler.stop_working() - output_handler.join() + if requirements.to_remove and (not repo_pkgs or not multithreaded_download): + if not self._remove_transaction_packages(requirements, handler, root_password): return False if repo_pkgs: repo_pkgs_names = [p.name for p in repo_pkgs] + + downloaded = -1 + if requirements.to_remove and multithreaded_download: # pre-downloading all packages before removing any + try: + downloaded = self._download_packages(repo_pkgs_names, handler, root_password, pkg_sizes) + + if downloaded < len(repo_pkgs_names): + self._show_upgrade_download_failed(handler.watcher) + return False + + except ArchDownloadException: + self._show_upgrade_download_failed(handler.watcher) + return False + + if not self._remove_transaction_packages(requirements, handler, root_password): + return False + watcher.change_status('{}...'.format(self.i18n['arch.upgrade.upgrade_repo_pkgs'])) self.logger.info("Upgrading {} repository packages: {}".format(len(repo_pkgs_names), ', '.join(repo_pkgs_names))) @@ -902,6 +933,8 @@ class ArchManager(SoftwareManager): handler=handler, root_password=root_password, arch_config=arch_config, + skip_download=downloaded >= 0, + already_downloaded=0 if downloaded < 0 else downloaded, sizes=pkg_sizes): return False diff --git a/bauh/gems/arch/resources/locale/ca b/bauh/gems/arch/resources/locale/ca index 7f114f37..12a4dd5d 100644 --- a/bauh/gems/arch/resources/locale/ca +++ b/bauh/gems/arch/resources/locale/ca @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail=Package {} upgrade failed +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success=Package {} successfully upgraded arch.upgrade.upgrade_aur_pkgs=Upgrading AUR packages arch.upgrade.upgrade_repo_pkgs=Upgrading packages from repositories diff --git a/bauh/gems/arch/resources/locale/de b/bauh/gems/arch/resources/locale/de index 3f556069..053c80d3 100644 --- a/bauh/gems/arch/resources/locale/de +++ b/bauh/gems/arch/resources/locale/de @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail=Package {} upgrade failed +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success=Package {} successfully upgraded arch.upgrade.upgrade_aur_pkgs=Upgrading AUR packages arch.upgrade.upgrade_repo_pkgs=Upgrading packages from repositories diff --git a/bauh/gems/arch/resources/locale/en b/bauh/gems/arch/resources/locale/en index e50f16c5..197975e8 100644 --- a/bauh/gems/arch/resources/locale/en +++ b/bauh/gems/arch/resources/locale/en @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail=Package {} upgrade failed +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success=Package {} successfully upgraded arch.upgrade.upgrade_aur_pkgs=Upgrading AUR packages arch.upgrade.upgrade_repo_pkgs=Upgrading packages from repositories diff --git a/bauh/gems/arch/resources/locale/es b/bauh/gems/arch/resources/locale/es index 62ddba54..b69b0b21 100644 --- a/bauh/gems/arch/resources/locale/es +++ b/bauh/gems/arch/resources/locale/es @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Algunos de los paquetes que se están actua arch.upgrade.conflicting_files.proceed=Permitir y continuar arch.upgrade.conflicting_files.stop=Cancelar la actualización arch.upgrade.fail=Falló la actualización del paquete {} +arch.upgrade.mthreaddownload.fail=No fue posible descargar todos los paquetes para actualizar arch.upgrade.success=Paquete {} actualizado con éxito arch.upgrade.upgrade_aur_pkgs=Actualizando paquetes de AUR arch.upgrade.upgrade_repo_pkgs=Actualizando paquetes de repositorios diff --git a/bauh/gems/arch/resources/locale/it b/bauh/gems/arch/resources/locale/it index ec76bfa3..4294be60 100644 --- a/bauh/gems/arch/resources/locale/it +++ b/bauh/gems/arch/resources/locale/it @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail=Package {} upgrade failed +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success=Package {} successfully upgraded arch.upgrade.upgrade_aur_pkgs=Upgrading AUR packages arch.upgrade.upgrade_repo_pkgs=Upgrading packages from repositories diff --git a/bauh/gems/arch/resources/locale/pt b/bauh/gems/arch/resources/locale/pt index 0c80cfcb..e5ba5d0e 100644 --- a/bauh/gems/arch/resources/locale/pt +++ b/bauh/gems/arch/resources/locale/pt @@ -198,6 +198,7 @@ arch.upgrade.error.conflicting_files=Alguns dos pacotes que estão sendo atualiz arch.upgrade.conflicting_files.proceed=Permitir e continuar arch.upgrade.conflicting_files.stop=Cancelar atualização arch.upgrade.fail=Atualização do pacote {} falhou +arch.upgrade.mthreaddownload.fail=Não foi possível baixar todos os pacotes para atualizar arch.upgrade.success=Pacote {} atualizado com sucesso arch.upgrade.upgrade_aur_pkgs=Atualizando pacotes do AUR arch.upgrade.upgrade_repo_pkgs=Atualizando pacotes dos repositórios diff --git a/bauh/gems/arch/resources/locale/ru b/bauh/gems/arch/resources/locale/ru index 67d9b0f8..ed3444f3 100644 --- a/bauh/gems/arch/resources/locale/ru +++ b/bauh/gems/arch/resources/locale/ru @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail=Package {} upgrade failed +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success=Package {} successfully upgraded arch.upgrade.upgrade_aur_pkgs=Upgrading AUR packages arch.upgrade.upgrade_repo_pkgs=Upgrading packages from repositories diff --git a/bauh/gems/arch/resources/locale/tr b/bauh/gems/arch/resources/locale/tr index 471b1461..ebe03ea9 100644 --- a/bauh/gems/arch/resources/locale/tr +++ b/bauh/gems/arch/resources/locale/tr @@ -199,6 +199,7 @@ arch.upgrade.error.conflicting_files=Some of the packages being upgraded want to arch.upgrade.conflicting_files.proceed=Allow and continue arch.upgrade.conflicting_files.stop=Cancel upgrading arch.upgrade.fail={} paketi yükseltilemedi +arch.upgrade.mthreaddownload.fail=It was not possible to download all packages for upgrading arch.upgrade.success={} paketi başarıyla yükseltildi arch.upgrade.upgrade_aur_pkgs=AUR paketleri yükseltiliyor arch.upgrade.upgrade_repo_pkgs=Resmi depo paketleri yükseltiliyor