diff: support diffing explicit files in subrepos
authorMatt Harbison <matt_harbison@yahoo.com>
Thu, 21 Mar 2019 21:40:22 -0400
changeset 42010 db26dbbee74d
parent 42009 8f427f7c1f71
child 42011 22278dae287c
diff: support diffing explicit files in subrepos Most other commands support implied recursion based on file names already.
mercurial/help/subrepos.txt
mercurial/logcmdutil.py
tests/test-subrepo.t
--- a/mercurial/help/subrepos.txt	Thu Mar 21 18:27:09 2019 -0700
+++ b/mercurial/help/subrepos.txt	Thu Mar 21 21:40:22 2019 -0400
@@ -105,8 +105,10 @@
     Subversion subrepositories will print a warning and abort.
 
 :diff: diff does not recurse in subrepos unless -S/--subrepos is
-    specified. Changes are displayed as usual, on the subrepositories
-    elements. Subversion subrepositories are currently silently ignored.
+    specified.  However, if you specify the full path of a file or
+    directory in a subrepo, it will be diffed even without
+    -S/--subrepos being specified.  Subversion subrepositories are
+    currently silently ignored.
 
 :files: files does not recurse into subrepos unless -S/--subrepos is
     specified.  However, if you specify the full path of a file or
--- a/mercurial/logcmdutil.py	Thu Mar 21 18:27:09 2019 -0700
+++ b/mercurial/logcmdutil.py	Thu Mar 21 21:40:22 2019 -0400
@@ -129,19 +129,19 @@
             for chunk, label in chunks:
                 ui.write(chunk, label=label)
 
-    if listsubrepos:
-        for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
-            tempnode2 = node2
-            try:
-                if node2 is not None:
-                    tempnode2 = ctx2.substate[subpath][1]
-            except KeyError:
-                # A subrepo that existed in node1 was deleted between node1 and
-                # node2 (inclusive). Thus, ctx2's substate won't contain that
-                # subpath. The best we can do is to ignore it.
-                tempnode2 = None
-            submatch = matchmod.subdirmatcher(subpath, match)
-            subprefix = repo.wvfs.reljoin(prefix, subpath)
+    for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
+        tempnode2 = node2
+        try:
+            if node2 is not None:
+                tempnode2 = ctx2.substate[subpath][1]
+        except KeyError:
+            # A subrepo that existed in node1 was deleted between node1 and
+            # node2 (inclusive). Thus, ctx2's substate won't contain that
+            # subpath. The best we can do is to ignore it.
+            tempnode2 = None
+        submatch = matchmod.subdirmatcher(subpath, match)
+        subprefix = repo.wvfs.reljoin(prefix, subpath)
+        if listsubrepos or match.exact(subpath) or any(submatch.files()):
             sub.diff(ui, diffopts, tempnode2, submatch, changes=changes,
                      stat=stat, fp=fp, prefix=subprefix)
 
--- a/tests/test-subrepo.t	Thu Mar 21 18:27:09 2019 -0700
+++ b/tests/test-subrepo.t	Thu Mar 21 21:40:22 2019 -0400
@@ -1875,6 +1875,19 @@
   @@ -0,0 +1,1 @@
   +bar
 
+  $ hg diff -X '.hgsub*' --nodates s
+  diff -r 000000000000 s/a
+  --- /dev/null
+  +++ b/s/a
+  @@ -0,0 +1,1 @@
+  +a
+  $ hg diff -X '.hgsub*' --nodates s/a
+  diff -r 000000000000 s/a
+  --- /dev/null
+  +++ b/s/a
+  @@ -0,0 +1,1 @@
+  +a
+
   $ cd ..
 
 test for ssh exploit 2017-07-25