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):