diff options
Diffstat (limited to 'portato')
-rw-r--r-- | portato/backend/package.py | 5 | ||||
-rw-r--r-- | portato/constants.py | 2 | ||||
-rw-r--r-- | portato/dependency.py | 39 | ||||
-rw-r--r-- | portato/gui/windows/main.py | 15 | ||||
-rw-r--r-- | portato/gui/windows/preference.py | 12 | ||||
-rw-r--r-- | portato/plistener.py | 5 | ||||
-rw-r--r-- | portato/plugins/etc_proposals.py | 2 | ||||
-rw-r--r-- | portato/plugins/new_version.py | 42 | ||||
-rw-r--r-- | portato/plugins/notify.py | 2 |
9 files changed, 103 insertions, 21 deletions
diff --git a/portato/backend/package.py b/portato/backend/package.py index 4d3803f..78a4b1f 100644 --- a/portato/backend/package.py +++ b/portato/backend/package.py @@ -177,6 +177,7 @@ class Package (_Package): """ deps = " ".join(map(self.get_package_settings, ("RDEPEND", "PDEPEND", "DEPEND"))) deps = paren_reduce(deps) + debug("Dependencies: %s", deps) tree = DependencyTree() @@ -193,9 +194,9 @@ class Package (_Package): elif dep == "||": n = iter.next() # skip if not hasattr(n, "__iter__"): - n = tuple(n,) + n = [n] else: - n = tuple(n) + n = list(n) tree.add_or(n) diff --git a/portato/constants.py b/portato/constants.py index 50975d1..1257256 100644 --- a/portato/constants.py +++ b/portato/constants.py @@ -63,7 +63,7 @@ SU_COMMAND = "gksu -D 'Portato'" USE_CATAPULT = True # config -CONFIG_DIR = "/home/necoro/dev/portato/version_list/etc/" +CONFIG_DIR = "/etc/portato/" CONFIG_LOCATION = pjoin(CONFIG_DIR, "portato.cfg") SESSION_DIR = pjoin(os.environ["HOME"], ".portato") diff --git a/portato/dependency.py b/portato/dependency.py index a52a630..cefc6ad 100644 --- a/portato/dependency.py +++ b/portato/dependency.py @@ -77,8 +77,8 @@ class OrDependency (Dependency): :IVariables: - dep : tuple(string,...) - The dependency strings. The tuple and the strings are immutable. + dep : tuple(`Dependency`,...) + The dependencies. The tuple and the dependencies are immutable. """ def __init__ (self, deps): @@ -89,13 +89,46 @@ class OrDependency (Dependency): :type deps: iter<string> """ - self._dep = tuple(Dependency(dep) for dep in deps) + _dep = [] + for dep in deps: + if not hasattr(dep, "__iter__"): + _dep.append(Dependency(dep)) + else: + _dep.append(AllOfDependency(dep)) + + self._dep = tuple(_dep) def __str__ (self): return "<|| %s>" % str(self.dep) __repr__ = __str__ +class AllOfDependency (Dependency): + """ + Dependency representing a set of packages inside "or". + If the or is: ``|| (a ( b c ) )`` the `AllOfDependency` would be the ``( b c )``. + + :IVariables: + + dep : tuple(`Dependency`,...) + The dependencies . The tuple and the deps are immutable. + """ + + def __init__ (self, deps): + """ + Creates an or-dependency out of a list (or tuple) of deps. + + :param deps: The dependencies. + :type deps: iter<string> + """ + + self._dep = tuple(Dependency(dep) for dep in deps) + + def __str__ (self): + return "<ALL %s>" % str(self.dep) + + __repr__ = __str__ + class DependencyTree (object): """ diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 7ce66b8..cde7461 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -254,7 +254,12 @@ class PackageTable: orit = store.append(it, [self.icons["or"], _("One of the following")]) for dep in ordep.dep: - store.append(orit, [get_icon(dep), dep.dep]) + if isinstance(dep, dependency.AllOfDependency): # a list inside or + allit = store.append(orit, [None, _("All of the following")]) + for adep in dep.dep: + store.append(allit, [get_icon(adep), adep.dep]) + else: + store.append(orit, [get_icon(dep), dep.dep]) # normal def sort_key (x): @@ -744,7 +749,7 @@ class MainWindow (Window): # notebooks self.sysNotebook = self.tree.get_widget("systemNotebook") self.pkgNotebook = self.tree.get_widget("packageNotebook") - self.set_notebook_tabpos(map(PreferenceWindow.tabpos.get, map(int, (self.cfg.get("packageTabPos", "GTK"), self.cfg.get("systemTabPos", "GTK"))))) + self.set_notebook_tabpos(map(PreferenceWindow.tabpos.get, map(int, (self.cfg.get("packageTabPos", "GUI"), self.cfg.get("systemTabPos", "GUI"))))) # the different scrolls ebuildScroll = self.tree.get_widget("ebuildScroll") @@ -820,7 +825,7 @@ class MainWindow (Window): self.console.set_scrollback_lines(1024) self.console.set_scroll_on_output(True) - self.console.set_font_from_string(self.cfg.get("consolefont", "GTK")) + self.console.set_font_from_string(self.cfg.get("consolefont", "GUI")) self.console.connect("button-press-event", self.cb_right_click) self.termHB.pack_start(self.console, True, True) @@ -1687,7 +1692,7 @@ class MainWindow (Window): """ Main. """ - plugin.hook("thread_init")(gobject.threads_init)() + gobject.threads_init() # 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() + plugin.hook("main")(gtk.main)() diff --git a/portato/gui/windows/preference.py b/portato/gui/windows/preference.py index d69c99c..41db921 100644 --- a/portato/gui/windows/preference.py +++ b/portato/gui/windows/preference.py @@ -104,7 +104,7 @@ class PreferenceWindow (AbstractDialog): # the console font button self.consoleFontBtn = self.tree.get_widget("consoleFontBtn") - self.consoleFontBtn.set_font_name(self.cfg.get("consolefont", section = "GTK")) + self.consoleFontBtn.set_font_name(self.cfg.get("consolefont", section = "GUI")) # the comboboxes self.systemTabCombo = self.tree.get_widget("systemTabCombo") @@ -116,8 +116,8 @@ class PreferenceWindow (AbstractDialog): for i in (_("Top"), _("Bottom"), _("Left"), _("Right")): m.append((i,)) - self.systemTabCombo.set_active(int(self.cfg.get("systemTabPos", section = "GTK"))-1) - self.pkgTabCombo.set_active(int(self.cfg.get("packageTabPos", section = "GTK"))-1) + self.systemTabCombo.set_active(int(self.cfg.get("systemTabPos", section = "GUI"))-1) + self.pkgTabCombo.set_active(int(self.cfg.get("packageTabPos", section = "GUI"))-1) self.window.show_all() @@ -137,14 +137,14 @@ class PreferenceWindow (AbstractDialog): self.cfg.set(val,self.tree.get_widget(edit).get_text()) font = self.consoleFontBtn.get_font_name() - self.cfg.set("consolefont", font, section = "GTK") + self.cfg.set("consolefont", font, section = "GUI") self.console_fn(font) pkgPos = self.pkgTabCombo.get_active()+1 sysPos = self.systemTabCombo.get_active()+1 - self.cfg.set("packageTabPos", str(pkgPos), section = "GTK") - self.cfg.set("systemTabPos", str(sysPos), section = "GTK") + self.cfg.set("packageTabPos", str(pkgPos), section = "GUI") + self.cfg.set("systemTabPos", str(sysPos), section = "GUI") self.tabpos_fn(map(self.tabpos.get, (pkgPos, sysPos))) diff --git a/portato/plistener.py b/portato/plistener.py index b5948ca..2e35ccb 100644 --- a/portato/plistener.py +++ b/portato/plistener.py @@ -71,7 +71,7 @@ class PListener (object): Popen(cmdlist) - def do_notify(self, base, descr, icon, urgency): + def do_notify(self, base, descr, icon, urgency = None): """Displays a notify. This will do nothing if pynotify is not present and/or root is running the listener.""" @@ -80,7 +80,8 @@ class PListener (object): pynotify.init(APP) n = pynotify.Notification(base, descr, icon) - n.set_urgency(int(urgency)) + if urgency is not None and urgency != "": + n.set_urgency(int(urgency)) n.show() def set_send (self, mem = None, sig = None, rw = None): diff --git a/portato/plugins/etc_proposals.py b/portato/plugins/etc_proposals.py index 77b6be5..62605c8 100644 --- a/portato/plugins/etc_proposals.py +++ b/portato/plugins/etc_proposals.py @@ -22,7 +22,7 @@ def launch (options = []): if os.getuid() == 0: Popen(PROG+options) else: - error(_("Cannot start etc-proposals. Not root!")) + error("ETC_PROPOSALS :: %s",_("Cannot start etc-proposals. Not root!")) def etc_prop (*args, **kwargs): """Entry point for this plugin.""" diff --git a/portato/plugins/new_version.py b/portato/plugins/new_version.py new file mode 100644 index 0000000..687e107 --- /dev/null +++ b/portato/plugins/new_version.py @@ -0,0 +1,42 @@ +try: + from bzrlib import plugin, branch +except ImportError: + plugin = branch = None + +from threading import Thread + +import gobject + +from portato.helper import debug, warning +from portato import get_listener +from portato.constants import VERSION, APP_ICON, APP + +def find_thread (rev): + try: + b = branch.Branch.open("lp:portato") + except Exception, e: + warning("NEW_VERSION :: Exception occured while accessing the remote branch: %s", str(e)) + return + + debug("NEW_VERSION :: Installed rev: %s - Current rev: %s", rev, b.revno()) + if int(rev) < int(b.revno()): + def callback(): + get_listener().send_notify(base = "New Portato Live Version Found", descr = "You have rev. %s, but the most recent revision is %s." % (rev, b.revno()), icon = APP_ICON) + return False + + gobject.idle_add(callback) + +def find_version (*args, **kwargs): + if not all((plugin, branch)): + return + + v = VERSION.split() + if len(v) != 3 or v[0] != "9999": + return + + rev = v[-1] + + plugin.load_plugins() # to have lp: addresses parsed + t = Thread(target = find_thread, args=(rev,)) + t.setDaemon(True) + t.start() diff --git a/portato/plugins/notify.py b/portato/plugins/notify.py index ae2addd..8bb0a87 100644 --- a/portato/plugins/notify.py +++ b/portato/plugins/notify.py @@ -8,7 +8,7 @@ from portato.constants import APP_ICON, APP def notify (retcode, **kwargs): if retcode is None: - warning(_("Notify called while process is still running!")) + warning("NOTIFY :: %s", _("Notify called while process is still running!")) else: icon = APP_ICON if retcode == 0: |