Sorry about last patch, it had some errors. Here is a better version:
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, fnode, fl = pl[i]
+ parentrev = fl.linkrev(fl.rev(fnode))
+ parentnode = cl.node(parentrev)
+ last = None
+ if fnode != nullid and not cl.descendant(parentrev, curr):
+ # duplicate linkrev, explore
+ visit = [curr]
+ seen = set()
+ while visit:
+ n = visit.pop()
+ if n <= parentrev or n in seen:
+ continue
+ seen.add(n)
+ cldata = cl.read(parentnode)
+ if path in cldata[3]:
+ fn = mf.read(cldata[0]).get(path)
+ if last is not None and fn != fnode:
+ continue
+ if fn == fnode:
+ last = n
+ for p in cl.parentrevs(n):
+ if p != nullrev:
+ visit.append(p)
+ if last is not None:
+ pl[i] = (path, fnode, fl, last)
+ else:
+ pl[i] = (path, fnode, 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 |