[PATCH 3 of 3] extdiff: add support for subrepos
Matt Harbison
mharbison72 at gmail.com
Wed Jul 15 23:11:11 CDT 2015
# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1342370590 14400
# Sun Jul 15 12:43:10 2012 -0400
# Node ID 956b4ab53ed6b5c086426ecefc4ffafd186e7afb
# Parent 4b5fc72daaf25e1ab66d340688b9bcdb986a2903
extdiff: add support for subrepos
Git and svn subrepo support is incomplete, because they don't support archiving
the working copy.
diff --git a/hgext/extdiff.py b/hgext/extdiff.py
--- a/hgext/extdiff.py
+++ b/hgext/extdiff.py
@@ -74,7 +74,7 @@
# leave the attribute unspecified.
testedwith = 'internal'
-def snapshot(ui, repo, files, node, tmproot):
+def snapshot(ui, repo, files, node, tmproot, listsubrepos):
'''snapshot files as of some revision
if not using snapshot, -I/-X does not work and recursive diff
in tools like kdiff3 and meld displays too many files.'''
@@ -98,7 +98,8 @@
repo.ui.setconfig("ui", "archivemeta", False)
archival.archive(repo, base, node, 'files',
- matchfn=scmutil.matchfiles(repo, files))
+ matchfn=scmutil.matchfiles(repo, files),
+ subrepos=listsubrepos)
ctx = repo[node]
for fn in sorted(files):
@@ -146,10 +147,14 @@
if node1b == nullid:
do3way = False
+ subrepos=opts.get('subrepos')
+
matcher = scmutil.match(repo[node2], pats, opts)
- mod_a, add_a, rem_a = map(set, repo.status(node1a, node2, matcher)[:3])
+ mod_a, add_a, rem_a = map(set, repo.status(node1a, node2, matcher,
+ listsubrepos=subrepos)[:3])
if do3way:
- mod_b, add_b, rem_b = map(set, repo.status(node1b, node2, matcher)[:3])
+ mod_b, add_b, rem_b = map(set, repo.status(node1b, node2, matcher,
+ listsubrepos=subrepos)[:3])
else:
mod_b, add_b, rem_b = set(), set(), set()
modadd = mod_a | add_a | mod_b | add_b
@@ -161,11 +166,12 @@
try:
# Always make a copy of node1a (and node1b, if applicable)
dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
- dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot)[0]
+ dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot, subrepos)[0]
rev1a = '@%d' % repo[node1a].rev()
if do3way:
dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
- dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot)[0]
+ dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot,
+ subrepos)[0]
rev1b = '@%d' % repo[node1b].rev()
else:
dir1b = None
@@ -177,14 +183,15 @@
dir2root = ''
rev2 = ''
if node2:
- dir2 = snapshot(ui, repo, modadd, node2, tmproot)[0]
+ dir2 = snapshot(ui, repo, modadd, node2, tmproot, subrepos)[0]
rev2 = '@%d' % repo[node2].rev()
elif len(common) > 1:
#we only actually need to get the files to copy back to
#the working dir in this case (because the other cases
#are: diffing 2 revisions or single file -- in which case
#the file is already directly passed to the diff tool).
- dir2, fns_and_mtime = snapshot(ui, repo, modadd, None, tmproot)
+ dir2, fns_and_mtime = snapshot(ui, repo, modadd, None, tmproot,
+ subrepos)
else:
# This lets the diff tool open the changed file directly
dir2 = ''
@@ -252,7 +259,7 @@
_('pass option to comparison program'), _('OPT')),
('r', 'rev', [], _('revision'), _('REV')),
('c', 'change', '', _('change made by revision'), _('REV')),
- ] + commands.walkopts,
+ ] + commands.walkopts + commands.subrepoopts,
_('hg extdiff [OPT]... [FILE]...'),
inferrepo=True)
def extdiff(ui, repo, *pats, **opts):
diff --git a/tests/test-extdiff.t b/tests/test-extdiff.t
--- a/tests/test-extdiff.t
+++ b/tests/test-extdiff.t
@@ -48,6 +48,7 @@
-c --change REV change made by revision
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
(some details hidden, use --verbose to show complete help)
diff --git a/tests/test-extension.t b/tests/test-extension.t
--- a/tests/test-extension.t
+++ b/tests/test-extension.t
@@ -394,6 +394,7 @@
-c --change REV change made by revision
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
(some details hidden, use --verbose to show complete help)
diff --git a/tests/test-subrepo-deep-nested-change.t b/tests/test-subrepo-deep-nested-change.t
--- a/tests/test-subrepo-deep-nested-change.t
+++ b/tests/test-subrepo-deep-nested-change.t
@@ -709,4 +709,96 @@
$ hg rollback -q
$ hg update -Cq .
+Interaction with extdiff, largefiles and subrepos
+
+ $ hg --config extensions.extdiff= extdiff -S
+
+ $ hg --config extensions.extdiff= extdiff -r '.^' -S
+ diff -Npru cloned.*/.hgsub cloned/.hgsub (glob)
+ --- cloned.*/.hgsub * +0000 (glob)
+ +++ cloned/.hgsub * +0000 (glob)
+ @@ -1,2 +1 @@
+ sub1 = ../sub1
+ -sub3 = sub3
+ diff -Npru cloned.*/.hgsubstate cloned/.hgsubstate (glob)
+ --- cloned.*/.hgsubstate * +0000 (glob)
+ +++ cloned/.hgsubstate * +0000 (glob)
+ @@ -1,2 +1 @@
+ 7a36fa02b66e61f27f3d4a822809f159479b8ab2 sub1
+ -b1a26de6f2a045a9f079323693614ee322f1ff7e sub3
+ [1]
+
+ $ hg --config extensions.extdiff= extdiff -r 0 -r '.^' -S
+ diff -Npru cloned.*/.hglf/b.dat cloned.*/.hglf/b.dat (glob)
+ --- cloned.*/.hglf/b.dat * (glob)
+ +++ cloned.*/.hglf/b.dat * (glob)
+ @@ -0,0 +1 @@
+ +da39a3ee5e6b4b0d3255bfef95601890afd80709
+ diff -Npru cloned.*/.hglf/foo/bar/large.dat cloned.*/.hglf/foo/bar/large.dat (glob)
+ --- cloned.*/.hglf/foo/bar/large.dat * (glob)
+ +++ cloned.*/.hglf/foo/bar/large.dat * (glob)
+ @@ -0,0 +1 @@
+ +2f6933b5ee0f5fdd823d9717d8729f3c2523811b
+ diff -Npru cloned.*/.hglf/large.bin cloned.*/.hglf/large.bin (glob)
+ --- cloned.*/.hglf/large.bin * (glob)
+ +++ cloned.*/.hglf/large.bin * (glob)
+ @@ -0,0 +1 @@
+ +7f7097b041ccf68cc5561e9600da4655d21c6d18
+ diff -Npru cloned.*/.hgsub cloned.*/.hgsub (glob)
+ --- cloned.*/.hgsub * (glob)
+ +++ cloned.*/.hgsub * (glob)
+ @@ -1 +1,2 @@
+ sub1 = ../sub1
+ +sub3 = sub3
+ diff -Npru cloned.*/.hgsubstate cloned.*/.hgsubstate (glob)
+ --- cloned.*/.hgsubstate * (glob)
+ +++ cloned.*/.hgsubstate * (glob)
+ @@ -1 +1,2 @@
+ -fc3b4ce2696f7741438c79207583768f2ce6b0dd sub1
+ +7a36fa02b66e61f27f3d4a822809f159479b8ab2 sub1
+ +b1a26de6f2a045a9f079323693614ee322f1ff7e sub3
+ diff -Npru cloned.*/foo/bar/def cloned.*/foo/bar/def (glob)
+ --- cloned.*/foo/bar/def * (glob)
+ +++ cloned.*/foo/bar/def * (glob)
+ @@ -0,0 +1 @@
+ +changed
+ diff -Npru cloned.*/main cloned.*/main (glob)
+ --- cloned.*/main * (glob)
+ +++ cloned.*/main * (glob)
+ @@ -1 +1 @@
+ -main
+ +foo
+ diff -Npru cloned.*/sub1/.hgsubstate cloned.*/sub1/.hgsubstate (glob)
+ --- cloned.*/sub1/.hgsubstate * (glob)
+ +++ cloned.*/sub1/.hgsubstate * (glob)
+ @@ -1 +1 @@
+ -c57a0840e3badd667ef3c3ef65471609acb2ba3c sub2
+ +c77908c81ccea3794a896c79e98b0e004aee2e9e sub2
+ diff -Npru cloned.*/sub1/sub2/folder/test.txt cloned.*/sub1/sub2/folder/test.txt (glob)
+ --- cloned.*/sub1/sub2/folder/test.txt * (glob)
+ +++ cloned.*/sub1/sub2/folder/test.txt * (glob)
+ @@ -0,0 +1 @@
+ +subfolder
+ diff -Npru cloned.*/sub1/sub2/sub2 cloned.*/sub1/sub2/sub2 (glob)
+ --- cloned.*/sub1/sub2/sub2 * (glob)
+ +++ cloned.*/sub1/sub2/sub2 * (glob)
+ @@ -1 +1 @@
+ -sub2
+ +modified
+ diff -Npru cloned.*/sub3/a.txt cloned.*/sub3/a.txt (glob)
+ --- cloned.*/sub3/a.txt * (glob)
+ +++ cloned.*/sub3/a.txt * (glob)
+ @@ -0,0 +1 @@
+ +xyz
+ [1]
+
+ $ echo mod > sub1/sub2/sub2
+ $ hg --config extensions.extdiff= extdiff -S
+ --- */cloned.*/sub1/sub2/sub2 * (glob)
+ +++ */cloned/sub1/sub2/sub2 * (glob)
+ @@ -1 +1 @@
+ -modified
+ +mod
+ [1]
+
$ cd ..
More information about the Mercurial-devel
mailing list