ensure only one subprocess is running at a time
This commit is contained in:
@ -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)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user