The attached patch makes viz load tags after the window has been created,
so we get a progress bar if they take a long time to load (which can
be the case with bzr-svn).
Cheers,
Jelmer
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: lp:bzr-gtk
# testament_sha1: 9150fb4002a2a2099e3687d91e046227317692bf
# timestamp: 2008-07-06 15:07:34 +0200
# base_revision_id: [EMAIL PROTECTED]
#
# Begin patch
=== modified file '__init__.py'
--- __init__.py 2008-06-27 17:10:27 +0000
+++ __init__.py 2008-07-04 08:05:17 +0000
@@ -103,21 +103,24 @@
bzrlib.ui.ui_factory = GtkUIFactory()
-def data_path():
- return os.path.dirname(__file__)
-
-
-def icon_path(*args):
- basedirs = [os.path.join(data_path()),
+def data_basedirs():
+ return [os.path.dirname(__file__),
"/usr/share/bzr-gtk",
"/usr/local/share/bzr-gtk"]
- for basedir in basedirs:
- path = os.path.join(basedir, 'icons', *args)
+
+
+def data_path(*args):
+ for basedir in data_basedirs():
+ path = os.path.join(basedir, *args)
if os.path.exists(path):
return path
return None
+def icon_path(*args):
+ return data_path(os.path.join('icons', *args))
+
+
def open_display():
pygtk = import_pygtk()
try:
=== modified file 'about.py'
--- about.py 2008-06-28 20:24:16 +0000
+++ about.py 2008-07-04 08:05:17 +0000
@@ -27,13 +27,14 @@
from bzrlib.errors import NotBranchError, NoRepositoryPresent
from bzrlib.trace import mutter
-from bzrlib.plugins.gtk import icon_path
+from bzrlib.plugins.gtk import data_path, icon_path
def read_license():
- license_file = os.path.join(os.path.dirname(__file__), "COPYING")
- if os.path.exists(license_file):
- return file(license_file).read()
+ license_paths = [data_path("COPYING"), "/usr/share/common-licenses/GPL-2"]
+ for license_file in license_paths:
+ if os.path.exists(license_file):
+ return file(license_file).read()
# Fall back to just license name if we can't find the file
return "GPLv2 or later"
@@ -41,7 +42,7 @@
def load_credits():
import pickle
try:
- credits = pickle.load(file("credits.pickle"))
+ credits = pickle.load(file(data_path("credits.pickle")))
except IOError:
credits = None
return credits
=== modified file 'revisionview.py'
--- revisionview.py 2008-06-29 19:18:34 +0000
+++ revisionview.py 2008-07-06 13:07:24 +0000
@@ -28,13 +28,6 @@
from bzrlib.plugins.gtk import icon_path
-try:
- from bzrlib.plugins.gtk import seahorse
-except ImportError:
- has_seahorse = False
-else:
- has_seahorse = True
-
PAGE_GENERAL = 0
PAGE_RELATIONS = 1
PAGE_SIGNATURE = 2
@@ -138,10 +131,11 @@
class SignatureTab(gtk.VBox):
- def __init__(self, repository):
+ def __init__(self, repository, seahorse):
self.key = None
self.revision = None
self.repository = repository
+ self.seahorse = seahorse
super(SignatureTab, self).__init__(False, 6)
signature_box = gtk.Table(rows=3, columns=3)
@@ -222,7 +216,7 @@
"This revision has not been signed.")
def show_signature(self, crypttext):
- (cleartext, key) = seahorse.verify(crypttext)
+ (cleartext, key) = self.seahorse.verify(crypttext)
assert cleartext is not None
@@ -259,15 +253,15 @@
trust = key.get_trust()
- if trust <= seahorse.TRUST_NEVER:
+ if trust <= self.seahorse.TRUST_NEVER:
trust_text = 'never trusted'
- elif trust == seahorse.TRUST_UNKNOWN:
+ elif trust == self.seahorse.TRUST_UNKNOWN:
trust_text = 'not trusted'
- elif trust == seahorse.TRUST_MARGINAL:
+ elif trust == self.seahorse.TRUST_MARGINAL:
trust_text = 'marginally trusted'
- elif trust == seahorse.TRUST_FULL:
+ elif trust == self.seahorse.TRUST_FULL:
trust_text = 'fully trusted'
- elif trust == seahorse.TRUST_ULTIMATE:
+ elif trust == self.seahorse.TRUST_ULTIMATE:
trust_text = 'ultimately trusted'
self.signature_key_id_label.show()
@@ -333,9 +327,13 @@
self._create_general()
self._create_relations()
- # Disabled because testaments aren't verified yet:
- if has_seahorse:
- self._create_signature()
+ try:
+ from bzrlib.plugins.gtk import seahorse
+ except ImportError:
+ pass
+ else:
+ self._create_signature(seahorse)
+
self._create_file_info_view()
self._create_bugs()
@@ -348,9 +346,13 @@
self._revision = None
self._branch = branch
+ gobject.idle_add(self.populate)
+
+ self.set_file_id(None)
+
+ def populate(self):
self.update_tags()
-
- self.set_file_id(None)
+ return False
def do_get_property(self, property):
if property.name == 'branch':
@@ -555,8 +557,8 @@
self.append_page(vbox, tab_label=gtk.Label("Relations"))
vbox.show()
- def _create_signature(self):
- self.signature_table = SignatureTab(self._repository)
+ def _create_signature(self, seahorse):
+ self.signature_table = SignatureTab(self._repository, seahorse)
self.append_page(self.signature_table, tab_label=gtk.Label('Signature'))
self.connect_after('notify::revision', self._update_signature)
=== modified file 'seahorse.py'
--- seahorse.py 2008-06-29 19:07:23 +0000
+++ seahorse.py 2008-07-04 18:54:42 +0000
@@ -43,19 +43,23 @@
else:
raise
-if hasattr(bus, 'list_activatable_names'):
- bus_names = bus.list_activatable_names()
-else:
- bus_object = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
- bus_names = bus_object.ListNames(dbus_interface='org.freedesktop.DBus')
-
-if BUS_NAME not in bus_names:
- raise ImportError
-
-crypto = dbus.Interface(bus.get_object(BUS_NAME, CRYPTO_PATH),
- CRYPTO_INTERFACE)
-openpgp = dbus.Interface(bus.get_object(BUS_NAME, OPENPGP_PATH),
- OPENPGP_INTERFACE)
+try:
+ crypto = dbus.Interface(bus.get_object(BUS_NAME, CRYPTO_PATH),
+ CRYPTO_INTERFACE)
+ openpgp = dbus.Interface(bus.get_object(BUS_NAME, OPENPGP_PATH),
+ OPENPGP_INTERFACE)
+except dbus.exceptions.DBusException, e:
+ get_name = getattr(e, 'get_dbus_name', None)
+ if get_name is not None:
+ name = get_name()
+ else:
+ name = getattr(e, '_dbus_error_name', None)
+ # DBus sometimes fails like this, just treat it as if seahorse is not
+ # available rather than crashing.
+ if name == "org.freedesktop.DBus.Error.ServiceUnknown":
+ raise ImportError
+ else:
+ raise
FLAG_VALID = 0x0001
FLAG_CAN_ENCRYPT = 0x0002
=== modified file 'ui.py'
--- ui.py 2008-06-30 20:32:25 +0000
+++ ui.py 2008-07-04 21:40:56 +0000
@@ -58,13 +58,14 @@
pass
def update(self, msg=None, current_cnt=None, total_cnt=None):
- if current_cnt:
+ if current_cnt is not None:
self.current = current_cnt
- if total_cnt:
+ if total_cnt is not None:
self.total = total_cnt
if msg is not None:
self.set_text(msg)
if None not in (self.current, self.total):
+ assert self.current <= self.total
self.fraction = float(self.current) / self.total
self.set_fraction(self.fraction)
while gtk.events_pending():
@@ -91,6 +92,9 @@
def update(self, *args, **kwargs):
self.pb.update(*args, **kwargs)
+ def tick(self, *args, **kwargs):
+ self.pb.tick(*args, **kwargs)
+
def finished(self):
self.pb.finished()
self.hide_all()
@@ -136,6 +140,9 @@
def update(self, *args, **kwargs):
self.pb.update(*args, **kwargs)
+ def tick(self, *args, **kwargs):
+ self.pb.tick(*args, **kwargs)
+
def finished(self):
self.pb.finished()
self.hide_all()
=== modified file 'viz/branchwin.py'
--- viz/branchwin.py 2008-07-01 21:54:21 +0000
+++ viz/branchwin.py 2008-07-06 13:07:24 +0000
@@ -197,7 +197,6 @@
tag_image.set_from_file(icon_path("tag-16.png"))
self.go_menu_tags = gtk.ImageMenuItem("_Tags")
self.go_menu_tags.set_image(tag_image)
- self._update_tags()
go_menu.add(go_menu_next)
go_menu.add(go_menu_prev)
@@ -248,8 +247,13 @@
menubar.add(help_menuitem)
menubar.show_all()
+ gobject.idle_add(self.populate)
+
return menubar
+ def populate(self):
+ self._update_tags()
+
def construct_top(self):
"""Construct the top-half of the window."""
# FIXME: Make broken_line_length configurable
# Begin bundle
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
--
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at:
https://lists.canonical.com/mailman/listinfo/bzr-gtk