This updated patch changes the test for loom to attempt an actual
import rather than getattr to avoid issues with the order in which
plugins are loaded.
It also fixes the dialog when a branch is opened that is not yet a
loom branch.
Cheers,
Jelmer
--
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: lp:bzr-gtk
# testament_sha1: 98ee8d97f09dd983dcb7bbd503d6cc4aae116fb0
# timestamp: 2008-07-31 03:55:38 +0200
# base_revision_id: [EMAIL PROTECTED]
#
# Begin patch
=== modified file 'NEWS'
--- NEWS 2008-07-27 12:01:40 +0000
+++ NEWS 2008-07-31 01:11:43 +0000
@@ -25,6 +25,8 @@
* Made merge dialog to give choice between folder and custom location (Jasper Groenewegen)
+ * Ad new dialog to browse looms and switch to threads in loom branches. (Jelmer Vernooij)
+
BUG FIXES
* Replace _() calls by _i18n() calls. (Vincent Ladeuil, #187283)
=== modified file '__init__.py'
--- __init__.py 2008-07-25 22:29:51 +0000
+++ __init__.py 2008-07-31 01:51:56 +0000
@@ -22,6 +22,7 @@
gconflicts GTK+ conflicts.
gdiff Show differences in working tree in a GTK+ Window.
ginit Initialise a new branch.
+gloom GTK+ loom browse dialog
gmerge GTK+ merge dialog
gmissing GTK+ missing revisions dialog.
gpreferences GTK+ preferences dialog.
@@ -172,11 +173,29 @@
def run(self, location="."):
(br, path) = branch.Branch.open_containing(location)
open_display()
- from push import PushDialog
+ from bzrlib.plugins.gtk.push import PushDialog
dialog = PushDialog(br.repository, br.last_revision(), br)
dialog.run()
+class cmd_gloom(GTKCommand):
+ """ GTK+ loom.
+
+ """
+ takes_args = [ "location?" ]
+
+ def run(self, location="."):
+ try:
+ (tree, path) = workingtree.WorkingTree.open_containing(location)
+ br = tree.branch
+ except NoWorkingTree, e:
+ (br, path) = branch.Branch.open_containing(location)
+ tree = None
+ open_display()
+ from bzrlib.plugins.gtk.loom import LoomDialog
+ dialog = LoomDialog(br, tree)
+ dialog.run()
+
class cmd_gdiff(GTKCommand):
"""Show differences in working tree in a GTK+ Window.
@@ -548,6 +567,13 @@
cmd_visualise
]
+try:
+ from bzrlib.plugins import loom
+except ImportError:
+ pass # Loom plugin doesn't appear to be present
+else:
+ commands.append(cmd_gloom)
+
for cmd in commands:
register_command(cmd)
=== modified file 'commit.py'
--- commit.py 2008-07-27 07:59:23 +0000
+++ commit.py 2008-07-31 00:07:21 +0000
@@ -101,7 +101,7 @@
"""Implementation of Commit."""
def __init__(self, wt, selected=None, parent=None):
- gtk.Dialog.__init__(self, title="Commit - Olive",
+ gtk.Dialog.__init__(self, title="Commit",
parent=parent,
flags=0,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
=== added file 'loom.py'
--- loom.py 1970-01-01 00:00:00 +0000
+++ loom.py 2008-07-31 01:55:07 +0000
@@ -0,0 +1,122 @@
+# Copyright (C) 2008 Jelmer Vernooij <[EMAIL PROTECTED]>
+#
+# 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
+import gobject
+
+from bzrlib.plugins.gtk import _i18n
+from bzrlib.plugins.gtk.diff import DiffWidget
+from bzrlib.plugins.gtk.dialog import question_dialog
+from bzrlib.plugins.loom import branch as loom_branch
+from bzrlib.plugins.loom import tree as loom_tree
+
+class LoomDialog(gtk.Dialog):
+ """Simple Loom browse dialog."""
+
+ def __init__(self, branch, tree=None, parent=None):
+ gtk.Dialog.__init__(self, title="Threads",
+ parent=parent,
+ flags=0,
+ buttons=(gtk.STOCK_CLOSE,gtk.RESPONSE_OK))
+ self.branch = branch
+ if tree is not None:
+ self.tree = loom_tree.LoomTreeDecorator(tree)
+ else:
+ self.tree = None
+
+ self._construct()
+
+ def run(self):
+ try:
+ loom_branch.require_loom_branch(self.branch)
+ except loom_branch.NotALoom:
+ response = question_dialog(
+ _i18n("Upgrade to Loom branch?"),
+ _i18n("Branch is not a loom branch. Upgrade to Loom format?"),
+ parent=self)
+ # Doesn't set a parent for the dialog..
+ if response == gtk.RESPONSE_NO:
+ return
+ assert self.branch.nick is not None
+ loom_branch.loomify(self.branch)
+ self._load_threads()
+ return super(LoomDialog, self).run()
+
+ def _construct(self):
+ hbox = gtk.HBox()
+
+ self._threads_scroller = gtk.ScrolledWindow()
+ self._threads_scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self._threads_view = gtk.TreeView()
+ self._threads_scroller.add(self._threads_view)
+ self._threads_scroller.set_shadow_type(gtk.SHADOW_IN)
+ hbox.pack_start(self._threads_scroller)
+
+ self._threads_store = gtk.ListStore(
+ gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_STRING)
+ self._threads_view.set_model(self._threads_store)
+ self._threads_view.append_column(gtk.TreeViewColumn("Name", gtk.CellRendererText(), text=0))
+ self._threads_view.connect('cursor-changed', self._on_view_thread)
+ if self.tree is not None:
+ self._threads_view.connect('row-activated', self._on_switch_thread)
+
+ self._diff = DiffWidget()
+ self._diff.show()
+ hbox.pack_end(self._diff)
+
+ hbox.show_all()
+ self.vbox.pack_start(hbox)
+
+ # FIXME: Buttons: combine-thread, revert-loom, record
+ self.set_default_size(500, 350)
+
+ def _on_view_thread(self, treeview):
+ treeselection = treeview.get_selection()
+ (model, selection) = treeselection.get_selected()
+ if selection is None:
+ return
+ revid, parent_revid = model.get(selection, 1, 3)
+ if parent_revid is None:
+ return
+ self.branch.lock_read()
+ try:
+ (rev_tree, parent_tree) = tuple(self.branch.repository.revision_trees([revid, parent_revid]))
+ self._diff.set_diff(rev_tree, parent_tree)
+ finally:
+ self.branch.unlock()
+
+ def _on_switch_thread(self, treeview, path, view_column):
+ new_thread = self._threads_store.get_value(self._threads_store.get_iter(path), 0)
+ self.tree.down_thread(new_thread)
+
+ def _load_threads(self):
+ self._threads_store.clear()
+
+ self.branch.lock_read()
+ try:
+ threads = self.branch.get_loom_state().get_threads()
+ last_revid = None
+ for name, revid, parent_ids in reversed(threads):
+ self._threads_store.append([name, revid, parent_ids, last_revid])
+ last_revid = revid
+ finally:
+ self.branch.unlock()
# 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