diff --git a/CHANGELOG.md b/CHANGELOG.md index fa45bd9b..06b452c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,20 @@ 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.6.2] 2019-09- +### Improvements +- Update notifications showing the number of updates by type as well + +### Fixes +- Update-check daemon not showing notifications + ## [0.6.1] 2019-09-26 -### Improvements: +### Improvements - Better warning presentation when there are several messages - Better AUR update check handling - "Show" button available for all information fields -### Fixes: +### Fixes - Error when retrieving suggestions - snapd health check when snapd.service is available - AUR: not showing all optional dependencies ( Info ) diff --git a/bauh/api/abstract/controller.py b/bauh/api/abstract/controller.py index abb3d4b6..6c3b1370 100644 --- a/bauh/api/abstract/controller.py +++ b/bauh/api/abstract/controller.py @@ -196,8 +196,9 @@ class SoftwareManager(ABC): pass @abstractmethod - def list_updates(self) -> List[PackageUpdate]: + def list_updates(self, internet_available: bool) -> List[PackageUpdate]: """ + :param internet_available :return: available package updates """ pass diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 38dccd7d..b764439d 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -689,8 +689,9 @@ class ArchManager(SoftwareManager): self.comp_optimizer.start() self.aur_index_updater.start() - def list_updates(self) -> List[PackageUpdate]: - return [PackageUpdate(app.id, app.latest_version, 'aur') for app in self.read_installed(disk_loader=None).installed if app.update] + def list_updates(self, internet_available: bool) -> List[PackageUpdate]: + installed = self.read_installed(disk_loader=None, internet_available=internet_available).installed + return [PackageUpdate(p.id, p.latest_version, 'aur') for p in installed if p.update] def list_warnings(self) -> List[str]: warnings = [] diff --git a/bauh/gems/flatpak/controller.py b/bauh/gems/flatpak/controller.py index 0a279119..018b898f 100644 --- a/bauh/gems/flatpak/controller.py +++ b/bauh/gems/flatpak/controller.py @@ -184,26 +184,28 @@ class FlatpakManager(SoftwareManager): def prepare(self): pass - def list_updates(self) -> List[PackageUpdate]: - to_update = [app for app in self.read_installed(None).installed if app.update] + def list_updates(self, internet_available: bool) -> List[PackageUpdate]: updates = [] + installed = self.read_installed(None, internet_available=internet_available).installed + + to_update = [p for p in installed if p.update] if to_update: - loaders = [] + loaders = [] - for app in to_update: - if app.is_application(): - loader = FlatpakUpdateLoader(app=app, http_client=self.context.http_client) - loader.start() - loaders.append(loader) + for app in to_update: + if app.is_application(): + loader = FlatpakUpdateLoader(app=app, http_client=self.context.http_client) + loader.start() + loaders.append(loader) - for loader in loaders: - loader.join() + for loader in loaders: + loader.join() - for app in to_update: - updates.append(PackageUpdate(pkg_id='{}:{}'.format(app.id, app.branch), - pkg_type='flatpak', - version=app.version)) + for app in to_update: + updates.append(PackageUpdate(pkg_id='{}:{}'.format(app.id, app.branch), + pkg_type='flatpak', + version=app.version)) return updates diff --git a/bauh/gems/snap/controller.py b/bauh/gems/snap/controller.py index 1bcbd3a4..7496f730 100644 --- a/bauh/gems/snap/controller.py +++ b/bauh/gems/snap/controller.py @@ -140,7 +140,7 @@ class SnapManager(SoftwareManager): def prepare(self): pass - def list_updates(self) -> List[PackageUpdate]: + def list_updates(self, internet_available: bool) -> List[PackageUpdate]: pass def list_warnings(self) -> List[str]: diff --git a/bauh/view/core/controller.py b/bauh/view/core/controller.py index f7a2ff67..1ce55f1e 100755 --- a/bauh/view/core/controller.py +++ b/bauh/view/core/controller.py @@ -143,12 +143,12 @@ class GenericSoftwareManager(SoftwareManager): t.start() return t - def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult: + def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, net_check: bool = None) -> SearchResult: ti = time.time() self._wait_to_be_ready() - internet_available = {} - thread_internet_check = self._get_internet_check(internet_available) + net_check = {} + thread_internet_check = self._get_internet_check(net_check) res = SearchResult([], None, 0) @@ -165,7 +165,7 @@ class GenericSoftwareManager(SoftwareManager): thread_internet_check.join() mti = time.time() - man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available['available']) + man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_check['available']) mtf = time.time() self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti)) @@ -184,7 +184,7 @@ class GenericSoftwareManager(SoftwareManager): thread_internet_check.join() mti = time.time() - man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available['available']) + man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_check['available']) mtf = time.time() self.logger.info(man.__class__.__name__ + " took {0:.2f} seconds".format(mtf - mti)) @@ -286,15 +286,22 @@ class GenericSoftwareManager(SoftwareManager): self.thread_prepare = Thread(target=self._prepare) self.thread_prepare.start() - def list_updates(self) -> List[PackageUpdate]: + def list_updates(self, net_check: bool = None) -> List[PackageUpdate]: self._wait_to_be_ready() updates = [] if self.managers: + net_check = {} + thread_internet_check = self._get_internet_check(net_check) + for man in self.managers: if self._can_work(man): - man_updates = man.list_updates() + + if thread_internet_check.is_alive(): + thread_internet_check.join() + + man_updates = man.list_updates(internet_available=net_check['available']) if man_updates: updates.extend(man_updates) diff --git a/bauh/view/qt/systray.py b/bauh/view/qt/systray.py index 0b5d1cab..a3c6ce91 100755 --- a/bauh/view/qt/systray.py +++ b/bauh/view/qt/systray.py @@ -1,4 +1,5 @@ import time +from io import StringIO from threading import Lock, Thread from typing import List @@ -96,7 +97,22 @@ class TrayIcon(QSystemTrayIcon): if update_keys.difference(self.last_updates): self.last_updates = update_keys n_updates = len(updates) - msg = self.i18n['notification.update{}'.format('' if n_updates == 1 else 's')].format(n_updates) + ups_by_type = {} + + for key in update_keys: + ptype = key.split(':')[0] + count = ups_by_type.get(ptype) + count = 1 if count is None else count + 1 + ups_by_type[ptype] = count + + msg = StringIO() + msg.write(self.i18n['notification.update{}'.format('' if n_updates == 1 else 's')].format(n_updates)) + + for ptype, count in ups_by_type.items(): + msg.write('\n * {} ( {} )'.format(ptype.capitalize(), count)) + + msg.seek(0) + msg = msg.read() self.setToolTip(msg) if self.update_notification and notify_user: