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 @@
+
+
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 @@
+
+
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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