Message11727

Author tonfa
Recipients Ringding, abuehl, astratto, cboos, djc, dsp, friedrich, jcoomes, kiilerix, kupfer, mg, mjnelson, morisgi, mpm, parren, sjtai
Date 2010-02-15.16:45:40
Content
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
History
Date User Action Args
2010-02-15 16:45:40tonfasetmessageid: <1266252340.19.0.179373558665.issue1327@mercurial.selenic.com>
2010-02-15 16:45:40tonfasetrecipients: + mpm, cboos, kupfer, kiilerix, mg, parren, djc, abuehl, jcoomes, astratto, dsp, Ringding, sjtai, mjnelson, morisgi, friedrich
2010-02-15 16:45:40tonfalinkissue1327 messages
2010-02-15 16:45:40tonfacreate