# HG changeset patch # User Matt Harbison # Date 2019-03-22 01:40:22 # Node ID db26dbbee74de9cbced507fd9466de42457f0ea5 # Parent 8f427f7c1f715c5aeb6de70fcb7f37c29a5667e5 diff: support diffing explicit files in subrepos Most other commands support implied recursion based on file names already. diff --git a/mercurial/help/subrepos.txt b/mercurial/help/subrepos.txt --- a/mercurial/help/subrepos.txt +++ b/mercurial/help/subrepos.txt @@ -105,8 +105,10 @@ Interaction with Mercurial Commands 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 --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py --- a/mercurial/logcmdutil.py +++ b/mercurial/logcmdutil.py @@ -129,19 +129,19 @@ def diffordiffstat(ui, repo, diffopts, n 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 --git a/tests/test-subrepo.t b/tests/test-subrepo.t --- a/tests/test-subrepo.t +++ b/tests/test-subrepo.t @@ -1875,6 +1875,19 @@ Test that '[paths]' is configured correc @@ -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