# HG changeset patch # User Matt Harbison # Date 1342370590 14400 # Node ID 18bae5eb58c5687a4d2c188e1e1f0e87f9413697 # Parent 68822b7cdd01a84d1c5fa335be492b3706daf510 extdiff: add support for subrepos Git and svn subrepo support is incomplete, because they don't support archiving the working copy. diff -r 68822b7cdd01 -r 18bae5eb58c5 hgext/extdiff.py --- a/hgext/extdiff.py Wed Jul 11 20:48:51 2012 -0400 +++ b/hgext/extdiff.py Sun Jul 15 12:43:10 2012 -0400 @@ -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 -r 68822b7cdd01 -r 18bae5eb58c5 tests/test-extdiff.t --- a/tests/test-extdiff.t Wed Jul 11 20:48:51 2012 -0400 +++ b/tests/test-extdiff.t Sun Jul 15 12:43:10 2012 -0400 @@ -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 -r 68822b7cdd01 -r 18bae5eb58c5 tests/test-extension.t --- a/tests/test-extension.t Wed Jul 11 20:48:51 2012 -0400 +++ b/tests/test-extension.t Sun Jul 15 12:43:10 2012 -0400 @@ -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 -r 68822b7cdd01 -r 18bae5eb58c5 tests/test-subrepo-deep-nested-change.t --- a/tests/test-subrepo-deep-nested-change.t Wed Jul 11 20:48:51 2012 -0400 +++ b/tests/test-subrepo-deep-nested-change.t Sun Jul 15 12:43:10 2012 -0400 @@ -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 ..