[PATCH] Prototype for 3-way extdiff

Mads Kiilerich mads at kiilerich.com
Wed Oct 8 23:58:28 UTC 2008


# HG changeset patch
# User Mads Kiilerich <mads at kiilerich.com>
# Date 1223510077 -7200
# Node ID 200314d6610db61ea1b9392e18370d42a71ad769
# Parent  8b61c6672ec54d4d7f6766ab300b3daceebe9c9a
Prototype for 3-way extdiff

Building on '[PATCH 2 of 2] extdiff: make it possible to diff a changeset' I
tried to hack support for 3-way diff into extdiff. That could perhaps be
integrated into this patch series?

It seems to me like revpairs new other_wdparent doesn't fit this use case well.

A committed merge can be reviewed with
hg extdiff -c -p meld

A pending merge can be reviewed with
hg extdiff -p meld

To make this feature really useful it needs more detailed tool specification,
something similar to (or reuse of) merge tool configuration. And it must be
possible to disable it ;-)

diff -r 8b61c6672ec5 -r 200314d6610d hgext/extdiff.py
--- a/hgext/extdiff.py	Wed Oct 08 15:17:52 2008 +0200
+++ b/hgext/extdiff.py	Thu Oct 09 01:54:37 2008 +0200
@@ -121,6 +121,8 @@
     - just invoke the diff for a single file in the working dir
     '''
     node1, node2 = cmdutil.revpair(repo, opts['rev'], opts['switch_parent'])
+    parents = repo.dirstate.parents()
+    node3 = parents[1] if node1 == parents[0] else parents[0]
 
     if opts['changeset']:
         if node2:
@@ -128,7 +130,7 @@
                                 '--changeset is used'))
         parents = repo.changelog.parents(node1)
         pnum = (opts['switch_parent'] and parents[1] != nullid) and 1 or 0
-        node1, node2 = parents[pnum], node1
+        node1, node2, node3 = parents[pnum], node1, parents[1 - pnum]
 
     matcher = cmdutil.match(repo, pats, opts)
     modified, added, removed = repo.status(node1, node2, matcher)[:3]
@@ -140,6 +142,7 @@
     try:
         # Always make a copy of node1
         dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)
+        dir3 = node3 != nullid and snapshot_node(ui, repo, modified + removed, node3, tmproot) or ''
         changes = len(modified) + len(removed) + len(added)
 
         fns_and_mtime = []
@@ -162,6 +165,7 @@
         if changes == 1 :
             if len(modified):
                 dir1 = os.path.join(dir1, util.localpath(modified[0]))
+                dir3 = dir3 and os.path.join(dir3, util.localpath(modified[0])) or '' # Not tested ...
                 dir2 = os.path.join(dir2root, dir2, util.localpath(modified[0]))
             elif len(removed) :
                 dir1 = os.path.join(dir1, util.localpath(removed[0]))
@@ -173,6 +177,8 @@
         cmdline = ('%s %s %s %s' %
                    (util.shellquote(diffcmd), ' '.join(diffopts),
                     util.shellquote(dir1), util.shellquote(dir2)))
+        if dir3: # Add 2nd parent as extra parameter ...
+            cmdline = cmdline + ' ' + util.shellquote(dir3)
         ui.debug(_('running %r in %s\n') % (cmdline, tmproot))
         util.system(cmdline, cwd=tmproot)
 



More information about the Mercurial-devel mailing list