diff: support diffing explicit files in subrepos
Most other commands support implied recursion based on file names already.
--- 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