[PATCH 7 of 7] revlog: calculate minimum delta against p1, p2, prev. apparently it is too expensive compared to memory efficiency`

in3xes at gmail.com in3xes at gmail.com
Fri Aug 6 02:00:39 CDT 2010


# HG changeset patch
# User Pradeepkumar Gayam <in3xes at gmail.com>
# Date 1281077514 -19800
# Node ID 064b77042761457ce8fbc1436f6eb6232665f885
# Parent  64457d46658a6b5777b856000130a086437abe0a
revlog: calculate minimum delta against p1, p2, prev. apparently it is too expensive compared to memory efficiency`

diff -r 64457d46658a -r 064b77042761 mercurial/revlog.py
--- a/mercurial/revlog.py	Fri Aug 06 12:18:31 2010 +0530
+++ b/mercurial/revlog.py	Fri Aug 06 12:21:54 2010 +0530
@@ -1019,7 +1019,7 @@
         if self.base(rev) == rev:
             return nullrev
         elif self.flags(rev) & REVIDX_PARENTDELTA:
-            return self.parentrevs(rev)[0]
+            return self.base(rev)
         else:
             return rev-1
 
@@ -1155,19 +1155,34 @@
         curr = len(self)
         prev = curr - 1
         base = self.base(prev)
+        p1, p2 = self.rev(p1), self.rev(p2)
         offset = self.end(prev)
         flags = 0
 
+        def candidates(revs):
+            for p in revs:
+                ptext = self.revision(self.node(p))
+                delta = mdiff.textdiff(ptext, text)
+                data = compress(delta)
+                l = len(data[0]) + len(data[1])
+                yield l, p, data
+
         if curr:
             if not d:
                 if self._parentdelta:
-                    ptext = self.revision(p1)
-                    flags = REVIDX_PARENTDELTA
+                    l, p, data = min(candidates(p for p in (p1, p2, prev) if p != nullrev))
+                    if p != prev:
+                        base = p
+                        flags = REVIDX_PARENTDELTA
                 else:
                     ptext = self.revision(self.node(prev))
-                d = mdiff.textdiff(ptext, text)
-            data = compress(d)
-            l = len(data[1]) + len(data[0])
+                    d = mdiff.textdiff(ptext, text)
+                    data = compress(d)
+                    l = len(data[0]) + len(data[1])
+            else:
+                data = compress(d)
+                l = len(data[0]) + len(data[1])
+
             dist = l + offset - self.start(base)
 
         # full versions are inserted when the needed deltas
@@ -1180,7 +1195,7 @@
             base = curr
 
         e = (offset_type(offset, flags), l, len(text),
-             base, link, self.rev(p1), self.rev(p2), node)
+             base, link, p1, p2, node)
         self.index.insert(-1, e)
         self.nodemap[node] = curr
 


More information about the Mercurial-devel mailing list