# HG changeset patch
# User Yuki KODAMA <endflow....@gmail.com>
# Date 1254242591 -32400
# Node ID 4269ba9a72cf7f26e2792af9750cc7e00ba4a2d4
# Parent  8e34dc69eebf0e3454104ed5d0717476b8dd1255
datamine: improve 'annotate parent' command

Old implementation doesn't work in mostly cases since
all are not parent revisions that have current file.

diff --git a/tortoisehg/hgtk/datamine.py b/tortoisehg/hgtk/datamine.py
--- a/tortoisehg/hgtk/datamine.py
+++ b/tortoisehg/hgtk/datamine.py
@@ -21,6 +21,7 @@
 from tortoisehg.hgtk.logview.colormap import AnnotateColorMap
 from tortoisehg.hgtk.logview.colormap import AnnotateColorSaturation
 from tortoisehg.hgtk.logview.treeview import TreeView as LogTreeView
+from tortoisehg.hgtk.logview import treemodel as LogTreeModelModule
 from tortoisehg.hgtk import gtklib, gdialog, changeset

 class DataMineDialog(gdialog.GDialog):
@@ -137,18 +138,12 @@
         menu.append(create_menu(_('_zoom to change'), self.cmenu_zoom, objs))
         menu.append(create_menu(_('di_splay change'), self.cmenu_display))
         menu.append(create_menu(_('_annotate parent'),
-            self.annotate_parent, objs))
+                                self.cmenu_annotate_parent, objs))
         menu.append(create_menu(_('_view file at revision'), self.cmenu_view))
         menu.append(create_menu(_('_file history'), self.cmenu_file_log))
         menu.show_all()
         return menu

-    def annotate_parent(self, menuitem, objs):
-        if not self.currev:
-            return
-        parent = self.repo[self.currev].parents()[0].rev()
-        self.trigger_annotate(parent, self.curpath, objs)
-
     def cmenu_zoom(self, menuitem, objs):
         (frame, treeview, path, graphview) = objs
         graphview.scroll_to_revision(int(self.currev))
@@ -166,6 +161,57 @@
     def cmenu_annotate(self, menuitem):
         self.add_annotate_page(self.curpath, self.currev)

+    def cmenu_annotate_parent(self, menuitem, objs):
+        def error_prompt():
+            gdialog.Prompt(_('No parent file'),
+                           _('Unable to annotate'), self).run()
+            return False
+        (frame, treeview, filepath, graphview) = objs
+        anotrev = treeview.get_model().rev
+        graphmodel = graphview.treeview.get_model()
+        path = graphview.get_path_at_revid(int(self.currev))
+        if not path:
+            return error_prompt()
+        iter = graphmodel.get_iter(path)
+        parent_iter = graphmodel.iter_next(iter)
+        if not parent_iter:
+            return error_prompt()
+        parent_path = graphmodel.get_path(parent_iter)
+        parent_revid = graphmodel[parent_path][LogTreeModelModule.REVID]
+        parent_ctx = self.repo[parent_revid]
+        try:
+            parent_ctx.filectx(filepath)
+        except LookupError:
+            # file was renamed/moved, try to find previous file path
+            end_iter = iter
+            path = graphview.get_path_at_revid(int(anotrev))
+            if not path:
+                return error_prompt()
+            iter = graphmodel.get_iter(path)
+            while iter and iter != end_iter:
+                path = graphmodel.get_path(iter)
+                revid = graphmodel[path][LogTreeModelModule.REVID]
+                ctx = self.repo[revid]
+                try:
+                    fctx = ctx.filectx(filepath)
+                    renamed = fctx.renamed()
+                    if renamed:
+                        filepath = renamed[0]
+                        break
+                except LookupError:
+                    # break iteration, but don't use 'break' statement
+                    # so that avoid to drop to 'else' block.kA
+                    iter = end_iter
+                    continue
+                # move iterator to next
+                iter = graphmodel.iter_next(iter)
+            else:
+                return error_prompt()
+        # annotate file of parent rev
+        self.trigger_annotate(parent_revid, filepath, objs)
+        graphview.scroll_to_revision(int(parent_revid))
+        graphview.set_revision_id(int(parent_revid))
+
     def cmenu_file_log(self, menuitem):
         from tortoisehg.hgtk import history
         dlg = history.run(self.ui, filehist=self.curpath)
diff --git a/tortoisehg/hgtk/logview/treeview.py
b/tortoisehg/hgtk/logview/treeview.py
--- a/tortoisehg/hgtk/logview/treeview.py
+++ b/tortoisehg/hgtk/logview/treeview.py
@@ -302,6 +302,15 @@
     def get_revid_at_path(self, path):
         return self.model[path][treemodel.REVID]

+    def get_path_at_revid(self, revid):
+        if revid in self.index:
+            row_index = self.index[revid]
+            iter = self.model.get_iter(row_index)
+            path = self.model.get_path(iter)
+            return path
+        else:
+            return None
+
     def get_wfile_at_path(self, path):
         if self.model:
             return self.model[path][treemodel.WFILE]

Attachment: thg-kuy_rev4270.patch
Description: Binary data

------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to