# HG changeset patch # User Matt Harbison # Date 1553218822 14400 # Node ID db26dbbee74de9cbced507fd9466de42457f0ea5 # Parent 8f427f7c1f715c5aeb6de70fcb7f37c29a5667e5 diff: support diffing explicit files in subrepos Most other commands support implied recursion based on file names already. diff -r 8f427f7c1f71 -r db26dbbee74d mercurial/help/subrepos.txt --- 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 diff -r 8f427f7c1f71 -r db26dbbee74d mercurial/logcmdutil.py --- 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) diff -r 8f427f7c1f71 -r db26dbbee74d tests/test-subrepo.t --- 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