copies: introduce getdstfctx
Previously `c2` may had an incorrect linkrev because getsrcfctx set wrong
_descendantrev. getsrcfctx() sets descendant rev equals to srcctx.rev() (see
_makegetfctx()), but for `c2` descendant rev should be dstctx. While we were
lucky it didn't broke copytracing it made it significantly slower in some
cases. Besides it broke some external extensions, for example remotefilelog.
--- a/mercurial/copies.py Mon May 29 05:58:08 2017 -0700
+++ b/mercurial/copies.py Mon May 29 06:06:13 2017 -0700
@@ -632,6 +632,7 @@
# We use 'backwards = False' in that case.
backwards = not remotebase and base != tca and f in mb
getsrcfctx = _makegetfctx(srcctx)
+ getdstfctx = _makegetfctx(dstctx)
if msrc[f] == mb.get(f) and not remotebase:
# Nothing to merge
@@ -658,7 +659,7 @@
continue # no match, keep looking
if mdst[of] == mb.get(of):
return # no merge needed, quit early
- c2 = getsrcfctx(of, mdst[of])
+ c2 = getdstfctx(of, mdst[of])
# c2 might be a plain new file on added on destination side that is
# unrelated to the droids we are looking for.
cr = _related(oc, c2, tca.rev())