mirror of
https://github.com/AdnanHodzic/auto-cpufreq.git
synced 2025-07-23 21:55:09 +02:00
Feature: Allow GUI to detect available update and install it (#587)
* rename verify_update and give return value * change verify_update call * GUI: add update feature
This commit is contained in:
parent
d3760eaf37
commit
34f3d23aa0
@ -248,7 +248,9 @@ def main(config, daemon, debug, update, install, remove, live, log, monitor, sta
|
|||||||
elif subprocess.run(["bash", "-c", "command -v pacman >/dev/null 2>&1"]).returncode == 0 and subprocess.run(["bash", "-c", "pacman -Q auto-cpufreq >/dev/null 2>&1"]).returncode == 0:
|
elif subprocess.run(["bash", "-c", "command -v pacman >/dev/null 2>&1"]).returncode == 0 and subprocess.run(["bash", "-c", "pacman -Q auto-cpufreq >/dev/null 2>&1"]).returncode == 0:
|
||||||
print("Arch-based distribution with AUR support detected. Please refresh auto-cpufreq using your AUR helper.")
|
print("Arch-based distribution with AUR support detected. Please refresh auto-cpufreq using your AUR helper.")
|
||||||
else:
|
else:
|
||||||
verify_update()
|
is_new_update = check_for_update()
|
||||||
|
if not is_new_update:
|
||||||
|
return
|
||||||
ans = input("Do you want to update auto-cpufreq to the latest release? [Y/n]: ").strip().lower()
|
ans = input("Do you want to update auto-cpufreq to the latest release? [Y/n]: ").strip().lower()
|
||||||
if not os.path.exists(custom_dir):
|
if not os.path.exists(custom_dir):
|
||||||
os.makedirs(custom_dir)
|
os.makedirs(custom_dir)
|
||||||
|
@ -11,10 +11,11 @@ from gi.repository import Gtk, GLib
|
|||||||
from auto_cpufreq.gui.app import ToolWindow
|
from auto_cpufreq.gui.app import ToolWindow
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
GLib.set_prgname("auto-cpufreq")
|
||||||
win = ToolWindow()
|
win = ToolWindow()
|
||||||
win.connect("destroy", Gtk.main_quit)
|
win.connect("destroy", Gtk.main_quit)
|
||||||
win.show_all()
|
win.show_all()
|
||||||
GLib.set_prgname("auto-cpufreq")
|
win.handle_update()
|
||||||
Gtk.main()
|
Gtk.main()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -165,7 +165,10 @@ def app_version():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(repr(e))
|
print(repr(e))
|
||||||
pass
|
pass
|
||||||
def verify_update():
|
|
||||||
|
def check_for_update():
|
||||||
|
# returns True if a new release is available from the GitHub repo
|
||||||
|
|
||||||
# Specify the repository and package name
|
# Specify the repository and package name
|
||||||
# IT IS IMPORTANT TO THAT IF THE REPOSITORY STRUCTURE IS CHANGED, THE FOLLOWING FUNCTION NEEDS TO BE UPDATED ACCORDINGLY
|
# IT IS IMPORTANT TO THAT IF THE REPOSITORY STRUCTURE IS CHANGED, THE FOLLOWING FUNCTION NEEDS TO BE UPDATED ACCORDINGLY
|
||||||
# Fetch the latest release information from GitHub API
|
# Fetch the latest release information from GitHub API
|
||||||
@ -192,10 +195,11 @@ def verify_update():
|
|||||||
# Compare the latest version with the installed version and perform update if necessary
|
# Compare the latest version with the installed version and perform update if necessary
|
||||||
if latest_version == installed_version:
|
if latest_version == installed_version:
|
||||||
print("auto-cpufreq is up to date")
|
print("auto-cpufreq is up to date")
|
||||||
exit(0)
|
return False
|
||||||
else:
|
else:
|
||||||
print(f"Updates are available,\nCurrent version: {installed_version}\nLatest version: {latest_version}")
|
print(f"Updates are available,\nCurrent version: {installed_version}\nLatest version: {latest_version}")
|
||||||
print("Note that your previous custom settings might be erased with the following update")
|
print("Note that your previous custom settings might be erased with the following update")
|
||||||
|
return True
|
||||||
|
|
||||||
def new_update(custom_dir):
|
def new_update(custom_dir):
|
||||||
os.chdir(custom_dir)
|
os.chdir(custom_dir)
|
||||||
|
@ -6,11 +6,15 @@ from gi.repository import Gtk, GLib, Gdk, Gio, GdkPixbuf
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
from contextlib import redirect_stdout
|
||||||
|
from io import StringIO
|
||||||
|
from subprocess import run, PIPE
|
||||||
|
import shutil
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
sys.path.append("../")
|
sys.path.append("../")
|
||||||
from auto_cpufreq.core import is_running
|
from auto_cpufreq.core import is_running, check_for_update, remove_daemon, new_update
|
||||||
from auto_cpufreq.gui.objects import RadioButtonView, SystemStatsLabel, CPUFreqStatsLabel, CurrentGovernorBox, DropDownMenu, DaemonNotRunningView
|
from auto_cpufreq.gui.objects import RadioButtonView, SystemStatsLabel, CPUFreqStatsLabel, CurrentGovernorBox, DropDownMenu, DaemonNotRunningView, UpdateDialog
|
||||||
|
|
||||||
if os.getenv("PKG_MARKER") == "SNAP":
|
if os.getenv("PKG_MARKER") == "SNAP":
|
||||||
ICON_FILE = "/snap/auto-cpufreq/current/icon.png"
|
ICON_FILE = "/snap/auto-cpufreq/current/icon.png"
|
||||||
@ -20,6 +24,8 @@ else:
|
|||||||
CSS_FILE = "/usr/local/share/auto-cpufreq/scripts/style.css"
|
CSS_FILE = "/usr/local/share/auto-cpufreq/scripts/style.css"
|
||||||
|
|
||||||
HBOX_PADDING = 20
|
HBOX_PADDING = 20
|
||||||
|
PKEXEC_ERROR = "Error executing command as another user: Not authorized\n\nThis incident has been reported.\n"
|
||||||
|
|
||||||
|
|
||||||
class ToolWindow(Gtk.Window):
|
class ToolWindow(Gtk.Window):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -72,6 +78,31 @@ class ToolWindow(Gtk.Window):
|
|||||||
box.pack_start(button, False, False, 0)
|
box.pack_start(button, False, False, 0)
|
||||||
self.add(box)
|
self.add(box)
|
||||||
|
|
||||||
|
def handle_update(self):
|
||||||
|
new_stdout = StringIO()
|
||||||
|
with redirect_stdout(new_stdout):
|
||||||
|
is_new_update = check_for_update()
|
||||||
|
if not is_new_update:
|
||||||
|
return
|
||||||
|
captured_output = new_stdout.getvalue().splitlines()
|
||||||
|
dialog = UpdateDialog(self, captured_output[1], captured_output[2])
|
||||||
|
response = dialog.run()
|
||||||
|
dialog.destroy()
|
||||||
|
if response != Gtk.ResponseType.YES:
|
||||||
|
return
|
||||||
|
updater = run(["pkexec", "auto-cpufreq", "--update"], input="y\n", encoding="utf-8", stderr=PIPE)
|
||||||
|
if updater.stderr == PKEXEC_ERROR:
|
||||||
|
error = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "Error updating")
|
||||||
|
error.format_secondary_text("Authorization Failed")
|
||||||
|
error.run()
|
||||||
|
error.destroy()
|
||||||
|
return
|
||||||
|
success = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Update successful")
|
||||||
|
success.format_secondary_text("The app will now close. Please reopen to apply changes")
|
||||||
|
success.run()
|
||||||
|
success.destroy()
|
||||||
|
exit(0)
|
||||||
|
|
||||||
def daemon_not_running(self):
|
def daemon_not_running(self):
|
||||||
self.box = DaemonNotRunningView(self)
|
self.box = DaemonNotRunningView(self)
|
||||||
self.add(self.box)
|
self.add(self.box)
|
||||||
|
@ -242,6 +242,23 @@ class AboutDialog(Gtk.Dialog):
|
|||||||
self.box.pack_start(self.love, False, False, 0)
|
self.box.pack_start(self.love, False, False, 0)
|
||||||
self.show_all()
|
self.show_all()
|
||||||
|
|
||||||
|
class UpdateDialog(Gtk.Dialog):
|
||||||
|
def __init__(self, parent, current_version: str, latest_version: str):
|
||||||
|
super().__init__(title="Update Available", transient_for=parent)
|
||||||
|
self.box = self.get_content_area()
|
||||||
|
self.set_default_size(400, 100)
|
||||||
|
self.add_buttons("Update", Gtk.ResponseType.YES, "Cancel", Gtk.ResponseType.NO)
|
||||||
|
self.label = Gtk.Label(label="An update is available\n")
|
||||||
|
self.current_version = Gtk.Label(label=current_version + "\n")
|
||||||
|
self.latest_version = Gtk.Label(label=latest_version + "\n")
|
||||||
|
|
||||||
|
self.box.pack_start(self.label, True, False, 0)
|
||||||
|
self.box.pack_start(self.current_version, True, False, 0)
|
||||||
|
self.box.pack_start(self.latest_version, True, False, 0)
|
||||||
|
|
||||||
|
self.show_all()
|
||||||
|
|
||||||
|
|
||||||
class ConfirmDialog(Gtk.Dialog):
|
class ConfirmDialog(Gtk.Dialog):
|
||||||
def __init__(self, parent, message: str):
|
def __init__(self, parent, message: str):
|
||||||
super().__init__(title="Confirmation", transient_for=parent)
|
super().__init__(title="Confirmation", transient_for=parent)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user