diff options
Diffstat (limited to '')
-rw-r--r-- | portato/gui/updater.py | 200 |
1 files changed, 100 insertions, 100 deletions
diff --git a/portato/gui/updater.py b/portato/gui/updater.py index c4c81e7..c4ad2a5 100644 --- a/portato/gui/updater.py +++ b/portato/gui/updater.py @@ -18,109 +18,109 @@ import threading, subprocess, time from ..helper import debug, warning, error class Updater (object): - """ - This class is intended to check what package is currently being installed and remove this one from the queue. + """ + This class is intended to check what package is currently being installed and remove this one from the queue. - @cvar SED_EXP: The sed expression to strip the package name out of the qlop call. - """ - - SED_EXP = r""" + @cvar SED_EXP: The sed expression to strip the package name out of the qlop call. + """ + + SED_EXP = r""" /\*/{ s/ \* // n } d""" - - def __init__ (self, queue, iterators, threadClass = threading.Thread): - """ - Constructor. - Also directly initializes the thread. - - @param queue: an emerge queue instance - @type queue: EmergeQueue - @param iterators: a dictionary of iterators in the current queue - @type iterators: dict(string->Iterator) - """ - - if not issubclass(threadClass, threading.Thread): - raise ValueError, "Only subclasses of threading.Thread are allowed." - - self.queue = queue - self.iterators = iterators - self.threadClass = threadClass - self.stopEvent = threading.Event() - self.removed = set() - - t = threadClass(name = "Queue Updater Thread", target = self.run) - t.setDaemon(True) - t.start() - - def run (self): - """ - Run and run and run ... - Checks the packages until being stopped. - """ - - curr = set() - while not self.stopEvent.isSet(): - - # this = $(qlop -cCq | sed $SED_EXP) - p1 = subprocess.Popen(["qlop", "--current", "--nocolor", "--quiet"], stdout = subprocess.PIPE) - this = subprocess.Popen(["sed", self.SED_EXP], stdout = subprocess.PIPE, stdin = p1.stdout).communicate()[0] - - this = set(this.split()) if this else set() - for removed in curr - this: - self.remove(self.find(removed)) # remove the previous - curr = this - - time.sleep(2.0) - - self.removed = set() - - def stop (self): - """ - Stops the current updater. - """ - self.stopEvent.set() - - def find (self, pv, masked = False): - """ - As qlop only returns 'package-version' we need to assign it to a cpv. - This is done here. - """ - - pkgs = system.find_packages("=%s" % pv, only_cpv = True, masked = masked) - - if len(pkgs) > 1: # ambigous - try to find the one which is also in the iterators - for p in pkgs: - if p in self.iterators: - return p - elif not pkgs: # nothing found =| - if not masked: - warning(_("No unmasked version of package '%s' found. Trying masked ones. This normally should not happen..."), pv) - return self.find(pv, True) - - else: - error(_("Trying to remove package '%s' from queue which does not exist in system."), pv) - return None - else: # only one choice =) - return pkgs[0] - - def remove (self, cpv): - """ - Remove a package from the queue. - """ - - if cpv is None: - debug("Nothing to remove.") - return - - if cpv in self.removed: - return - - self.removed.add(cpv) - - try: - self.queue.remove_with_children(self.iterators[cpv]) - except KeyError: - debug("'%s' should be removed, but is not in queue.", cpv) + + def __init__ (self, queue, iterators, threadClass = threading.Thread): + """ + Constructor. + Also directly initializes the thread. + + @param queue: an emerge queue instance + @type queue: EmergeQueue + @param iterators: a dictionary of iterators in the current queue + @type iterators: dict(string->Iterator) + """ + + if not issubclass(threadClass, threading.Thread): + raise ValueError, "Only subclasses of threading.Thread are allowed." + + self.queue = queue + self.iterators = iterators + self.threadClass = threadClass + self.stopEvent = threading.Event() + self.removed = set() + + t = threadClass(name = "Queue Updater Thread", target = self.run) + t.setDaemon(True) + t.start() + + def run (self): + """ + Run and run and run ... + Checks the packages until being stopped. + """ + + curr = set() + while not self.stopEvent.isSet(): + + # this = $(qlop -cCq | sed $SED_EXP) + p1 = subprocess.Popen(["qlop", "--current", "--nocolor", "--quiet"], stdout = subprocess.PIPE) + this = subprocess.Popen(["sed", self.SED_EXP], stdout = subprocess.PIPE, stdin = p1.stdout).communicate()[0] + + this = set(this.split()) if this else set() + for removed in curr - this: + self.remove(self.find(removed)) # remove the previous + curr = this + + time.sleep(2.0) + + self.removed = set() + + def stop (self): + """ + Stops the current updater. + """ + self.stopEvent.set() + + def find (self, pv, masked = False): + """ + As qlop only returns 'package-version' we need to assign it to a cpv. + This is done here. + """ + + pkgs = system.find_packages("=%s" % pv, only_cpv = True, masked = masked) + + if len(pkgs) > 1: # ambigous - try to find the one which is also in the iterators + for p in pkgs: + if p in self.iterators: + return p + elif not pkgs: # nothing found =| + if not masked: + warning(_("No unmasked version of package '%s' found. Trying masked ones. This normally should not happen..."), pv) + return self.find(pv, True) + + else: + error(_("Trying to remove package '%s' from queue which does not exist in system."), pv) + return None + else: # only one choice =) + return pkgs[0] + + def remove (self, cpv): + """ + Remove a package from the queue. + """ + + if cpv is None: + debug("Nothing to remove.") + return + + if cpv in self.removed: + return + + self.removed.add(cpv) + + try: + self.queue.remove_with_children(self.iterators[cpv]) + except KeyError: + debug("'%s' should be removed, but is not in queue.", cpv) |