[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