[Pkg-bazaar-commits] ./bzr-gtk/unstable r458: Merge from trunk

Martin Albisetti argentina at gmail.com
Fri Apr 10 07:50:29 UTC 2009


------------------------------------------------------------
revno: 458
committer: Martin Albisetti <argentina at gmail.com>
branch nick: gtk.nautilus
timestamp: Thu 2008-04-03 20:02:32 -0300
message:
  Merge from trunk
added:
  icons/sign-bad.png
  icons/sign-ok.png
  icons/sign-unknown.png
  icons/sign.png
  icons/tag-16.png
  preferences/
  preferences/identity.py
  preferences/plugins.py
  seahorse.py
renamed:
  bzr-icon-64.png => icons/bzr-icon-64.png
  preferences.py => preferences/__init__.py
modified:
  AUTHORS
  NEWS
  __init__.py
  about.py
  revisionview.py
  setup.py
  viz/branchwin.py
  preferences/__init__.py
    ------------------------------------------------------------
    revno: 399.1.1
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 19:46:31 +0100
    message:
      Made the revisionview show whether a revision has been signed.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.2
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 20:08:07 +0100
    message:
      Added icon to the signature page.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.3
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 21:02:11 +0100
    message:
      Added GPG module.
    added:
      gpg.py
    ------------------------------------------------------------
    revno: 399.1.4
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 21:04:21 +0100
    message:
      Fixed bug in GPG module.
    modified:
      gpg.py
    ------------------------------------------------------------
    revno: 399.1.5
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 21:04:43 +0100
    message:
      Added signature verification.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.6
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 21:10:39 +0100
    message:
      Made signature page label singular.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.7
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Wed 2007-11-21 21:42:22 +0100
    message:
      Made signature page display the key id of the signature.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.8
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Sun 2007-12-02 17:12:09 +0100
    message:
      Merged with mainline.
    removed:
      viz/about.py
    modified:
      NEWS
      __init__.py
      olive.glade
      revisionmenu.py
      viz/branchwin.py
      viz/treeview.py
    ------------------------------------------------------------
    revno: 399.1.9
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Tue 2008-01-22 21:46:10 +0100
    message:
      Merged with trunk.
    added:
      branchview/
      branchview/__init__.py
      bzr-gtk.cfg
    renamed:
      viz/graphcell.py => branchview/graphcell.py
      viz/linegraph.py => branchview/linegraph.py
      viz/treemodel.py => branchview/treemodel.py
      viz/treeview.py => branchview/treeview.py
    modified:
      NEWS
      __init__.py
      missing.py
      nautilus-bzr.py
      revisionview.py
      setup.py
      viz/__init__.py
      viz/branchwin.py
      branchview/linegraph.py
      branchview/treemodel.py
      branchview/treeview.py
    ------------------------------------------------------------
    revno: 399.1.10
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Tue 2008-01-22 21:54:20 +0100
    message:
      Improved implementation of the Signature page.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.11
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Tue 2008-01-22 21:56:07 +0100
    message:
      Split long line.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.12
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Sat 2008-03-15 21:42:00 +0100
    message:
      Added signature icons.
    added:
      icons/sign-bad.png
      icons/sign-ok.png
      icons/sign-unknown.png
      icons/sign.png
    ------------------------------------------------------------
    revno: 399.1.13
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Sat 2008-03-15 21:54:34 +0100
    message:
      Merged with mainline.
    added:
      handle-patch
      icons/emblem-bzr-added.svg
      icons/emblem-bzr-conflict.svg
      icons/emblem-bzr-controlled.svg
      icons/emblem-bzr-modified.svg
      icons/emblem-bzr-removed.svg
      po/ca.po
      po/cs.po
      po/de.po
      po/en_GB.po
      po/es.po
      po/fr.po
      po/hu.po
      po/id.po
      po/it.po
      po/ku.po
      po/pl.po
      po/pt_BR.po
      po/ru.po
      po/sr.po
      po/sv.po
    modified:
      NEWS
      README
      __init__.py
      about.py
      annotate/gannotate.py
      branchbox.py
      branchview/graphcell.py
      branchview/linegraph.py
      branchview/treemodel.py
      branchview/treeview.py
      commit.py
      conflicts.py
      diff.py
      mergedirective.py
      nautilus-bzr.py
      olive-gtk
      olive/__init__.py
      olive/guifiles.py
      revbrowser.py
      revisionmenu.py
      revisionview.py
      setup.py
      tests/test_diff.py
      viz/branchwin.py
    ------------------------------------------------------------
    revno: 399.1.14
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: signatures
    timestamp: Sat 2008-03-15 22:10:05 +0100
    message:
      Made sure the signature icons get installed.
    modified:
      setup.py
    ------------------------------------------------------------
    revno: 399.1.15
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:34:26 +0200
    message:
      Move signature tab to a separate class.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.16
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:40:16 +0200
    message:
      Move logic showing images to the SignatureTab widget.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 399.1.17
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:47:08 +0200
    message:
      Merge Daniels' branch.
        ------------------------------------------------------------
        revno: 399.2.1
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: signatures
        timestamp: Sun 2008-03-30 17:34:39 +0200
        message:
          Made signature tab optional.
        modified:
          revisionview.py
    ------------------------------------------------------------
    revno: 399.1.18
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:51:15 +0200
    message:
      Merge trunk.
    removed:
      tortoise-bzr.py
    added:
      icons/commit.svg
      icons/commit16.svg
      icons/diff16.svg
    modified:
      NEWS
      __init__.py
      branchview/linegraph.py
      icons/commit.png
      icons/commit16.png
      icons/diff.png
      icons/diff16.png
      icons/log.png
      icons/log16.png
      icons/pull.png
      icons/pull16.png
      icons/push.png
      icons/push16.png
      icons/refresh.png
      ui.py
      viz/branchwin.py
    ------------------------------------------------------------
    revno: 399.1.19
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:58:52 +0200
    message:
      Add utility function for finding icon paths.
    renamed:
      bzr-icon-64.png => icons/bzr-icon-64.png
    modified:
      __init__.py
      about.py
      revisionview.py
      setup.py
    ------------------------------------------------------------
    revno: 399.1.20
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Sun 2008-03-30 17:59:51 +0200
    message:
      Update NEWS.
    modified:
      NEWS
    ------------------------------------------------------------
    revno: 399.1.21
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: signatures
    timestamp: Mon 2008-03-31 23:59:11 +0200
    message:
      Hide signature tab if gpg binary wasn't found.
    modified:
      revisionview.py
    ------------------------------------------------------------
    revno: 450.1.11
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Tue 2008-04-01 11:59:41 +0200
    message:
      Merge signatures tab.
    added:
      gpg.py
      icons/sign-bad.png
      icons/sign-ok.png
      icons/sign-unknown.png
      icons/sign.png
    renamed:
      bzr-icon-64.png => icons/bzr-icon-64.png
    modified:
      NEWS
      __init__.py
      about.py
      revisionview.py
      setup.py
    ------------------------------------------------------------
    revno: 450.1.12
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Tue 2008-04-01 12:18:53 +0200
    message:
      Merge James' D-Bus changes.
    modified:
      NEWS
      __init__.py
        ------------------------------------------------------------
        revno: 450.2.1
        committer: James Henstridge <james at jamesh.id.au>
        branch nick: bzr-gtk.commit-notify
        timestamp: Tue 2008-03-25 18:37:23 +0900
        message:
          Make commit-notify listen for Revision signals from any source rather 
          than just the Broadcast daemon.  This makes the daemon work with my 
          updates to bzr-dbus.
        modified:
          __init__.py
    ------------------------------------------------------------
    revno: 450.1.13
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Tue 2008-04-01 12:20:12 +0200
    message:
      Merge splitup of preferences dialog.
    added:
      preferences/
      preferences/identity.py
      preferences/plugins.py
    renamed:
      preferences.py => preferences/__init__.py
    modified:
      NEWS
      preferences/__init__.py
        ------------------------------------------------------------
        revno: 450.3.1
        committer: Jelmer Vernooij <jelmer at samba.org>
        branch nick: preferences
        timestamp: Fri 2008-03-28 20:26:53 +0100
        message:
          Add module for preferences code.
        added:
          preferences/
        renamed:
          preferences.py => preferences/__init__.py
        ------------------------------------------------------------
        revno: 450.3.2
        committer: Jelmer Vernooij <jelmer at samba.org>
        branch nick: preferences
        timestamp: Fri 2008-03-28 20:30:27 +0100
        message:
          Split plugins page out into a separate file.
        added:
          preferences/plugins.py
        modified:
          preferences/__init__.py
        ------------------------------------------------------------
        revno: 450.3.3
        committer: Jelmer Vernooij <jelmer at samba.org>
        branch nick: preferences
        timestamp: Fri 2008-03-28 20:39:35 +0100
        message:
          Split identity settings out of main preferences window.
        added:
          preferences/identity.py
        modified:
          preferences/__init__.py
    ------------------------------------------------------------
    revno: 450.1.14
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Wed 2008-04-02 15:36:55 +0200
    message:
      Fix regressions in plugins tab.
    modified:
      preferences/plugins.py
    ------------------------------------------------------------
    revno: 450.1.15
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: trunk
    timestamp: Wed 2008-04-02 22:30:42 +0200
    message:
      Merged tag icon branch.
    added:
      icons/tag-16.png
    modified:
      AUTHORS
      viz/branchwin.py
        ------------------------------------------------------------
        revno: 450.4.1
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: tag-icons
        timestamp: Wed 2008-04-02 02:31:14 +0200
        message:
          Added tag icon to branch history window.
        added:
          icons/tag-16.png
        modified:
          viz/branchwin.py
        ------------------------------------------------------------
        revno: 450.4.2
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: tag-icons
        timestamp: Wed 2008-04-02 17:54:41 +0200
        message:
          Added attribution for tag icon.
        modified:
          AUTHORS
    ------------------------------------------------------------
    revno: 450.1.16
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: trunk
    timestamp: Thu 2008-04-03 01:40:12 +0200
    message:
      Merged Seahorse integration.
    removed:
      gpg.py
    added:
      seahorse.py
    modified:
      NEWS
      revisionview.py
        ------------------------------------------------------------
        revno: 399.3.1
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: signatures
        timestamp: Sun 2008-03-30 18:47:06 +0200
        message:
          Made the key id label disappear when the revision is not signed.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.2
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: signatures
        timestamp: Sun 2008-03-30 18:56:57 +0200
        message:
          Moved key id label to the right.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.3
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 01:55:37 +0200
        message:
          Made the signature code use the Seahorse D-Bus service.
        removed:
          gpg.py
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.4
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 02:05:24 +0200
        message:
          Moved crypt code to crypt.py.
        added:
          crypt.py
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.5
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 11:08:45 +0200
        message:
          Added support for key fingerprints.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.6
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 11:37:45 +0200
        message:
          Added support for key trust.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.7
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 12:19:55 +0200
        message:
          Made Seahorse discover unknown keys, and added trust level to the UI.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.8
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 12:52:58 +0200
        message:
          Moved crypt code into a Key class.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.9
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 20:28:51 +0200
        message:
          Added headings.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.10
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 20:58:12 +0200
        message:
          Added getter for display name field.
        modified:
          crypt.py
        ------------------------------------------------------------
        revno: 399.3.11
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 21:20:08 +0200
        message:
          Fixed error with unavailable keys.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.12
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 21:22:02 +0200
        message:
          Fixed typo.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.13
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 21:25:13 +0200
        message:
          Changed wording of authenticity heading.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.14
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 21:58:31 +0200
        message:
          Improved wording of signature authenticity descriptions.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.15
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:03:45 +0200
        message:
          Made the fingerprint label read N/A when no fingerprint is available.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.16
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:04:53 +0200
        message:
          Reverted to old authenticity description.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.17
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:13:52 +0200
        message:
          Moved signature handling into signature widget.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.18
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:29:35 +0200
        message:
          Made empty fingerprint text grey.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.19
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:45:39 +0200
        message:
          Increased row spacing in signature tab.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.20
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:50:49 +0200
        message:
          Top-aligned the signature tab heading.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.21
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Tue 2008-04-01 22:57:09 +0200
        message:
          Played a bit with the spacings.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.22
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 01:23:51 +0200
        message:
          Merged with trunk.
        added:
          preferences/
          preferences/identity.py
          preferences/plugins.py
        renamed:
          preferences.py => preferences/__init__.py
        modified:
          NEWS
          __init__.py
          about.py
          branch.py
          olive.glade
          olive/__init__.py
          revisionview.py
          preferences/__init__.py
        ------------------------------------------------------------
        revno: 399.3.23
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 10:28:59 +0200
        message:
          Added comparison with revision committer.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.24
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 10:56:40 +0200
        message:
          Added key location getter.
        modified:
          crypt.py
        ------------------------------------------------------------
        revno: 399.3.25
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 17:16:04 +0200
        message:
          Added discovery of unknown keys.
        modified:
          crypt.py
        ------------------------------------------------------------
        revno: 399.3.26
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 17:32:02 +0200
        message:
          Updated NEWS.
        modified:
          NEWS
        ------------------------------------------------------------
        revno: 399.3.27
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 22:59:49 +0200
        message:
          Only show Signature tab if DBus and Seahorse are installed.
        modified:
          crypt.py
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.28
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 23:02:12 +0200
        message:
          Added license and copyright information to crypt module.
        modified:
          crypt.py
        ------------------------------------------------------------
        revno: 399.3.29
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Wed 2008-04-02 23:50:08 +0200
        message:
          Renamed the crypt module to seahorse.
        renamed:
          crypt.py => seahorse.py
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.30
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Thu 2008-04-03 01:34:55 +0200
        message:
          Fixed some naming issues.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.31
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Thu 2008-04-03 01:36:33 +0200
        message:
          Removed redundant import of DBus.
        modified:
          revisionview.py
        ------------------------------------------------------------
        revno: 399.3.32
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-integration
        timestamp: Thu 2008-04-03 01:39:44 +0200
        message:
          Fixed encoding error.
        modified:
          seahorse.py
    ------------------------------------------------------------
    revno: 450.1.17
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: trunk
    timestamp: Thu 2008-04-03 16:02:20 +0200
    message:
      Merged Seahorse integration fix.
    modified:
      seahorse.py
        ------------------------------------------------------------
        revno: 450.5.1
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-issue
        timestamp: Thu 2008-04-03 13:29:04 +0200
        message:
          Fixed check for Seahorse.
        modified:
          seahorse.py
    ------------------------------------------------------------
    revno: 450.1.18
    committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
    branch nick: trunk
    timestamp: Thu 2008-04-03 23:23:02 +0200
    message:
      Merged Seahorse integration changes.
    modified:
      revisionview.py
      seahorse.py
        ------------------------------------------------------------
        revno: 450.5.2
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-issue
        timestamp: Thu 2008-04-03 16:07:56 +0200
        message:
          Fixed issue with empty keys.
        modified:
          seahorse.py
        ------------------------------------------------------------
        revno: 450.5.3
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-issue
        timestamp: Thu 2008-04-03 22:20:39 +0200
        message:
          Made the signature checking code not try to discover the signature key.
        modified:
          revisionview.py
          seahorse.py
        ------------------------------------------------------------
        revno: 450.5.4
        committer: Daniel Schierbeck <daniel.schierbeck at gmail.com>
        branch nick: seahorse-issue
        timestamp: Thu 2008-04-03 22:30:15 +0200
        message:
          Made the crypt code only use one DBus call to get key fields.
        modified:
          seahorse.py
