diff options
Diffstat (limited to '')
-rw-r--r-- | geneticone/gui/windows.py (renamed from geneticone/gui/main.py) | 235 |
1 files changed, 4 insertions, 231 deletions
diff --git a/geneticone/gui/main.py b/geneticone/gui/windows.py index 93decf2..02613db 100644 --- a/geneticone/gui/main.py +++ b/geneticone/gui/windows.py @@ -1,7 +1,5 @@ -#!/usr/bin/python - # -# File: geneticone/gui/main.py +# File: geneticone/gui/windows.py # This file is part of the Genetic/One-Project, a graphical portage-frontend. # # Copyright (C) 2006 Necoro d.M. @@ -17,20 +15,15 @@ VERSION = "0.3.1" MENU_EMERGE = 1 MENU_UNEMERGE = 2 -import geneticone -from geneticone import flags - # gtk stuff import pygtk pygtk.require("2.0") import gtk import gobject -# for doing emerge -from subprocess import * - -# threading -from threading import Thread +import geneticone +from geneticone import flags +from gui_helper import * # for the terminal import pty @@ -39,221 +32,6 @@ import vte # other from portage_util import unique_array -class EmergeQueue: - """This class manages the emerge queue.""" - - - def __init__ (self, tree = None, console = None, packages = None): - """Constructor. - - @param tree: Tree to append all the items to. Default: None. - @type tree: gtk.TreeStore - @param console: Output is shown here. Default: None - @type console: vte.Terminal - @param packages: The list of packages sorted by categories. We will delete the appropriate category if we updated sth. Default: None - @type packages: dictionary: {category: list_of_packages}.""" - - self.mergequeue = [] - self.unmergequeue = [] - self.iters = {} - self.deps = {} - self.tree = tree - self.console = console - self.packages = packages - - if self.tree: - self.emergeIt = self.tree.append(None, ["Emerge"]) - self.unmergeIt = self.tree.append(None, ["Unmerge"]) - else: - self.emergeIt = self.unmergeIt = None - - def update_tree (self, it, cpv): - """This updates the tree recursivly. - - @param it: iterator where to append - @type it: gtk.TreeIter - @param cpv: The package to append. - @type cpv: string (cat/pkg-ver) - - @raise geneticone.BlockedException: When occured during dependency-calculation.""" - - # get depencies - if cpv in self.deps: - return # in list already - else: - deps = geneticone.find_packages("="+cpv)[0].get_dep_packages() - self.deps.update({cpv : deps}) - - subIt = self.tree.append(it, [cpv]) - - # recursive call - for d in deps: - try: - self.update_tree(subIt, d) - except geneticone.BlockedException, e: - # remove the project - while self.tree.iter_parent(subIt): - subIt = self.tree.iter_parent(subIt) - self.remove_children(subIt) - raise e - - # add iter - self.iters.update({cpv: subIt}) - - def append (self, cpv, unmerge = False, update = False): - """Appends a cpv either to the merge queue or to the unmerge-queue. - Also updates the tree-view. - - @param cpv: Package to add - @type cpv: string (cat/pkg-ver) - @param unmerge: Set to True if you want to unmerge this package - else False. Default: False - @type unmerge: boolean - @param update: Set to True if a package is going to be updated (e.g. if the use-flags changed). Default: False - @type update: boolean""" - - if not unmerge: - try: - # insert dependencies - pkg = geneticone.find_packages("="+cpv)[0] - deps = pkg.get_dep_packages() - - if update: - if deps == self.deps[cpv]: - return # nothing changed - return - else: - parentIt = self.tree.iter_parent(self.iters[cpv]) - self.remove_children(self.iters[cpv], False) # this is needed to def delete everything - self.remove(self.iters[cpv], False) - self.update_tree(parentIt, cpv) - else: # not update - self.mergequeue.append(cpv) - if self.emergeIt: self.update_tree(self.emergeIt, cpv) - - except geneticone.BlockedException, e : # there is sth blocked --> call blocked_dialog - blocks = e[0] - blocked_dialog(cpv, blocks) - return - else: # unmerge - self.unmergequeue.append(cpv) - if self.unmergeIt: # update tree - self.tree.append(self.unmergeIt, [cpv]) - - def _update_packages(self, packages, process = None): - """This updates the packages-list. It simply removes all affected categories so they have to be rebuilt. - - @param packages: The packages which we emerged. - @type packages: list of cpvs - @param process: The process we have to wait for before we can do our work. Default: None. - @type process: subprocess.Popen""" - - if process: process.wait() - for p in packages: - try: - cat = geneticone.split_package_name(p)[0] # get category - while cat[0] in ["=",">","<","!"]: - cat = cat[1:] - print "Category: "+cat , - del self.packages[cat] - print "marked for refreshing" - except KeyError: # not in self.packages - ignore - pass - - def _emerge (self, options, packages, it): - """Calls emerge and updates the terminal. - - @param options: options to send to emerge - @type options: list - @param packages: packages to emerge - @type packages: list - @param it: Iterator which points to an entry whose children will be removed after completion. - @type it: gtk.TreeIter""" - - # open tty - (master, slave) = pty.openpty() - self.console.set_pty(master) - - # start emerge - process = Popen(["/usr/bin/python","/usr/bin/emerge"]+options+packages, stdout = slave, stderr = STDOUT, shell = False) - Thread(target=self._update_packages, args=(packages, process)).start() - - # remove - self.remove_children(it) - - def emerge (self, force = False): - """Emerges everything in the merge-queue. - - @param force: If False, '-pv' is send to emerge. Default: False. - @type force: boolean""" - - if len(self.mergequeue) == 0: return # nothing in queue - - # prepare package-list - list = [] - for k in self.mergequeue: - list += ["="+k] - - s = [] - if not force: s = ["-pv"] - - self._emerge(s, list, self.emergeIt) - - def unmerge (self, force = False): - """Unmerges everything in the umerge-queue. - - @param force: If False, '-pv' is send to emerge. Default: False. - @type force: boolean""" - - if len(self.unmergequeue) == 0: return # nothing in queue - - list = self.unmergequeue[:] # copy the unmerge-queue - - # set options - s = ["-C"] - if not force: s = ["-Cpv"] - - self._emerge(s,list, self.unmergeIt) - - def remove_children (self, parentIt, removeNewFlags = True): - """Removes all children of a given parent TreeIter recursivly. - - @param parentIt: The iter from which to remove all children. - @type parentIt: gtk.TreeIter - @param removeNewFlags: True if new flags should be removed; False otherwise. Default: True. - @type removeNewFlags: boolean""" - - childIt = self.tree.iter_children(parentIt) - - while childIt: - if (self.tree.iter_has_child(childIt)): # recursive call - self.remove_children(childIt, removeNewFlags) - temp = childIt - childIt = self.tree.iter_next(childIt) - self.remove(temp, removeNewFlags) - - def remove (self, it, removeNewFlags = True): - """Removes a specific item in the tree. This does not remove the top-entries. - - @param it: Iterator which points to the entry we are going to remove. - @type it: gtk.TreeIter - @param removeNewFlags: True if new flags should be removed; False otherwise. Default: True. - @type removeNewFlags: boolean""" - - if self.tree.iter_parent(it): # NEVER remove our top stuff - cpv = self.tree.get_value(it,0) - if self.tree.get_string_from_iter(it).split(":")[0] == self.tree.get_string_from_iter(self.emergeIt): # in Emerge - del self.iters[cpv] - del self.deps[cpv] - try: - self.mergequeue.remove(cpv) - except ValueError: # this is a dependency - ignore - pass - if removeNewFlags: flags.remove_new_use_flags(cpv) - - else: # in Unmerge - self.unmergequeue.remove(cpv) - - self.tree.remove(it) - class AboutWindow: def __init__ (self, parent): @@ -846,8 +624,3 @@ class MainWindow: # now subthreads can run normally, but are not allowed to touch the GUI. If threads should change sth there - use gobject.idle_add(). # for more informations on threading and gtk: http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.006.htp gtk.main() - -def blocked_dialog (blocked, blocks): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, blocked+" is blocked by "+blocks+".\nPlease unmerge the blocking package.") - dialog.run() - dialog.destroy() |