From 943af1a3162674f7936e8855798ef3f2349c03e8 Mon Sep 17 00:00:00 2001 From: Tilman Kranz Date: Fri, 21 Jul 2023 12:52:51 +0200 Subject: [PATCH] ensure only one subprocess is running at a time --- bin/simple-apt-update | 77 +++++++++++++++++++++------------ res/icons/simple-apt-update.svg | 59 +++---------------------- 2 files changed, 55 insertions(+), 81 deletions(-) diff --git a/bin/simple-apt-update b/bin/simple-apt-update index 6c1f853..e158148 100755 --- a/bin/simple-apt-update +++ b/bin/simple-apt-update @@ -60,9 +60,8 @@ class UpdateWindow(Gtk.ApplicationWindow): self.buffer.set_text("") def scroll_to_bottom(self): - adj = self.scrolledwindow.get_vadjustment() - adj.set_value(adj.get_upper()) - self.scrolledwindow.set_vadjustment(adj) + self.buffer.get_end_iter() + self.text_view.scroll_to_mark(self.text_mark_end, 0, False, 0, 0) def level_to_color(self, level): if level == "INFO": @@ -113,6 +112,25 @@ class UpdateWindow(Gtk.ApplicationWindow): def insert(self, text, iter): self.buffer.insert(iter, text + "\n") + def run_thread(self, args, env): + if self.thread is None: + do_run = True + elif not self.thread.is_alive(): + do_run = True + else: + do_run = False + + if do_run: + self.thread = threading.Thread( + target=self.run, + args=(args, env,)) + + self.thread.start() + + return False + else: + return True + def execute( self, args, @@ -136,11 +154,7 @@ class UpdateWindow(Gtk.ApplicationWindow): "INFO", "Running command \"%s\" ..." % " ".join(args)) - thread = threading.Thread( - target=self.run, - args=(args, env,)) - - thread.start() + GLib.timeout_add(250, self.run_thread, args, env) def run(self, args, env={}): p = subprocess.Popen( @@ -192,16 +206,15 @@ class UpdateWindow(Gtk.ApplicationWindow): env=env, empty_msg="No package upgrades were performed.") - def on_upgrade(self, *args): - self.upgrade() - def update(self, clear=True): args = ['/usr/bin/apt-get', '-y', 'update'] env = {'DEBIAN_FRONTEND': 'noninteractive'} - self.execute(args, env=env, clear=clear) - - def on_update(self, *args): - self.update() + self.execute( + args, + env=env, + clear=clear, + output_msg="The package cache was refreshed." + ) def list(self, clear=True): args = ['/usr/bin/apt', '-qq', 'list', '--upgradable'] @@ -210,7 +223,14 @@ class UpdateWindow(Gtk.ApplicationWindow): ignore_stderr=True, clear=clear, output_msg="Found the following package upgrades:", - empty_msg="No package upgrades found.") + empty_msg="No package upgrades found." + ) + + def on_update(self, *args): + self.update() + + def on_upgrade(self, *args): + self.upgrade() def on_list(self, *args): self.list() @@ -228,15 +248,17 @@ class UpdateWindow(Gtk.ApplicationWindow): self.append_mesg("STDOUT", text) else: exit_code = int(match.group(1)) + self.thread.join() if exit_code != 0: self.append_mesg( "ERROR", - "Command exited with code %d" % exit_code) + "Command exited with code %d" % exit_code + ) elif self.stdout == '' and self.empty_msg is not None: self.append_mesg("INFO", self.empty_msg) elif self.stdout != '' and self.output_msg is not None: - self.append_mesg("INFO", self.empty_msg) + self.append_mesg("INFO", self.output_msg) self.unlock() @@ -265,6 +287,7 @@ class UpdateWindow(Gtk.ApplicationWindow): ) self.application = application + self.thread = None self.stdout_queue = queue.Queue() self.stderr_queue = queue.Queue() @@ -327,12 +350,16 @@ class UpdateWindow(Gtk.ApplicationWindow): self.scrolledwindow.set_max_content_height(300) self.buffer = Gtk.TextBuffer() - text_view = Gtk.TextView(buffer=self.buffer) - text_view.set_editable(False) - text_view.set_monospace(True) - text_view.set_cursor_visible(False) + self.text_view = Gtk.TextView(buffer=self.buffer) + self.text_view.set_editable(False) + self.text_view.set_monospace(True) + self.text_view.set_cursor_visible(False) - self.scrolledwindow.add(text_view) + text_buffer = self.text_view.get_buffer() + iter = text_buffer.get_end_iter() + self.text_mark_end = text_buffer.create_mark("", iter, False) + + self.scrolledwindow.add(self.text_view) hbox.pack_start(self.scrolledwindow, True, True, 0) @@ -350,9 +377,6 @@ class SimpleAptUpdate(Gtk.Application): signal.signal(signal.SIGINT, signal.SIG_DFL) - def do_command_line(self, cmdline): - pass - def on_activate(self, application): self.window = UpdateWindow(application) @@ -381,7 +405,6 @@ class SimpleAptUpdate(Gtk.Application): self.window.present() self.window.show_all() - self.window.update() self.window.list(clear=False) diff --git a/res/icons/simple-apt-update.svg b/res/icons/simple-apt-update.svg index 5d60243..ebcd35d 100644 --- a/res/icons/simple-apt-update.svg +++ b/res/icons/simple-apt-update.svg @@ -7,19 +7,14 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="31.72216mm" height="36.307823mm" viewBox="0 0 31.72216 36.307823" version="1.1" - id="svg8" - inkscape:version="1.0.2 (e86c870879, 2021-01-15)" - sodipodi:docname="simple-apt-update.svg"> + id="svg8"> + orient="auto"> - - @@ -170,8 +127,6 @@ + ry="2.9184699" /> + id="path1321" /> + id="path1869" />