-------------- next part --------------
=== modified file 'AUTHORS'
--- a/AUTHORS	2006-10-14 19:14:14 +0000
+++ b/AUTHORS	2008-04-02 15:54:41 +0000
@@ -13,5 +13,7 @@
 
 Olive was written by Szilveszter Farkas <Szilveszter.Farkas at gmail.com>.
 
+The tag icon was created by Jakub Steiner.
+
 Numerous other people have contributed useful patches.  See the Bazaar history 
 of this branch for a full list of authors.

=== modified file 'NEWS'
--- a/NEWS	2008-03-29 02:44:43 +0000
+++ b/NEWS	2008-04-02 15:32:02 +0000
@@ -4,6 +4,10 @@
 
   * Removed tortoise-bzr, which now has its own project (http://launchpad.net/tortoisebzr)
 
+  * Use new D-Bus revision signal. (James Henstridge, #206443)
+
+  * Switched to using Seahorse to verify signatures. (Daniel Schierbeck)
+
  UI
 
   * Made the tags associated with a revision render next to the revision
@@ -40,12 +44,16 @@
 
   * Support child_submit_to setting in gsend. (Jelmer Vernooij)
 
+  * Add tab if revision view showing the signature status. (Daniel Schierbeck, Jelmer Vernooij)
+
  INTERNALS
 
   * Refactored the revisionview. (Daniel Schierbeck)
 
   * It is now possible to use the diff view as a widget. (Jelmer Vernooij)
 
+  * Preferences dialog has been split up. (Jelmer Vernooij)
+
 0.93.0  2007-12-10
 
  UI

=== modified file '__init__.py'
--- a/__init__.py	2008-03-30 16:19:28 +0000
+++ b/__init__.py	2008-04-01 10:18:53 +0000
@@ -110,7 +110,14 @@
 
 
 def icon_path(*args):
-    return os.path.join(data_path(), *args)
+    basedirs = [os.path.join(data_path()),
+             "/usr/share/bzr-gtk", 
+             "/usr/local/share/bzr-gtk"]
+    for basedir in basedirs:
+        path = os.path.join(basedir, 'icons', *args)
+        if os.path.exists(path):
+            return path
+    return None
 
 
 class GTKCommand(Command):
@@ -533,12 +540,8 @@
         from bzrlib.transport import get_transport
         if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
             import dbus.glib
-        from bzrlib.plugins.dbus import activity
+        BROADCAST_INTERFACE = "org.bazaarvcs.plugins.dbus.Broadcast"
         bus = dbus.SessionBus()
-        # get the object so we can subscribe to callbacks from it.
-        broadcast_service = bus.get_object(
-            activity.Broadcast.DBUS_NAME,
-            activity.Broadcast.DBUS_PATH)
 
         def catch_branch(revision_id, urls):
             # TODO: show all the urls, or perhaps choose the 'best'.
@@ -575,8 +578,9 @@
             except Exception, e:
                 print e
                 raise
-        broadcast_service.connect_to_signal("Revision", catch_branch,
-            dbus_interface=activity.Broadcast.DBUS_INTERFACE)
+        bus.add_signal_receiver(catch_branch,
+                                dbus_interface=BROADCAST_INTERFACE,
+                                signal_name="Revision")
         pynotify.init("bzr commit-notify")
         gtk.main()
 

=== modified file 'about.py'
--- a/about.py	2008-03-30 16:19:28 +0000
+++ b/about.py	2008-04-01 09:59:41 +0000
@@ -23,7 +23,7 @@
 import bzrlib
 import gtk
 import os
-from bzrlib.plugins.gtk import data_path
+from bzrlib.plugins.gtk import icon_path
 
 class AboutDialog(gtk.AboutDialog):
     def __init__(self):
@@ -32,6 +32,6 @@
         self.set_version(bzrlib.plugins.gtk.version_string)
         self.set_website("http://bazaar-vcs.org/BzrGtk")
         self.set_license("GNU GPL v2 or later")
-        self.set_icon(gtk.gdk.pixbuf_new_from_file(os.path.join(data_path(), "bzr-icon-64.png")))
+        self.set_icon(gtk.gdk.pixbuf_new_from_file(icon_path("bzr-icon-64.png")))
         self.connect ("response", lambda d, r: d.destroy())
 

=== renamed file 'bzr-icon-64.png' => 'icons/bzr-icon-64.png'
=== added file 'icons/sign-bad.png'
Binary files a/icons/sign-bad.png	1970-01-01 00:00:00 +0000 and b/icons/sign-bad.png	2008-03-15 20:42:00 +0000 differ
=== added file 'icons/sign-ok.png'
Binary files a/icons/sign-ok.png	1970-01-01 00:00:00 +0000 and b/icons/sign-ok.png	2008-03-15 20:42:00 +0000 differ
=== added file 'icons/sign-unknown.png'
Binary files a/icons/sign-unknown.png	1970-01-01 00:00:00 +0000 and b/icons/sign-unknown.png	2008-03-15 20:42:00 +0000 differ
=== added file 'icons/sign.png'
Binary files a/icons/sign.png	1970-01-01 00:00:00 +0000 and b/icons/sign.png	2008-03-15 20:42:00 +0000 differ
=== added file 'icons/tag-16.png'
Binary files a/icons/tag-16.png	1970-01-01 00:00:00 +0000 and b/icons/tag-16.png	2008-04-02 00:31:14 +0000 differ
=== added directory 'preferences'
=== renamed file 'preferences.py' => 'preferences/__init__.py'
--- a/preferences.py	2007-10-02 17:23:52 +0000
+++ b/preferences/__init__.py	2008-03-28 19:39:35 +0000
@@ -23,6 +23,8 @@
 import gtk
 
 from bzrlib.config import GlobalConfig
+from identity import IdentityPage
+from plugins import PluginsPage
 
 class PreferencesWindow(gtk.Dialog):
     """Displays global preferences windows."""
@@ -39,173 +41,21 @@
         if self.config is None:
             self.config = GlobalConfig()
         self._create()
-
-    def _create_mainpage(self):
-        table = gtk.Table(rows=4, columns=2)
-        table.set_row_spacings(6)
-        table.set_col_spacings(6)
-
-        align = gtk.Alignment(1.0, 0.5)
-        label = gtk.Label()
-        label.set_markup("<b>User Id:</b>")
-        align.add(label)
-        table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-
-        self.username = gtk.Entry()
-        self.username.set_text(self.config.username())
-        table.attach(self.username, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-        align = gtk.Alignment(1.0, 0.5)
-        label = gtk.Label()
-        label.set_markup("<b>GPG signing command:</b>")
-        align.add(label)
-        table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
-
-        self.email = gtk.Entry()
-        self.email.set_text(self.config.gpg_signing_command())
-        table.attach(self.email, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-        align = gtk.Alignment(1.0, 0.5)
-        label = gtk.Label()
-        label.set_markup("<b>Check GPG Signatures:</b>")
-        align.add(label)
-        table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
-
-        sigvals = gtk.VBox()
-        self.check_sigs_if_possible = gtk.RadioButton(None, 
-                                                      "_Check if possible")
-        sigvals.pack_start(self.check_sigs_if_possible)
-        self.check_sigs_always = gtk.RadioButton(self.check_sigs_if_possible, 
-                                                 "Check _always")
-        sigvals.pack_start(self.check_sigs_always)
-        self.check_sigs_never = gtk.RadioButton(self.check_sigs_if_possible,
-                                                "Check _never")
-        sigvals.pack_start(self.check_sigs_never)
-        # FIXME: Set default
-        table.attach(sigvals, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-        align = gtk.Alignment(1.0, 0.5)
-        label = gtk.Label()
-        label.set_markup("<b>Create GPG Signatures:</b>")
-        align.add(label)
-        table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
-
-        create_sigs = gtk.VBox()
-        self.create_sigs_when_required = gtk.RadioButton(None, 
-                                                         "Sign When _Required")
-        create_sigs.pack_start(self.create_sigs_when_required)
-        self.create_sigs_always = gtk.RadioButton(
-            self.create_sigs_when_required, "Sign _Always")
-        create_sigs.pack_start(self.create_sigs_always)
-        self.create_sigs_never = gtk.RadioButton(
-            self.create_sigs_when_required, "Sign _Never")
-        create_sigs.pack_start(self.create_sigs_never)
-        # FIXME: Set default
-        table.attach(create_sigs, 1, 2, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-        return table
-
-    def _create_pluginpage(self):
-        paned = gtk.VPaned()
-        scrolledwindow = gtk.ScrolledWindow()
-        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        model = gtk.ListStore(str, str)
-        treeview = gtk.TreeView()
-        scrolledwindow.add(treeview)
-        paned.pack1(scrolledwindow, resize=True, shrink=False)
-
-        table = gtk.Table(columns=2)
-        table.set_row_spacings(6)
-        table.set_col_spacings(6)
-
-        def row_selected(tv, path, tvc):
-            p = bzrlib.plugin.plugins()[model[path][0]]
-            from inspect import getdoc
-
-            for w in table.get_children():
-                table.remove(w)
-
-            if getattr(p, '__author__', None) is not None:
-                align = gtk.Alignment(1.0, 0.5)
-                label = gtk.Label()
-                label.set_markup("<b>Author:</b>")
-                align.add(label)
-                table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-                align.show()
-                label.show()
-
-                align = gtk.Alignment(0.0, 0.5)
-                author = gtk.Label()
-                author.set_text(p.__author__)
-                author.set_selectable(True)
-                align.add(author)
-                table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-            if getattr(p, '__version__', None) is not None:
-                align = gtk.Alignment(1.0, 0.5)
-                label = gtk.Label()
-                label.set_markup("<b>Version:</b>")
-                align.add(label)
-                table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-                align.show()
-                label.show()
-
-                align = gtk.Alignment(0.0, 0.5)
-                author = gtk.Label()
-                author.set_text(p.__version__)
-                author.set_selectable(True)
-                align.add(author)
-                table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-            if getdoc(p) is not None:
-                align = gtk.Alignment(0.0, 0.5)
-                description = gtk.Label()
-                description.set_text(getdoc(p))
-                description.set_selectable(True)
-                align.add(description)
-                table.attach(align, 0, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
-
-            table.show_all()
-
-        treeview.set_headers_visible(False)
-        treeview.set_model(model)
-        treeview.connect("row-activated", row_selected)
-
-        cell = gtk.CellRendererText()
-        column = gtk.TreeViewColumn()
-        column.pack_start(cell, expand=True)
-        column.add_attribute(cell, "text", 0)
-        treeview.append_column(column)
-
-        cell = gtk.CellRendererText()
-        column = gtk.TreeViewColumn()
-        column.pack_start(cell, expand=True)
-        column.add_attribute(cell, "text", 1)
-        treeview.append_column(column)
-        
-        import bzrlib.plugin
-        plugins = bzrlib.plugin.plugins()
-        plugin_names = plugins.keys()
-        plugin_names.sort()
-        for name in plugin_names:
-            model.append([name, getattr(plugins[name], '__file__', None)])
-                 
-        scrolledwindow = gtk.ScrolledWindow()
-        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        scrolledwindow.add_with_viewport(table)
-        paned.pack2(scrolledwindow, resize=False, shrink=True)
-        paned.show()
-
-        return paned
+        self._create_pages()
+
 
     def _create(self):
         self.set_default_size(600, 600)
         notebook = gtk.Notebook()
-        notebook.insert_page(self._create_mainpage(), gtk.Label("Main"))
-        notebook.insert_page(self._create_pluginpage(), gtk.Label("Plugins"))
+        for (label, page) in self._create_pages():
+            notebook.insert_page(page, gtk.Label(label))
         self.vbox.pack_start(notebook, True, True)
         self.vbox.show_all()
 
+    def _create_pages(self):
+        return [("Identity", IdentityPage(self.config)), 
+                ("Plugins", PluginsPage())]
+
     def display(self):
         self.window.show_all()
 

=== added file 'preferences/identity.py'
--- a/preferences/identity.py	1970-01-01 00:00:00 +0000
+++ b/preferences/identity.py	2008-03-28 19:39:35 +0000
@@ -0,0 +1,88 @@
+# Copyright (C) 2007-2008 Jelmer Vernooij <jelmer at samba.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+try:
+    import pygtk
+    pygtk.require("2.0")
+except:
+    pass
+
+import gtk
+
+class IdentityPage(gtk.Table):
+    def __init__(self, config):
+        self.config = config
+        gtk.Table.__init__(self, rows=4, columns=2)
+        self.set_row_spacings(6)
+        self.set_col_spacings(6)
+
+        align = gtk.Alignment(1.0, 0.5)
+        label = gtk.Label()
+        label.set_markup("<b>User Id:</b>")
+        align.add(label)
+        self.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
+
+        self.username = gtk.Entry()
+        self.username.set_text(self.config.username())
+        self.attach(self.username, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(1.0, 0.5)
+        label = gtk.Label()
+        label.set_markup("<b>GPG signing command:</b>")
+        align.add(label)
+        self.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
+
+        self.email = gtk.Entry()
+        self.email.set_text(self.config.gpg_signing_command())
+        self.attach(self.email, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(1.0, 0.5)
+        label = gtk.Label()
+        label.set_markup("<b>Check GPG Signatures:</b>")
+        align.add(label)
+        self.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
+
+        sigvals = gtk.VBox()
+        self.check_sigs_if_possible = gtk.RadioButton(None, 
+                                                      "_Check if possible")
+        sigvals.pack_start(self.check_sigs_if_possible)
+        self.check_sigs_always = gtk.RadioButton(self.check_sigs_if_possible, 
+                                                 "Check _always")
+        sigvals.pack_start(self.check_sigs_always)
+        self.check_sigs_never = gtk.RadioButton(self.check_sigs_if_possible,
+                                                "Check _never")
+        sigvals.pack_start(self.check_sigs_never)
+        # FIXME: Set default
+        self.attach(sigvals, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(1.0, 0.5)
+        label = gtk.Label()
+        label.set_markup("<b>Create GPG Signatures:</b>")
+        align.add(label)
+        self.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
+
+        create_sigs = gtk.VBox()
+        self.create_sigs_when_required = gtk.RadioButton(None, 
+                                                         "Sign When _Required")
+        create_sigs.pack_start(self.create_sigs_when_required)
+        self.create_sigs_always = gtk.RadioButton(
+            self.create_sigs_when_required, "Sign _Always")
+        create_sigs.pack_start(self.create_sigs_always)
+        self.create_sigs_never = gtk.RadioButton(
+            self.create_sigs_when_required, "Sign _Never")
+        create_sigs.pack_start(self.create_sigs_never)
+        # FIXME: Set default
+        self.attach(create_sigs, 1, 2, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)

=== added file 'preferences/plugins.py'
--- a/preferences/plugins.py	1970-01-01 00:00:00 +0000
+++ b/preferences/plugins.py	2008-04-02 13:36:55 +0000
@@ -0,0 +1,118 @@
+# Copyright (C) 2008 Jelmer Vernooij <jelmer at samba.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+try:
+    import pygtk
+    pygtk.require("2.0")
+except:
+    pass
+
+import gtk
+
+class PluginsPage(gtk.VPaned):
+    def __init__(self):
+        gtk.VPaned.__init__(self)
+        scrolledwindow = gtk.ScrolledWindow()
+        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.model = gtk.ListStore(str, str)
+        treeview = gtk.TreeView()
+        scrolledwindow.add(treeview)
+        self.pack1(scrolledwindow, resize=True, shrink=False)
+
+        self.table = gtk.Table(columns=2)
+        self.table.set_row_spacings(6)
+        self.table.set_col_spacings(6)
+
+        treeview.set_headers_visible(False)
+        treeview.set_model(self.model)
+        treeview.connect("row-activated", self.row_selected)
+
+        cell = gtk.CellRendererText()
+        column = gtk.TreeViewColumn()
+        column.pack_start(cell, expand=True)
+        column.add_attribute(cell, "text", 0)
+        treeview.append_column(column)
+
+        cell = gtk.CellRendererText()
+        column = gtk.TreeViewColumn()
+        column.pack_start(cell, expand=True)
+        column.add_attribute(cell, "text", 1)
+        treeview.append_column(column)
+        
+        import bzrlib.plugin
+        plugins = bzrlib.plugin.plugins()
+        plugin_names = plugins.keys()
+        plugin_names.sort()
+        for name in plugin_names:
+            self.model.append([name, getattr(plugins[name], '__file__', None)])
+                 
+        scrolledwindow = gtk.ScrolledWindow()
+        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scrolledwindow.add_with_viewport(self.table)
+        self.pack2(scrolledwindow, resize=False, shrink=True)
+        self.show()
+
+    def row_selected(self, tv, path, tvc):
+        import bzrlib
+        p = bzrlib.plugin.plugins()[self.model[path][0]]
+        from inspect import getdoc
+
+        for w in self.table.get_children():
+            self.table.remove(w)
+
+        if getattr(p, '__author__', None) is not None:
+            align = gtk.Alignment(1.0, 0.5)
+            label = gtk.Label()
+            label.set_markup("<b>Author:</b>")
+            align.add(label)
+            self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
+            align.show()
+            label.show()
+
+            align = gtk.Alignment(0.0, 0.5)
+            author = gtk.Label()
+            author.set_text(p.__author__)
+            author.set_selectable(True)
+            align.add(author)
+            self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        if getattr(p, '__version__', None) is not None:
+            align = gtk.Alignment(1.0, 0.5)
+            label = gtk.Label()
+            label.set_markup("<b>Version:</b>")
+            align.add(label)
+            self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
+            align.show()
+            label.show()
+
+            align = gtk.Alignment(0.0, 0.5)
+            author = gtk.Label()
+            author.set_text(p.__version__)
+            author.set_selectable(True)
+            align.add(author)
+            self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        if getdoc(p) is not None:
+            align = gtk.Alignment(0.0, 0.5)
+            description = gtk.Label()
+            description.set_text(getdoc(p))
+            description.set_selectable(True)
+            align.add(description)
+            self.table.attach(align, 0, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        self.table.show_all()
+
+

=== modified file 'revisionview.py'
--- a/revisionview.py	2008-03-09 19:07:11 +0000
+++ b/revisionview.py	2008-04-03 20:20:39 +0000
@@ -22,15 +22,24 @@
 import gobject
 import subprocess
 
+from bzrlib.plugins.gtk import icon_path
 from bzrlib.osutils import format_date
 from bzrlib.util.bencode import bdecode
 
+try:
+    from bzrlib.plugins.gtk import seahorse
+except ImportError:
+    has_seahorse = False
+else:
+    has_seahorse = True
+
 def _open_link(widget, uri):
     subprocess.Popen(['sensible-browser', uri], close_fds=True)
 
 gtk.link_button_set_uri_hook(_open_link)
 
 class BugsTab(gtk.Table):
+
     def __init__(self):
         super(BugsTab, self).__init__(rows=5, columns=2)
         self.set_row_spacings(6)
@@ -54,6 +63,144 @@
         self.show_all()
 
 
+class SignatureTab(gtk.VBox):
+
+    def __init__(self, repository):
+        self.key = None
+        self.revision = None
+        self.repository = repository
+
+        super(SignatureTab, self).__init__(False, 6)
+        signature_box = gtk.Table(rows=3, columns=3)
+        signature_box.set_col_spacing(0, 16)
+        signature_box.set_col_spacing(1, 12)
+        signature_box.set_row_spacings(6)
+
+        self.signature_image = gtk.Image()
+        signature_box.attach(self.signature_image, 0, 1, 0, 1, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.1)
+        self.signature_label = gtk.Label()
+        align.add(self.signature_label)
+        signature_box.attach(align, 1, 3, 0, 1, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_key_id_label = gtk.Label()
+        self.signature_key_id_label.set_markup("<b>Key Id:</b>")
+        align.add(self.signature_key_id_label)
+        signature_box.attach(align, 1, 2, 1, 2, gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_key_id = gtk.Label()
+        self.signature_key_id.set_selectable(True)
+        align.add(self.signature_key_id)
+        signature_box.attach(align, 2, 3, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_fingerprint_label = gtk.Label()
+        self.signature_fingerprint_label.set_markup("<b>Fingerprint:</b>")
+        align.add(self.signature_fingerprint_label)
+        signature_box.attach(align, 1, 2, 2, 3, gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_fingerprint = gtk.Label()
+        self.signature_fingerprint.set_selectable(True)
+        align.add(self.signature_fingerprint)
+        signature_box.attach(align, 2, 3, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_trust_label = gtk.Label()
+        self.signature_trust_label.set_markup("<b>Trust:</b>")
+        align.add(self.signature_trust_label)
+        signature_box.attach(align, 1, 2, 3, 4, gtk.FILL, gtk.FILL)
+
+        align = gtk.Alignment(0.0, 0.5)
+        self.signature_trust = gtk.Label()
+        self.signature_trust.set_selectable(True)
+        align.add(self.signature_trust)
+        signature_box.attach(align, 2, 3, 3, 4, gtk.EXPAND | gtk.FILL, gtk.FILL)
+
+        self.set_border_width(6)
+        self.pack_start(signature_box, expand=False)
+        self.show_all()
+
+    def set_revision(self, revision):
+        self.revision = revision
+        revid = revision.revision_id
+
+        if self.repository.has_signature_for_revision_id(revid):
+            crypttext = self.repository.get_signature_text(revid)
+            self.show_signature(crypttext)
+        else:
+            self.show_no_signature()
+
+    def show_no_signature(self):
+        self.signature_key_id_label.hide()
+        self.signature_key_id.set_text("")
+
+        self.signature_fingerprint_label.hide()
+        self.signature_fingerprint.set_text("")
+
+        self.signature_trust_label.hide()
+        self.signature_trust.set_text("")
+
+        self.signature_image.set_from_file(icon_path("sign-unknown.png"))
+        self.signature_label.set_markup("<b>Authenticity unknown</b>\n" +
+                                        "This revision has not been signed.")
+
+    def show_signature(self, crypttext):
+        key = seahorse.verify(crypttext)
+
+        if key and key.is_available():
+            if key.is_trusted():
+                if key.get_display_name() == self.revision.committer:
+                    self.signature_image.set_from_file(icon_path("sign-ok.png"))
+                    self.signature_label.set_markup("<b>Authenticity confirmed</b>\n" +
+                                                    "This revision has been signed with " +
+                                                    "a trusted key.")
+                else:
+                    self.signature_image.set_from_file(icon_path("sign-bad.png"))
+                    self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
+                                                    "Revision committer is not the same as signer.")
+            else:
+                self.signature_image.set_from_file(icon_path("sign-bad.png"))
+                self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
+                                                "This revision has been signed, but the " +
+                                                "key is not trusted.")
+        else:
+            self.show_no_signature()
+            self.signature_image.set_from_file(icon_path("sign-bad.png"))
+            self.signature_label.set_markup("<b>Authenticity cannot be confirmed</b>\n" +
+                                            "Signature key not available.")
+            return
+
+        trust = key.get_trust()
+
+        if trust <= seahorse.TRUST_NEVER:
+            trust_text = 'never trusted'
+        elif trust == seahorse.TRUST_UNKNOWN:
+            trust_text = 'not trusted'
+        elif trust == seahorse.TRUST_MARGINAL:
+            trust_text = 'marginally trusted'
+        elif trust == seahorse.TRUST_FULL:
+            trust_text = 'fully trusted'
+        elif trust == seahorse.TRUST_ULTIMATE:
+            trust_text = 'ultimately trusted'
+
+        self.signature_key_id_label.show()
+        self.signature_key_id.set_text(key.get_id())
+
+        fingerprint = key.get_fingerprint()
+        if fingerprint == "":
+            fingerprint = '<span foreground="dim grey">N/A</span>'
+
+        self.signature_fingerprint_label.show()
+        self.signature_fingerprint.set_markup(fingerprint)
+
+        self.signature_trust_label.show()
+        self.signature_trust.set_text('This key is ' + trust_text)
+
+
 class RevisionView(gtk.Notebook):
     """ Custom widget for commit log details.
 
@@ -95,8 +242,13 @@
     def __init__(self, branch=None):
         gtk.Notebook.__init__(self)
 
+        self._revision = None
+        self._branch = branch
+
         self._create_general()
         self._create_relations()
+        if has_seahorse:
+            self._create_signature()
         self._create_file_info_view()
         self._create_bugs()
 
@@ -222,6 +374,9 @@
 
         self._add_tags()
 
+    def _update_signature(self, widget, param):
+        self.signature_table.set_revision(self._revision)
+
     def set_children(self, children):
         self._add_parents_or_children(children,
                                       self.children_widgets,
@@ -235,7 +390,8 @@
         """Callback for when the go button for a parent is clicked."""
 
     def _add_tags(self, *args):
-        if self._revision is None: return
+        if self._revision is None:
+            return
 
         if self._tagdict.has_key(self._revision.revision_id):
             tags = self._tagdict[self._revision.revision_id]
@@ -306,6 +462,11 @@
         self.append_page(vbox, tab_label=gtk.Label("Relations"))
         vbox.show()
 
+    def _create_signature(self):
+        self.signature_table = SignatureTab(self._branch.repository)
+        self.append_page(self.signature_table, tab_label=gtk.Label('Signature'))
+        self.connect_after('notify::revision', self._update_signature)
+
     def _create_headers(self):
         self.table = gtk.Table(rows=5, columns=2)
         self.table.set_row_spacings(6)
@@ -413,7 +574,6 @@
         self.connect('notify::revision', self._add_tags)
 
         return self.table
-
     
     def _create_parents(self):
         hbox = gtk.HBox(True, 3)
@@ -461,6 +621,7 @@
         tv = gtk.TextView(msg_buffer)
         tv.set_editable(False)
         tv.set_wrap_mode(gtk.WRAP_WORD)
+
         tv.modify_font(pango.FontDescription("Monospace"))
         tv.show()
         window.add(tv)

=== added file 'seahorse.py'
--- a/seahorse.py	1970-01-01 00:00:00 +0000
+++ b/seahorse.py	2008-04-03 20:30:15 +0000
@@ -0,0 +1,114 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+__copyright__ = 'Copyright (C) 2008 Daniel Schierbeck'
+__author__ = 'Daniel Schierbeck <daniel.schierbeck at gmail.com>'
+
+import dbus
+
+BUS_NAME = 'org.gnome.seahorse'
+
+CRYPTO_INTERFACE = 'org.gnome.seahorse.CryptoService'
+CRYPTO_PATH = '/org/gnome/seahorse/crypto'
+
+OPENPGP_INTERFACE = 'org.gnome.seahorse.Keys'
+OPENPGP_PATH = '/org/gnome/seahorse/keys/openpgp'
+
+KEY_TYPE_OPENPGP = 'openpgp'
+KEY_TYPE_SSH = 'ssh'
+
+try:
+    dbus.validate_bus_name(BUS_NAME)
+except ValueError:
+    raise ImportError
+
+bus = dbus.SessionBus()
+
+crypto = dbus.Interface(bus.get_object(BUS_NAME, CRYPTO_PATH), 
+                        CRYPTO_INTERFACE)
+openpgp = dbus.Interface(bus.get_object(BUS_NAME, OPENPGP_PATH),
+                         OPENPGP_INTERFACE)
+
+FLAG_VALID = 0x0001
+FLAG_CAN_ENCRYPT = 0x0002
+FLAG_CAN_SIGN = 0x0004
+FLAG_EXPIRED = 0x0100
+FLAG_REVOKED = 0x0200
+FLAG_DISABLED = 0x0400
+FLAG_TRUSTED = 0x1000
+
+TRUST_NEVER = -1
+TRUST_UNKNOWN = 0
+TRUST_MARGINAL = 1
+TRUST_FULL = 5
+TRUST_ULTIMATE = 10
+
+LOCATION_MISSING = 10
+LOCATION_SEARCHING = 20
+LOCATION_REMOTE = 50
+LOCATION_LOCAL = 100
+
+keyset = dict()
+
+def verify(crypttext):
+    (cleartext, key) = crypto.VerifyText(KEY_TYPE_OPENPGP, 1, crypttext)
+
+    if key != "":
+        if key not in keyset:
+            keyset[key] = Key(key)
+
+        return keyset[key]
+
+class Key:
+
+    def __init__(self, key):
+        self.key = key
+
+        (keys, unmatched) = openpgp.MatchKeys([self.get_id()], 0x00000010)
+        self.available = (key in keys)
+
+        if self.available:
+            fields = openpgp.GetKeyFields(key, ['fingerprint', 'trust', 'flags', 'display-name', 'location'])
+        else:
+            fields = dict()
+
+        self.fingerprint = fields.get('fingerprint', 'N/A')
+        self.trust = fields.get('trust', TRUST_UNKNOWN)
+        self.flags = fields.get('flags', 0)
+        self.display_name = fields.get('display-name', '')
+        self.location = fields.get('location', LOCATION_MISSING)
+    
+    def get_flags(self):
+        return self.flags
+
+    def get_display_name(self):
+        return self.display_name
+
+    def get_id(self):
+        return self.key.split(':')[1][8:]
+
+    def get_fingerprint(self):
+        return self.fingerprint
+
+    def get_trust(self):
+        return self.trust
+
+    def get_location(self):
+        return self.location
+
+    def is_available(self):
+        return self.available
+
+    def is_trusted(self):
+        return self.flags & FLAG_TRUSTED != 0

=== modified file 'setup.py'
--- a/setup.py	2008-03-05 11:57:21 +0000
+++ b/setup.py	2008-03-30 15:58:52 +0000
@@ -129,10 +129,15 @@
                                  'icons/push16.png',
                                  'icons/refresh.png',
                                  'icons/oliveicon2.png']),
+                ('share/bzr-gtk/icons', ['icons/sign-bad.png',
+                                 'icons/sign-ok.png',
+                                 'icons/sign.png',
+                                 'icons/sign-unknown.png',
+                                 'icons/bzr-icon-64.png']),
                 ('share/applications', ['olive-gtk.desktop',
                                         'bazaar-properties.desktop',
                                         'bzr-notify.desktop']),
-                ('share/pixmaps', ['icons/olive-gtk.png']),
+                ('share/pixmaps', ['icons/olive-gtk.png', 'icons/bzr-icon-64.png']),
                 ('share/icons/hicolor/scalable/emblems', 
                     ['icons/emblem-bzr-added.svg', 
                         'icons/emblem-bzr-conflict.svg', 

=== modified file 'viz/branchwin.py'
--- a/viz/branchwin.py	2008-03-28 19:12:27 +0000
+++ b/viz/branchwin.py	2008-04-02 00:31:14 +0000
@@ -14,6 +14,7 @@
 import pango
 
 from bzrlib.plugins.gtk.window import Window
+from bzrlib.plugins.gtk import icon_path
 from bzrlib.plugins.gtk.tags import AddTagDialog
 from bzrlib.plugins.gtk.preferences import PreferencesWindow
 from bzrlib.plugins.gtk.branchview import TreeView, treemodel
@@ -177,7 +178,10 @@
         go_menu_next = self.next_rev_action.create_menu_item()
         go_menu_prev = self.prev_rev_action.create_menu_item()
 
-        self.go_menu_tags = gtk.MenuItem("_Tags")
+        tag_image = gtk.Image()
+        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)
@@ -435,7 +439,10 @@
             tags.sort()
             tags.reverse()
             for tag, revid in tags:
-                tag_item = gtk.MenuItem(tag, use_underline=False)
+                tag_image = gtk.Image()
+                tag_image.set_from_file(icon_path('tag-16.png'))
+                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
+                tag_item.set_image(tag_image)
                 tag_item.connect('activate', self._tag_selected_cb, revid)
                 menu.add(tag_item)
             self.go_menu_tags.set_submenu(menu)



More information about the Pkg-bazaar-commits mailing list