extdiff: correctly handle deleted subrepositories (issue3153)
Previously, when extdiff was called on two changesets where
a subrepository had been removed, an unexpected KeyError would
be raised.
Now, the missing subrepository will be ignored. This behavior
mirrors the behavior in diffordiffstat from cmdutil.py line
~1138-1153. The KeyError is caught and the revision is
set to None.
try/catch of LookupError around matchmod.narrowmatcher and
sub.status is removed, as LookupError is not raised anywhere
within those methods or deeper calls.
--- a/mercurial/context.py Sat Nov 21 13:28:12 2015 +0900
+++ b/mercurial/context.py Tue Nov 17 16:42:52 2015 -0600
@@ -336,17 +336,19 @@
if listsubrepos:
for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
- rev2 = ctx2.subrev(subpath)
try:
- submatch = matchmod.narrowmatcher(subpath, match)
- s = sub.status(rev2, match=submatch, ignored=listignored,
- clean=listclean, unknown=listunknown,
- listsubrepos=True)
- for rfiles, sfiles in zip(r, s):
- rfiles.extend("%s/%s" % (subpath, f) for f in sfiles)
- except error.LookupError:
- self._repo.ui.status(_("skipping missing "
- "subrepository: %s\n") % subpath)
+ rev2 = ctx2.subrev(subpath)
+ 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 ignore it.
+ rev2 = None
+ submatch = matchmod.narrowmatcher(subpath, match)
+ s = sub.status(rev2, match=submatch, ignored=listignored,
+ clean=listclean, unknown=listunknown,
+ listsubrepos=True)
+ for rfiles, sfiles in zip(r, s):
+ rfiles.extend("%s/%s" % (subpath, f) for f in sfiles)
for l in r:
l.sort()
--- a/tests/test-extdiff.t Sat Nov 21 13:28:12 2015 +0900
+++ b/tests/test-extdiff.t Tue Nov 17 16:42:52 2015 -0600
@@ -126,6 +126,25 @@
diff-like tools yield a non-zero exit code
#endif
+issue3153: ensure using extdiff with removed subrepos doesn't crash:
+
+ $ hg init suba
+ $ cd suba
+ $ echo suba > suba
+ $ hg add
+ adding suba
+ $ hg ci -m "adding suba file"
+ $ cd ..
+ $ echo suba=suba > .hgsub
+ $ hg add
+ adding .hgsub
+ $ hg ci -Sm "adding subrepo"
+ $ echo > .hgsub
+ $ hg ci -m "removing subrepo"
+ $ hg falabala -r 4 -r 5 -S
+ diffing a.398e36faf9c6 a.5ab95fb166c4
+ [1]
+
issue4463: usage of command line configuration without additional quoting
$ cat <<EOF >> $HGRCPATH