mirror of
https://github.com/morgan9e/warehouse
synced 2026-04-14 08:14:12 +09:00
Add ability to pin and unpin runtimes
This commit is contained in:
@@ -27,12 +27,19 @@ class AppRow(Adw.ActionRow):
|
||||
|
||||
if self.mask_label.get_visible() == True:
|
||||
self.info_button.set_visible(True)
|
||||
return
|
||||
|
||||
if self.pin_label.get_visible() == True:
|
||||
self.info_button.set_visible(True)
|
||||
return
|
||||
|
||||
if self.eol_app_label.get_visible() == True:
|
||||
self.info_button.set_visible(True)
|
||||
return
|
||||
|
||||
if self.eol_runtime_label.get_visible() == True:
|
||||
self.info_button.set_visible(True)
|
||||
return
|
||||
|
||||
def set_masked(self, is_masked):
|
||||
self.mask_label.set_visible(is_masked)
|
||||
@@ -83,6 +90,18 @@ class AppRow(Adw.ActionRow):
|
||||
)
|
||||
self.mask_label.add_css_class("warning")
|
||||
|
||||
self.pin_label = Gtk.Label(
|
||||
label=_("Auto Removal Disabled"),
|
||||
visible=False,
|
||||
hexpand=True,
|
||||
wrap=True,
|
||||
valign=Gtk.Align.CENTER,
|
||||
tooltip_text=_("{} is pinned and will not be auto removed even when it's required by no app").format(
|
||||
self.app_name
|
||||
)
|
||||
)
|
||||
self.pin_label.add_css_class("warning")
|
||||
|
||||
self.eol_app_label = Gtk.Label(
|
||||
label=_("App EOL"),
|
||||
visible=False,
|
||||
@@ -128,6 +147,7 @@ class AppRow(Adw.ActionRow):
|
||||
self.info_button.add_css_class("flat")
|
||||
|
||||
info_box.append(self.mask_label)
|
||||
info_box.append(self.pin_label)
|
||||
self.add_suffix(self.info_button)
|
||||
|
||||
properties_button = Gtk.Button(
|
||||
@@ -161,6 +181,16 @@ class AppRow(Adw.ActionRow):
|
||||
advanced_menu_model = Gio.Menu()
|
||||
self.add_suffix(self.row_menu)
|
||||
|
||||
self.is_pinned = False
|
||||
|
||||
if "user" in self.install_type:
|
||||
if f"runtime/{self.app_ref}" in parent_window.user_pins:
|
||||
self.is_pinned = True
|
||||
|
||||
if "system" in self.install_type:
|
||||
if f"runtime/{self.app_ref}" in parent_window.system_pins:
|
||||
self.is_pinned = True
|
||||
|
||||
parent_window.create_action(
|
||||
("copy-name" + str(index)),
|
||||
lambda *_, name=self.app_name, toast=_(
|
||||
@@ -284,6 +314,31 @@ class AppRow(Adw.ActionRow):
|
||||
)
|
||||
advanced_menu_model.append_item(unmask_item)
|
||||
|
||||
if "runtime" in parent_window.host_flatpaks[index][12]:
|
||||
parent_window.create_action(
|
||||
("pin" + str(index)),
|
||||
lambda *_, d=self.app_id, type=self.install_type, index=index: parent_window.pin_flatpak(
|
||||
self
|
||||
),
|
||||
)
|
||||
pin_item = Gio.MenuItem.new(_("Disable Auto Removal"), f"win.pin{index}")
|
||||
pin_item.set_attribute_value(
|
||||
"hidden-when", GLib.Variant.new_string("action-disabled")
|
||||
)
|
||||
advanced_menu_model.append_item(pin_item)
|
||||
|
||||
parent_window.create_action(
|
||||
("unpin" + str(index)),
|
||||
lambda *_, d=self.app_id, type=self.install_type, index=index: parent_window.pin_flatpak(
|
||||
self
|
||||
),
|
||||
)
|
||||
unpin_item = Gio.MenuItem.new(_("Enable Auto Removal"), f"win.unpin{index}")
|
||||
unpin_item.set_attribute_value(
|
||||
"hidden-when", GLib.Variant.new_string("action-disabled")
|
||||
)
|
||||
advanced_menu_model.append_item(unpin_item)
|
||||
|
||||
if "runtime" not in parent_window.host_flatpaks[index][12]:
|
||||
parent_window.create_action(
|
||||
("snapshot" + str(index)),
|
||||
@@ -314,7 +369,13 @@ class AppRow(Adw.ActionRow):
|
||||
else:
|
||||
parent_window.lookup_action(f"unmask{index}").set_enabled(False)
|
||||
|
||||
if self.is_runtime and self.is_pinned:
|
||||
parent_window.lookup_action(f"pin{index}").set_enabled(False)
|
||||
elif self.is_runtime:
|
||||
parent_window.lookup_action(f"unpin{index}").set_enabled(False)
|
||||
self.pin_label.set_visible(self.is_pinned)
|
||||
|
||||
row_menu_model.append_section(None, advanced_menu_model)
|
||||
self.row_menu.set_menu_model(row_menu_model)
|
||||
|
||||
self.info_button_show_or_hide()
|
||||
self.info_button_show_or_hide()
|
||||
@@ -119,7 +119,7 @@ class myUtils:
|
||||
|
||||
return list
|
||||
|
||||
def get_host_pins(self):
|
||||
def get_host_system_pins(self):
|
||||
output = subprocess.run(
|
||||
["flatpak-spawn", "--host", "flatpak", "pin"],
|
||||
capture_output=True,
|
||||
@@ -131,6 +131,18 @@ class myUtils:
|
||||
data[i] = data[i].strip()
|
||||
return data
|
||||
|
||||
def get_host_user_pins(self):
|
||||
output = subprocess.run(
|
||||
["flatpak-spawn", "--host", "flatpak", "pin", "--user"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
env=self.new_env,
|
||||
).stdout
|
||||
data = output.strip().split("\n")
|
||||
for i in range(len(data)):
|
||||
data[i] = data[i].strip()
|
||||
return data
|
||||
|
||||
def get_host_remotes(self):
|
||||
output = subprocess.run(
|
||||
[
|
||||
|
||||
@@ -487,6 +487,56 @@ class WarehouseWindow(Adw.ApplicationWindow):
|
||||
dialog.connect("response", on_continue)
|
||||
dialog.present()
|
||||
|
||||
def pin_flatpak(self, row):
|
||||
def thread(*args):
|
||||
command = f"flatpak-spawn --host flatpak pin --{row.install_type} runtime/{row.app_ref}"
|
||||
if row.is_pinned:
|
||||
command += " --remove"
|
||||
response = subprocess.run(
|
||||
command,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
shell=True
|
||||
).stderr
|
||||
if response != "" and row.is_pinned:
|
||||
GLib.idle_add(self.toast_overlay.add_toast(Adw.Toast.new(_("Could not enable auto removal"))))
|
||||
return
|
||||
elif response != "":
|
||||
GLib.idle_add(self.toast_overlay.add_toast(Adw.Toast.new(_("Could not disable auto removal"))))
|
||||
return
|
||||
row.is_pinned = not row.is_pinned
|
||||
GLib.idle_add(lambda *_, row=row: self.lookup_action(f"pin{row.index}").set_enabled(not row.is_pinned))
|
||||
GLib.idle_add(lambda *_, row=row: self.lookup_action(f"unpin{row.index}").set_enabled(row.is_pinned))
|
||||
GLib.idle_add(lambda *_, row=row: row.pin_label.set_visible(row.is_pinned))
|
||||
GLib.idle_add(lambda *_, row=row: row.info_button_show_or_hide())
|
||||
|
||||
def callback(*args):
|
||||
print("done")
|
||||
|
||||
def on_continue(dialog, response):
|
||||
if response == "cancel":
|
||||
return
|
||||
|
||||
task = Gio.Task.new(None, None, None)
|
||||
task.run_in_thread(thread)
|
||||
|
||||
if row.is_pinned:
|
||||
on_continue(self, None)
|
||||
else:
|
||||
dialog = Adw.AlertDialog.new(
|
||||
_(
|
||||
"Disable Automatic Removal for {}?"
|
||||
).format(row.app_name),
|
||||
_(
|
||||
"This will pin {} ensuring it well never be removed automatically, even if no app depends on it."
|
||||
).format(row.app_name),
|
||||
)
|
||||
dialog.add_response("cancel", _("Cancel"))
|
||||
dialog.set_close_response("cancel")
|
||||
dialog.connect("response", on_continue)
|
||||
dialog.add_response("continue", _("Disable Auto Removal"))
|
||||
dialog.present(self)
|
||||
|
||||
def copy_item(self, to_copy, to_toast=None):
|
||||
self.clipboard.set(to_copy)
|
||||
if to_toast:
|
||||
@@ -864,6 +914,9 @@ class WarehouseWindow(Adw.ApplicationWindow):
|
||||
"is-fullscreen", self, "fullscreened", Gio.SettingsBindFlags.DEFAULT
|
||||
)
|
||||
|
||||
self.system_pins = self.my_utils.get_host_system_pins()
|
||||
self.user_pins = self.my_utils.get_host_user_pins()
|
||||
|
||||
self.new_env = dict(os.environ)
|
||||
self.new_env["LC_ALL"] = "C"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user