The following patch, while still a bit hackish, should make filecontext() do
the right thing™ when calling parents()
At least for most of the cases.
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -377,10 +377,42 @@
r = self._filelog.renamed(self._filenode)
if r:
- pl[0] = (r[0], r[1], None)
+ pl[0] = (r[0], r[1], self._repo.file(r[0]))
- return [filectx(self._repo, p, fileid=n, filelog=l)
- for p, n, l in pl if n != nullid]
+ curr = self.rev()
+ cl = self._repo.changelog
+ mf = self._repo.manifest
+ for i in xrange(len(pl)):
+ path, n, fl = pl[i]
+ parentrev = fl.linkrev(fl.rev(n))
+ parentnode = cl.node(parentrev)
+ last = None
+ if not cl.descendant(parentrev, curr):
+ # duplicate linkrev, explore
+ visit = [self.rev()]
+ seen = set()
+ while visit:
+ n = visit.pop(0)
+ if n <= parentrev or n in seen:
+ continue
+ seen.add(n)
+ cldata = cl.read(parentnode)
+ if path in cldata[3]:
+ fn = mf.readdelta(cldata[0]).get(path)
+ if last is not None and fn != n:
+ continue
+ if fn == n:
+ last = n
+ for p in cl.parentrevs(n):
+ if p != nullrev:
+ visit.append(p)
+ if last is not None:
+ pl[i] = (path, n, fl, last)
+ else:
+ pl[i] = (path, n, fl, parentrev)
+
+ return [filectx(self._repo, p, fileid=n, changeid=cln, filelog=l)
+ for p, n, l, cln in pl if n != nullid]
def children(self):
# hard for renames |