From a320f309112a7c7be1d56a26a58da280a12a0b5e Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Sun, 17 May 2020 14:36:22 -0300 Subject: [PATCH] [feature] ignore updates: Arch/AUR packages --- CHANGELOG.md | 15 ++ README.md | 7 +- bauh/api/abstract/controller.py | 6 + bauh/api/abstract/model.py | 6 + bauh/gems/arch/__init__.py | 3 +- bauh/gems/arch/controller.py | 49 ++++- bauh/gems/arch/model.py | 9 +- bauh/view/core/controller.py | 12 ++ bauh/view/qt/apps_table.py | 26 ++- bauh/view/qt/commons.py | 2 +- bauh/view/qt/thread.py | 23 +++ bauh/view/qt/window.py | 25 ++- bauh/view/resources/img/ignore_update.svg | 134 +++++++++++++ .../resources/img/revert_update_ignored.svg | 189 ++++++++++++++++++ bauh/view/resources/locale/ca | 9 + bauh/view/resources/locale/de | 9 + bauh/view/resources/locale/en | 9 + bauh/view/resources/locale/es | 9 + bauh/view/resources/locale/it | 9 + bauh/view/resources/locale/pt | 9 + bauh/view/resources/locale/ru | 9 + bauh/view/resources/locale/tr | 9 + pictures/releases/0.9.4/ignore_updates.png | Bin 0 -> 22059 bytes .../releases/0.9.4/revert_ignored_updates.png | Bin 0 -> 9256 bytes .../0.9.4/version_ignored_updates.png | Bin 0 -> 12813 bytes 25 files changed, 566 insertions(+), 12 deletions(-) create mode 100644 bauh/view/resources/img/ignore_update.svg create mode 100644 bauh/view/resources/img/revert_update_ignored.svg create mode 100644 pictures/releases/0.9.4/ignore_updates.png create mode 100644 pictures/releases/0.9.4/revert_ignored_updates.png create mode 100644 pictures/releases/0.9.4/version_ignored_updates.png diff --git a/CHANGELOG.md b/CHANGELOG.md index a5f0582a..7ef86581 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [0.9.4] 2020 +### Features +- Ignore updates: now it is possible to ignore updates from software packages through their actions button (**+**). Supported types: Arch packages + +

+ +

+

+ +

+- Packages with ignored updates have their versions displayed with a brown shade +

+ +

+ + ### Improvements - Arch - faster caching data process during initialization diff --git a/README.md b/README.md index d01bc0c9..bea6e8b8 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@

