Mercurial > public > mercurial-scm > hg-stable
diff hgext/extdiff.py @ 25813:18bae5eb58c5
extdiff: add support for subrepos
Git and svn subrepo support is incomplete, because they don't support archiving
the working copy.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 15 Jul 2012 12:43:10 -0400 |
parents | 68822b7cdd01 |
children | 415709a43e54 |
line wrap: on
line diff
--- 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):