From 6111d4f2d3c1b27daa587692e2188f6db4aaade0 Mon Sep 17 00:00:00 2001 From: heliguy Date: Sun, 7 Jul 2024 21:54:32 -0400 Subject: [PATCH] Handle masked, pinned, and EOL packages --- src/host_info.py | 34 ++++++++++++++++++++++++++++-- src/packages_page/packages_page.py | 13 ++++++++---- src/widgets/app_row.blp | 14 +++++++----- src/widgets/app_row.py | 4 ++++ 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/host_info.py b/src/host_info.py index 5e93ea4..c5539e2 100644 --- a/src/host_info.py +++ b/src/host_info.py @@ -88,7 +88,18 @@ class Flatpak: else: self.info["installation"] = installation - self.is_masked = self.info["id"] in HostInfo.masks[self.info["installation"]] + self.is_eol = "eol=" in self.info["options"] + self.dependant_runtime = None + + try: + self.is_masked = self.info["id"] in HostInfo.masks[self.info["installation"]] + except KeyError: + self.is_masked = False + + try: + self.is_pinned = f"runtime/{self.info['ref']}" in HostInfo.pins[self.info["installation"]] + except KeyError: + self.is_pinned = False try: self.icon_path = ( @@ -123,6 +134,7 @@ class HostInfo: icon_theme.add_search_path(f"{i}/exports/share/icons") flatpaks = [] + ref_to_flatpak = {} remotes = [] installations = [] masks = {} @@ -131,6 +143,7 @@ class HostInfo: def get_flatpaks(this, callback=None): # Callback is a function to run after the host flatpaks are found this.flatpaks.clear() + this.ref_to_flatpak.clear() this.remotes.clear() this.installations.clear() this.masks.clear() @@ -212,7 +225,24 @@ class HostInfo: ).stdout lines = output.strip().split("\n") for i in lines: - this.flatpaks.append(Flatpak(i.split("\t"))) + package = Flatpak(i.split("\t")) + this.flatpaks.append(package) + this.ref_to_flatpak[package.info["ref"]] = package + + # Dependant Runtimes + output = subprocess.run( + ['flatpak-spawn', '--host', + 'flatpak', 'list', '--columns=runtime'], + text=True, + capture_output=True, + ).stdout + lines = output.strip().split("\n") + for index, runtime in enumerate(lines): + package = this.flatpaks[index] + if package.is_runtime: + continue + package.dependant_runtime = this.ref_to_flatpak[runtime] + this.flatpaks = sorted(this.flatpaks, key=lambda flatpak: flatpak.info["name"].lower()) Gio.Task.new(None, None, callback).run_in_thread(thread) \ No newline at end of file diff --git a/src/packages_page/packages_page.py b/src/packages_page/packages_page.py index b0eb4aa..c8058ac 100644 --- a/src/packages_page/packages_page.py +++ b/src/packages_page/packages_page.py @@ -27,11 +27,16 @@ class PackagesPage(Adw.BreakpointBin): self.packages_list_box.remove_all() for package in HostInfo.flatpaks: row = AppRow(package) - app_id = package.info["id"] - installation = package.info["installation"] - if package.is_masked: - row.add_css_class("warning") + row.masked_status_icon.set_visible(package.is_masked) + row.pinned_status_icon.set_visible(package.is_pinned) + row.eol_package_package_status_icon.set_visible(package.is_eol) + try: + if not package.is_runtime: + row.eol_runtime_status_icon.set_visible(package.dependant_runtime.is_eol) + except Exception as e: + self.packages_toast_overlay.add_toast(ErrorToast(_("Error getting Flatpak '{}'").format(package.info["name"]), str(e)).toast) self.packages_list_box.append(row) + first_row = self.packages_list_box.get_row_at_index(0) self.packages_list_box.select_row(first_row) self.properties_page.set_properties(first_row.package) diff --git a/src/widgets/app_row.blp b/src/widgets/app_row.blp index 5b21f44..0d6be8e 100644 --- a/src/widgets/app_row.blp +++ b/src/widgets/app_row.blp @@ -9,26 +9,30 @@ template $AppRow : Adw.ActionRow { icon-name: "application-x-executable-symbolic"; } [suffix] - Image eol_package_label { - icon-name: "error-small-symbolic"; + Image eol_package_package_status_icon { + icon-name: "error-symbolic"; tooltip-text: _("This package is End Of Life, and will not recieve any security updates"); + visible: false; styles["error"] } [suffix] - Image eol_runtime_label { - icon-name: "error-small-symbolic"; + Image eol_runtime_status_icon { + icon-name: "error-symbolic"; tooltip-text: _("This app's runtime is End Of Life, and will not recieve any security updates"); + visible: false; styles["error"] } [suffix] Image pinned_status_icon { - icon-name: "pin-small-symbolic"; + icon-name: "pin-symbolic"; tooltip-text: _("This runtime will never be automatically removed"); + visible: false; } [suffix] Image masked_status_icon { icon-name: "software-update-urgent-symbolic"; tooltip-text: _("Updates are disabled for this package"); + visible: false; } [suffix] CheckButton check_button { diff --git a/src/widgets/app_row.py b/src/widgets/app_row.py index d6a27c0..a17a50d 100644 --- a/src/widgets/app_row.py +++ b/src/widgets/app_row.py @@ -6,6 +6,10 @@ class AppRow(Adw.ActionRow): __gtype_name__ = 'AppRow' gtc = Gtk.Template.Child image = gtc() + eol_package_package_status_icon = gtc() + eol_runtime_status_icon = gtc() + pinned_status_icon = gtc() + masked_status_icon = gtc() check_button = gtc() def __init__(self, package, **kwargs):