-**bauh** ( ba-oo ), formerly known as **fpakman**, is a graphical interface for managing your Linux applications / packages. It currently supports -the following types: AppImage, Arch ( repositories / AUR ), Flatpak, Snap and native Web applications. +**bauh** ( ba-oo ), formerly known as **fpakman**, is a graphical interface for managing your Linux applications/packages. It currently supports +the following formats: AppImage, Arch ( repositories / AUR ), Flatpak, Snap and native Web applications. Key features: -- A management panel where you can: search, install, uninstall, launch, downgrade and retrieve the release history from software packages. +- A management panel where you can: search, install, uninstall, upgrade, downgrade, launch, ignore updates and retrieve releases history from software packages./ - Tray mode: launches attached to the system tray and publishes notifications when there are software updates available - System backup: it integrates with **Timeshift** to provide a simple and safe backup process before applying any change to your system. @@ -169,6 +169,7 @@ db_updater: - **refresh mirrors**: allows the user to define multiple mirrors locations and sort by the fastest ( `sudo pacman-mirrors -c country1,country2 && sudo pacman-mirrors --fasttrack 5 && sudo pacman -Syy` ) - **quick system upgrade**: it executes a default pacman upgrade ( `pacman -Syyu --noconfirm` ) - **clean cache**: it cleans the pacman cache diretory ( default: `/var/cache/pacman/pkg` ) +- Packages with ignored updates are defined at **~/.config/bauh/arch/updates_ignored.txt** - The configuration file is located at **~/.config/bauh/arch.yml** and it allows the following customizations: ``` optimize: true # if 'false': disables the auto-compilation improvements diff --git a/bauh/api/abstract/controller.py b/bauh/api/abstract/controller.py index e1aa32b8..f3f7157c 100644 --- a/bauh/api/abstract/controller.py +++ b/bauh/api/abstract/controller.py @@ -340,3 +340,9 @@ class SoftwareManager(ABC): def fill_sizes(self, pkgs: List[SoftwarePackage]): pass + + def ignore_update(self, pkg: SoftwarePackage): + pass + + def revert_ignored_update(self, pkg: SoftwarePackage): + pass diff --git a/bauh/api/abstract/model.py b/bauh/api/abstract/model.py index d594e376..66f56d9b 100644 --- a/bauh/api/abstract/model.py +++ b/bauh/api/abstract/model.py @@ -95,6 +95,12 @@ class SoftwarePackage(ABC): def can_be_installed(self): return not self.installed + def is_update_ignored(self) -> bool: + return False + + def supports_ignored_updates(self) -> bool: + return False + @abstractmethod def get_type(self): """ diff --git a/bauh/gems/arch/__init__.py b/bauh/gems/arch/__init__.py index 98117b48..44820a2a 100644 --- a/bauh/gems/arch/__init__.py +++ b/bauh/gems/arch/__init__.py @@ -9,11 +9,12 @@ BUILD_DIR = '{}/arch'.format(TEMP_DIR) ARCH_CACHE_PATH = CACHE_PATH + '/arch' CATEGORIES_FILE_PATH = ARCH_CACHE_PATH + '/categories.txt' URL_CATEGORIES_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/arch/categories.txt' -CONFIG_DIR = '{}/.config/bauh/arch'.format(Path.home()) +CONFIG_DIR = '{}/.config/bauh/arch'.format(str(Path.home())) CUSTOM_MAKEPKG_FILE = '{}/makepkg.conf'.format(CONFIG_DIR) AUR_INDEX_FILE = '{}/arch.txt'.format(BUILD_DIR) CONFIG_FILE = '{}/arch.yml'.format(CONFIG_PATH) SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/arch/aur_suggestions.txt' +UPDATES_IGNORED_FILE = '{}/updates_ignored.txt'.format(CONFIG_DIR) def get_icon_path() -> str: diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index cddf956b..c4f23d38 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -30,7 +30,8 @@ from bauh.commons.html import bold from bauh.commons.system import SystemProcess, ProcessHandler, new_subprocess, run_cmd, SimpleProcess from bauh.gems.arch import BUILD_DIR, aur, pacman, makepkg, message, confirmation, disk, git, \ gpg, URL_CATEGORIES_FILE, CATEGORIES_FILE_PATH, CUSTOM_MAKEPKG_FILE, SUGGESTIONS_FILE, \ - CONFIG_FILE, get_icon_path, database, mirrors, sorting, cpu_manager, ARCH_CACHE_PATH + CONFIG_FILE, get_icon_path, database, mirrors, sorting, cpu_manager, ARCH_CACHE_PATH, UPDATES_IGNORED_FILE, \ + CONFIG_DIR from bauh.gems.arch.aur import AURClient from bauh.gems.arch.config import read_config from bauh.gems.arch.dependencies import DependenciesAnalyser @@ -529,6 +530,14 @@ class ArchManager(SoftwareManager): for t in map_threads: t.join() + if pkgs: + ignored = self._list_ignored_updates() + + if ignored: + for p in pkgs: + if p.name in ignored: + p.update_ignored = True + return SearchResult(pkgs, None, len(pkgs)) def _downgrade_aur_pkg(self, context: TransactionContext): @@ -1016,6 +1025,8 @@ class ArchManager(SoftwareManager): body=self.i18n['arch.uninstall.clean_cached.error'].format(bold(p)), type_=MessageType.WARNING) + self._revert_ignored_updates(to_uninstall) + self._update_progress(context, 100) return uninstalled @@ -1932,7 +1943,7 @@ class ArchManager(SoftwareManager): aur_type, repo_type = self.i18n['gem.arch.type.aur.label'], self.i18n['gem.arch.type.arch_repo.label'] - return [PackageUpdate(p.name, p.latest_version, aur_type if p.repository == 'aur' else repo_type, p.name) for p in installed if p.update] + return [PackageUpdate(p.name, p.latest_version, aur_type if p.repository == 'aur' else repo_type, p.name) for p in installed if p.update and not p.is_update_ignored()] def list_warnings(self, internet_available: bool) -> List[str]: warnings = [] @@ -2246,3 +2257,37 @@ class ArchManager(SoftwareManager): return False return True + + def _list_ignored_updates(self) -> Set[str]: + if os.path.exists(UPDATES_IGNORED_FILE): + with open(UPDATES_IGNORED_FILE) as f: + return {line.strip() for line in f.read().split('\n') if line} + + def ignore_update(self, pkg: ArchPackage): + ignored = self._list_ignored_updates() + + if not ignored or pkg.name not in ignored: + Path(CONFIG_DIR).mkdir(parents=True, exist_ok=True) + + with open(UPDATES_IGNORED_FILE, 'a+') as f: + f.write('{}\n'.format(pkg.name)) + + pkg.update_ignored = True + + def _revert_ignored_updates(self, pkgs: Iterable[str]): + if os.path.exists(UPDATES_IGNORED_FILE): + ignored = [] + with open(UPDATES_IGNORED_FILE) as f: + for line in f.read().split('\n'): + if line: + clean_line = line.strip() + + if clean_line and clean_line not in pkgs: + ignored.append(clean_line) + + with open(UPDATES_IGNORED_FILE, 'w+') as f: + f.writelines(ignored) + + def revert_ignored_update(self, pkg: ArchPackage): + self._revert_ignored_updates({pkg.name}) + pkg.update_ignored = False \ No newline at end of file diff --git a/bauh/gems/arch/model.py b/bauh/gems/arch/model.py index 4b82168a..410950c2 100644 --- a/bauh/gems/arch/model.py +++ b/bauh/gems/arch/model.py @@ -16,7 +16,7 @@ class ArchPackage(SoftwarePackage): first_submitted: datetime.datetime = None, last_modified: datetime.datetime = None, maintainer: str = None, url_download: str = None, pkgbuild: str = None, repository: str = None, desktop_entry: str = None, installed: bool = False, srcinfo: dict = None, dependencies: Set[str] = None, - categories: List[str] = None, i18n: I18n = None): + categories: List[str] = None, i18n: I18n = None, update_ignored: bool = False): super(ArchPackage, self).__init__(name=name, version=version, latest_version=latest_version, description=description, installed=installed, categories=categories) @@ -36,6 +36,7 @@ class ArchPackage(SoftwarePackage): self.src_info = srcinfo self.dependencies = dependencies self.i18n = i18n + self.update_ignored = update_ignored @staticmethod def disk_cache_path(pkgname: str): @@ -132,6 +133,12 @@ class ArchPackage(SoftwarePackage): def supports_backup(self) -> bool: return True + def is_update_ignored(self) -> bool: + return self.update_ignored + + def supports_ignored_updates(self) -> bool: + return self.installed + def __str__(self): return self.__repr__() diff --git a/bauh/view/core/controller.py b/bauh/view/core/controller.py index 662510b8..dbb77449 100755 --- a/bauh/view/core/controller.py +++ b/bauh/view/core/controller.py @@ -539,3 +539,15 @@ class GenericSoftwareManager(SoftwareManager): for t in threads: t.join() + + def ignore_update(self, pkg: SoftwarePackage): + manager = self._get_manager_for(pkg) + + if manager: + manager.ignore_update(pkg) + + def revert_ignored_update(self, pkg: SoftwarePackage): + manager = self._get_manager_for(pkg) + + if manager: + manager.revert_ignored_update(pkg) diff --git a/bauh/view/qt/apps_table.py b/bauh/view/qt/apps_table.py index f2ac4ae1..51140a25 100644 --- a/bauh/view/qt/apps_table.py +++ b/bauh/view/qt/apps_table.py @@ -121,6 +121,7 @@ class AppsTable(QTableWidget): menu_row.setCursor(QCursor(Qt.PointingHandCursor)) if pkg.model.installed: + if pkg.model.has_history(): action_history = QAction(self.i18n["manage_window.apps_table.row.actions.history"]) action_history.setIcon(QIcon(resource.get_path('img/history.svg'))) @@ -145,6 +146,21 @@ class AppsTable(QTableWidget): action_downgrade.setIcon(QIcon(resource.get_path('img/downgrade.svg'))) menu_row.addAction(action_downgrade) + if pkg.model.supports_ignored_updates(): + if pkg.model.is_update_ignored(): + action_ignore_updates = QAction( + self.i18n["manage_window.apps_table.row.actions.ignore_updates_reverse"]) + action_ignore_updates.setIcon(QIcon(resource.get_path('img/revert_update_ignored.svg'))) + else: + action_ignore_updates = QAction(self.i18n["manage_window.apps_table.row.actions.ignore_updates"]) + action_ignore_updates.setIcon(QIcon(resource.get_path('img/ignore_update.svg'))) + + def ignore_updates(): + self.window.ignore_updates(pkg) + + action_ignore_updates.triggered.connect(ignore_updates) + menu_row.addAction(action_ignore_updates) + if bool(pkg.model.get_custom_supported_actions()): for action in pkg.model.get_custom_supported_actions(): item = QAction(self.i18n[action.i18_label_key]) @@ -263,7 +279,7 @@ class AppsTable(QTableWidget): if change_update_col: col_update = None - if update_check_enabled and pkg.model.update: + if update_check_enabled and not pkg.model.is_update_ignored() and pkg.model.update: col_update = QToolBar() col_update.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) col_update.addWidget(UpdateToggleButton(pkg=pkg, @@ -351,11 +367,15 @@ class AppsTable(QTableWidget): else: tooltip = self.i18n['version.unknown'] - if pkg.model.update: + if pkg.model.update and not pkg.model.is_update_ignored(): label_version.setStyleSheet("color: {}; font-weight: bold".format(GREEN)) tooltip = self.i18n['version.installed_outdated'] - if pkg.model.installed and pkg.model.update and pkg.model.version and pkg.model.latest_version and pkg.model.version != pkg.model.latest_version: + if pkg.model.is_update_ignored(): + label_version.setStyleSheet("color: {}; font-weight: bold".format(BROWN)) + tooltip = self.i18n['version.updates_ignored'] + + if pkg.model.installed and pkg.model.update and not pkg.model.is_update_ignored() and pkg.model.version and pkg.model.latest_version and pkg.model.version != pkg.model.latest_version: tooltip = '{}. {}: {}'.format(tooltip, self.i18n['version.latest'], pkg.model.latest_version) label_version.setText(label_version.text() + ' > {}'.format(pkg.model.latest_version)) diff --git a/bauh/view/qt/commons.py b/bauh/view/qt/commons.py index 6bac8966..30aa9556 100644 --- a/bauh/view/qt/commons.py +++ b/bauh/view/qt/commons.py @@ -22,7 +22,7 @@ def update_info(pkgv: PackageView, pkgs_info: dict): else: pkgs_info['napps_count'] += 1 - if pkgv.model.update: + if pkgv.model.update and not pkgv.model.is_update_ignored(): if pkgv.model.is_application(): pkgs_info['app_updates'] += 1 else: diff --git a/bauh/view/qt/thread.py b/bauh/view/qt/thread.py index ff995cfe..32b8c62f 100644 --- a/bauh/view/qt/thread.py +++ b/bauh/view/qt/thread.py @@ -907,3 +907,26 @@ class GetScreenshots(AsyncAction): self.notify_finished({'pkg': self.pkg, 'screenshots': self.manager.get_screenshots(self.pkg.model)}) self.pkg = None + + +class IgnorePackageUpdates(AsyncAction): + + def __init__(self, manager: SoftwareManager, pkg: PackageView = None): + super(IgnorePackageUpdates, self).__init__() + self.pkg = pkg + self.manager = manager + + def run(self): + if self.pkg: + try: + if self.pkg.model.is_update_ignored(): + self.manager.revert_ignored_update(self.pkg.model) + res = {'action': 'ignore_updates_reverse', 'success': not self.pkg.model.is_update_ignored(), 'pkg': self.pkg} + else: + self.manager.ignore_update(self.pkg.model) + res = {'action': 'ignore_updates', 'success': self.pkg.model.is_update_ignored(), 'pkg': self.pkg} + + self.notify_finished(res) + + finally: + self.pkg = None \ No newline at end of file diff --git a/bauh/view/qt/window.py b/bauh/view/qt/window.py index 2088f34c..99a0daa8 100755 --- a/bauh/view/qt/window.py +++ b/bauh/view/qt/window.py @@ -34,7 +34,8 @@ from bauh.view.qt.settings import SettingsWindow from bauh.view.qt.thread import UpgradeSelected, RefreshApps, UninstallApp, DowngradeApp, GetAppInfo, \ GetAppHistory, SearchPackages, InstallPackage, AnimateProgress, NotifyPackagesReady, FindSuggestions, \ ListWarnings, \ - AsyncAction, LaunchApp, ApplyFilters, CustomSoftwareAction, GetScreenshots, CustomAction, NotifyInstalledLoaded + AsyncAction, LaunchApp, ApplyFilters, CustomSoftwareAction, GetScreenshots, CustomAction, NotifyInstalledLoaded, \ + IgnorePackageUpdates from bauh.view.qt.view_model import PackageView, PackageViewStatus from bauh.view.util import util, resource from bauh.view.util.translation import I18n @@ -322,6 +323,9 @@ class ManageWindow(QWidget): self.thread_notify_pkgs_ready.signal_changed.connect(self._update_package_data) self.thread_notify_pkgs_ready.signal_finished.connect(self._update_state_when_pkgs_ready) + self.thread_ignore_updates = IgnorePackageUpdates(manager=self.manager) + self._bind_async_action(self.thread_ignore_updates, finished_call=self.finish_ignore_updates) + self.toolbar_bottom = QToolBar() self.toolbar_bottom.setIconSize(QSize(16, 16)) self.toolbar_bottom.setStyleSheet('QToolBar { spacing: 3px }') @@ -1256,3 +1260,22 @@ class ManageWindow(QWidget): menu_row.adjustSize() menu_row.popup(QCursor.pos()) menu_row.exec_() + + def ignore_updates(self, pkg: PackageView): + status_key = 'ignore_updates' if not pkg.model.is_update_ignored() else 'ignore_updates_reverse' + self._begin_action(self.i18n['manage_window.status.{}'.format(status_key)].format(pkg.model.name)) + self.thread_ignore_updates.pkg = pkg + self.thread_ignore_updates.start() + + def finish_ignore_updates(self, res: dict): + self.finish_action() + + if res['success']: + self.table_apps.update_package(res['pkg']) + dialog.show_message(title=self.i18n['success'].capitalize(), + body=self.i18n['action.{}.success'.format(res['action'])].format(bold(res['pkg'].model.name)), + type_=MessageType.INFO) + else: + dialog.show_message(title=self.i18n['fail'].capitalize(), + body=self.i18n['action.{}.fail'.format(res['action'])].format(bold(res['pkg'].model.name)), + type_=MessageType.ERROR) diff --git a/bauh/view/resources/img/ignore_update.svg b/bauh/view/resources/img/ignore_update.svg new file mode 100644 index 00000000..e1148552 --- /dev/null +++ b/bauh/view/resources/img/ignore_update.svg @@ -0,0 +1,134 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bauh/view/resources/img/revert_update_ignored.svg b/bauh/view/resources/img/revert_update_ignored.svg new file mode 100644 index 00000000..b327932f --- /dev/null +++ b/bauh/view/resources/img/revert_update_ignored.svg @@ -0,0 +1,189 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bauh/view/resources/locale/ca b/bauh/view/resources/locale/ca index d6a980a5..093d50b6 100644 --- a/bauh/view/resources/locale/ca +++ b/bauh/view/resources/locale/ca @@ -57,6 +57,10 @@ action.disk_trim.error=There was a problem while optimizing the disk action.failed=L'acció ha fallat action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Feu clic aquí per a veure informació sobre aquesta aplicació action.not_allowed=Action not allowed action.request_reboot.title=System restart @@ -268,6 +272,8 @@ locale.tr=turc manage_window.apps_table.row.actions.downgrade=Reverteix manage_window.apps_table.row.actions.downgrade.popup.body=Voleu revertir «{}»? manage_window.apps_table.row.actions.history=Historial +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Informació manage_window.apps_table.row.actions.install=Instal·la manage_window.apps_table.row.actions.install.popup.body=Voleu instal·lar «{}» a l’ordinador? @@ -301,6 +307,8 @@ manage_window.settings.about=Quant a manage_window.status.downgrading=S’està revertint manage_window.status.filtering=S’està filtrant manage_window.status.history=S’està recuperant l’historial +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=S’està recuperant la informació manage_window.status.installed=Loading installed manage_window.status.installing=S’està instal·lant @@ -380,6 +388,7 @@ version.latest=versió més recent version.outdated=no actualitzada version.unknown=no informat version.updated=actualitzada +version.updates_ignored=Updates ignored view.components.file_chooser.placeholder=Feu clic aquí per seleccionar warning=avís warning.update_available=There is a new {} version available ({}). Check out the news at {}. diff --git a/bauh/view/resources/locale/de b/bauh/view/resources/locale/de index 8c71a9cc..371d6e2c 100644 --- a/bauh/view/resources/locale/de +++ b/bauh/view/resources/locale/de @@ -57,6 +57,10 @@ action.disk_trim.error=There was a problem while optimizing the disk action.failed=Aktion fehlgeschlagen action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Informationen über diese Anwendung anzeigen action.not_allowed=Action not allowed action.request_reboot.title=System restart @@ -267,6 +271,8 @@ locale.tr=Türkisch manage_window.apps_table.row.actions.downgrade=Downgraden manage_window.apps_table.row.actions.downgrade.popup.body={} wirklich downgraden? manage_window.apps_table.row.actions.history=Verlauf +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Information manage_window.apps_table.row.actions.install=Installieren manage_window.apps_table.row.actions.install.popup.body={} installieren? @@ -300,6 +306,8 @@ manage_window.settings.about=Über manage_window.status.downgrading=Downgraden manage_window.status.filtering=Filtern manage_window.status.history=Verlauf laden +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=Informationen laden manage_window.status.installed=Loading installed manage_window.status.installing=Installieren @@ -379,6 +387,7 @@ version.latest=Aktuellste Version version.outdated=veraltet version.unknown=unbekannt version.updated=geupdated +version.updates_ignored=Updates ignored view.components.file_chooser.placeholder=Auswählen warning=Warnung warning.update_available=There is a new {} version available ({}). Check out the news at {}. diff --git a/bauh/view/resources/locale/en b/bauh/view/resources/locale/en index 019eb1f0..358017f9 100644 --- a/bauh/view/resources/locale/en +++ b/bauh/view/resources/locale/en @@ -57,6 +57,10 @@ action.disk_trim=Optimizing disc ( TRIM ) action.failed=Action failed action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Click here to see information about this application action.not_allowed=Action not allowed action.request_reboot.title=System restart @@ -267,6 +271,8 @@ locale.tr=turkish manage_window.apps_table.row.actions.downgrade.popup.body=Do you really want to downgrade {} ? manage_window.apps_table.row.actions.downgrade=Downgrade manage_window.apps_table.row.actions.history=History +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Information manage_window.apps_table.row.actions.install.popup.body=Install {} on your device ? manage_window.apps_table.row.actions.install.popup.title=Installation @@ -300,6 +306,8 @@ manage_window.settings.about=About manage_window.status.downgrading=Downgrading manage_window.status.filtering=Filtering manage_window.status.history=Retrieving history +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=Retrieving information manage_window.status.installed=Loading installed manage_window.status.installing=Installing @@ -378,6 +386,7 @@ version.latest=latest version version.outdated=outdated version.unknown=not informed version.updated=updated +version.updates_ignored=Updates ignored version=version view.components.file_chooser.placeholder=Click here to select warning=warning diff --git a/bauh/view/resources/locale/es b/bauh/view/resources/locale/es index e6e3c361..8ea2bca2 100644 --- a/bauh/view/resources/locale/es +++ b/bauh/view/resources/locale/es @@ -57,6 +57,10 @@ action.disk_trim.error=Hubo un problema al optimizar el disco action.failed=Acción fallida action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=No fue posible ignorar las actualizaciones de {} +action.ignore_updates.success=Las actualizaciones de {} serán ignoradas de ahora en adelante +action.ignore_updates_reverse.fail=No fue posible revertir las actualizaciones ignoradas de {} +action.ignore_updates_reverse.success=Las actualizaciones de {} se mostrarán nuevamente a partir de ahora action.info.tooltip=Pulse aquí para ver información sobre esta aplicación action.not_allowed=Acción no permitida action.request_reboot.title=Reinicio de sistema @@ -268,6 +272,8 @@ locale.tr=turco manage_window.apps_table.row.actions.downgrade=Revertir versión manage_window.apps_table.row.actions.downgrade.popup.body=¿Realmente quiere revertir la versión actual de {}? manage_window.apps_table.row.actions.history=Histórico +manage_window.apps_table.row.actions.ignore_updates=Ignorar actualizaciones +manage_window.apps_table.row.actions.ignore_updates_reverse=Revertir actualizaciones ignoradas manage_window.apps_table.row.actions.info=Información manage_window.apps_table.row.actions.install=Instalar manage_window.apps_table.row.actions.install.popup.body=¿Quiere instalar {} en el equipo? @@ -301,6 +307,8 @@ manage_window.settings.about=Acerca de manage_window.status.downgrading=Revirtiendo manage_window.status.filtering=Filtrando manage_window.status.history=Obteniendo el histórico +manage_window.status.ignore_updates=Ignorando las actualizaciones de {} +manage_window.status.ignore_updates_reverse=Revertir actualizaciones ignoradas de {} manage_window.status.info=Obteniendo información manage_window.status.installed=Cargando instalados manage_window.status.installing=Instalando @@ -380,6 +388,7 @@ version.latest=versión más reciente version.outdated=desactualizada version.unknown=versión no informada version.updated=actualizada +version.updates_ignored=Actualizaciónes ignoradas view.components.file_chooser.placeholder=Pulse aquí para seleccionar warning=aviso warning.update_available=Hay una nueva versión de {} disponible ({}). Vea las novedades en {}. diff --git a/bauh/view/resources/locale/it b/bauh/view/resources/locale/it index 557b00f1..4a8c5193 100644 --- a/bauh/view/resources/locale/it +++ b/bauh/view/resources/locale/it @@ -57,6 +57,10 @@ action.disk_trim.error=There was a problem while optimizing the disk action.failed=Azione non riuscita action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Clicca qui per vedere informazioni su questa applicazione action.not_allowed=Action not allowed action.request_reboot.title=System restart @@ -269,6 +273,8 @@ locale.tr=turco manage_window.apps_table.row.actions.downgrade=Downgrade manage_window.apps_table.row.actions.downgrade.popup.body=Vuoi veramente fare il downgrade {} ? manage_window.apps_table.row.actions.history=Cronologia +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Informazioni manage_window.apps_table.row.actions.install=Installa manage_window.apps_table.row.actions.install.popup.body=Installa {} nel tuo dispositivo ? @@ -302,6 +308,8 @@ manage_window.settings.about=Informazione su manage_window.status.downgrading=Downgrading manage_window.status.filtering=Filtraggio manage_window.status.history=Recupero della cronologia +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=Recupero di informazioni manage_window.status.installed=Loading installed manage_window.status.installing=Installazione @@ -382,6 +390,7 @@ version.latest=ultima versione version.outdated=obsoleta version.unknown=non informato version.updated=aggiornata +version.updates_ignored=Updates ignored view.components.file_chooser.placeholder=Fai clic qui per selezionare warning=Avviso warning.update_available=There is a new {} version available ({}). Check out the news at {}. diff --git a/bauh/view/resources/locale/pt b/bauh/view/resources/locale/pt index 18f4f2df..d7cb7275 100644 --- a/bauh/view/resources/locale/pt +++ b/bauh/view/resources/locale/pt @@ -57,6 +57,10 @@ action.disk_trim=Otimizando disco ( TRIM ) action.failed=Ação falhou action.history.no_history.body=Não existe histórico disponível para {} action.history.no_history.title=Sem histórico +action.ignore_updates.fail=Não foi possível ignorar as atualizações de {} +action.ignore_updates.success=As atualizações de {} serão ignoradas a partir de agora +action.ignore_updates_reverse.fail=Não foi possível reverter as atualizações ignoradas de {} +action.ignore_updates_reverse.success=As atualizações de {} serão exibidas novamente a partir de agora action.info.tooltip=Clique aqui para ver informações sobre este aplicativo action.not_allowed=Ação não permitida action.request_reboot.title=Reinicialização de sistema @@ -267,6 +271,8 @@ locale.tr=turco manage_window.apps_table.row.actions.downgrade.popup.body=Você realmente quer reverter a versão atual de {} ? manage_window.apps_table.row.actions.downgrade=Reverter versão manage_window.apps_table.row.actions.history=Histórico +manage_window.apps_table.row.actions.ignore_updates=Ignorar atualizações +manage_window.apps_table.row.actions.ignore_updates_reverse=Reverter atualizações ignoradas manage_window.apps_table.row.actions.info=Informação manage_window.apps_table.row.actions.install.popup.body=Instalar {} no seu dispositivo ? manage_window.apps_table.row.actions.install.popup.title=Instalação @@ -300,6 +306,8 @@ manage_window.settings.about=Sobre manage_window.status.downgrading=Revertendo manage_window.status.filtering=Filtrando manage_window.status.history=Obtendo histórico +manage_window.status.ignore_updates=Ignorando atualizações de {} +manage_window.status.ignore_updates_reverse=Revertendo atualizações ignoradas de {} manage_window.status.info=Obtendo informação manage_window.status.installed=Carregando instalados manage_window.status.installing=Instalando @@ -378,6 +386,7 @@ version.latest=versão mais recente version.outdated=desatualizada version.unknown=versão não informada version.updated=atualizada +version.updates_ignored=Atualizações ignoradas version=versão view.components.file_chooser.placeholder=Clique aqui para selecionar warning=aviso diff --git a/bauh/view/resources/locale/ru b/bauh/view/resources/locale/ru index 1fe98df4..5d214775 100644 --- a/bauh/view/resources/locale/ru +++ b/bauh/view/resources/locale/ru @@ -57,6 +57,10 @@ action.disk_trim.error=There was a problem while optimizing the disk action.failed=Действие не удалось action.history.no_history.body=There is no available history for {} action.history.no_history.title=No history +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Нажмите здесь, чтобы посмотреть информацию об этом приложении action.not_allowed=Действие не допускается action.request_reboot.title=System restart @@ -267,6 +271,8 @@ locale.tr=Турецкий manage_window.apps_table.row.actions.downgrade=Откат версии manage_window.apps_table.row.actions.downgrade.popup.body=Вы действительно хотите откатить версию {}? manage_window.apps_table.row.actions.history=История версий +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Информация manage_window.apps_table.row.actions.install=Установка manage_window.apps_table.row.actions.install.popup.body=Установить {} на Ваше устройство? @@ -300,6 +306,8 @@ manage_window.settings.about=О программе manage_window.status.downgrading=Откатить manage_window.status.filtering=Фильтрация manage_window.status.history=Извлечение истории +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=Извлечение информации manage_window.status.installed=Загрузка установленных manage_window.status.installing=Установить @@ -379,6 +387,7 @@ version.latest=Последняя версия version.outdated=Устаревшая version.unknown=не сообщать version.updated=Обновленная +version.updates_ignored=Updates ignored view.components.file_chooser.placeholder=Нажмите здесь, чтобы выбрать warning=Предупреждение warning.update_available=There is a new {} version available ({}). Check out the news at {}. diff --git a/bauh/view/resources/locale/tr b/bauh/view/resources/locale/tr index c9c4cf3a..a2cfdf56 100644 --- a/bauh/view/resources/locale/tr +++ b/bauh/view/resources/locale/tr @@ -57,6 +57,10 @@ action.disk_trim=Diski optimize etme ( TRIM ) action.failed=Eylem başarısız action.history.no_history.body={} için kullanılabilir geçmiş yok action.history.no_history.title=Geçmiş yok +action.ignore_updates.fail=It was not possible to ignore updates from {} +action.ignore_updates.success=Updates from {} will be ignored from now on +action.ignore_updates_reverse.fail=It was not possible to revert ignored updates from {} +action.ignore_updates_reverse.success=Updates from {} will be displayed again from now on action.info.tooltip=Uygulama bilgilerini görmek için buraya tıkla action.not_allowed=Eyleme izin verilmiyor action.request_reboot.title=Sistemi yeniden başlat @@ -267,6 +271,8 @@ locale.tr=türkçe manage_window.apps_table.row.actions.downgrade.popup.body=Gerçekten sürüm düşürmek istiyor musunuz {} ? manage_window.apps_table.row.actions.downgrade=Sürüm düşür manage_window.apps_table.row.actions.history=Tarihçe +manage_window.apps_table.row.actions.ignore_updates=Ignore updates +manage_window.apps_table.row.actions.ignore_updates_reverse=Revert ignored updates manage_window.apps_table.row.actions.info=Bilgilendirme manage_window.apps_table.row.actions.install.popup.body={} Cihazınıza yüklensin mi ? manage_window.apps_table.row.actions.install.popup.title=Kurulum @@ -300,6 +306,8 @@ manage_window.settings.about=Hakkında manage_window.status.downgrading=Düşürülüyor manage_window.status.filtering=Filtreleniyor manage_window.status.history=Geçmiş bilgisi alınıyor +manage_window.status.ignore_updates=Ignoring updates from {} +manage_window.status.ignore_updates_reverse=Reverting updates ignored from {} manage_window.status.info=Bilgilendirme alınıyor manage_window.status.installed=Yükleme tamamlandı manage_window.status.installing=Yükleniyor @@ -378,6 +386,7 @@ version.latest=son sürüm version.outdated=güncel değil version.unknown=bilgilendirilmemiş version.updated=güncellendi +version.updates_ignored=Updates ignored version=sürüm view.components.file_chooser.placeholder=Seçmek için buraya tıkla warning=uyarı diff --git a/pictures/releases/0.9.4/ignore_updates.png b/pictures/releases/0.9.4/ignore_updates.png new file mode 100644 index 0000000000000000000000000000000000000000..96be8a50762ebd0fccf3916f39af5dfa8849aba0 GIT binary patch literal 22059 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�chz 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 literal 0 HcmV?d00001