[patch 09/10] Add revlog.strip to truncate away revisions.

Chris Mason mason at suse.com
Tue Aug 9 12:43:02 CDT 2005


# HG changeset patch
# User mason at suse.com

Add revlog.strip to truncate away revisions.  

This updates the revlog data structures for index and nodemap in place 
so the .d and .i files don't need to be reread after stripping away a revision.

Index: mine/mercurial/revlog.py
===================================================================
--- mine.orig/mercurial/revlog.py
+++ mine/mercurial/revlog.py
@@ -55,6 +55,9 @@ class lazyparser:
         self.all = 0
         self.revlog = revlog
 
+    def trunc(self, pos):
+        self.l = pos/self.s
+
     def load(self, pos=None):
         if self.all: return
         if pos is not None:
@@ -85,6 +88,8 @@ class lazyindex:
         return self.p.index[pos]
     def __getitem__(self, pos):
         return self.p.index[pos] or self.load(pos)
+    def __delitem__(self, pos):
+        del self.p.index[pos]
     def append(self, e):
         self.p.index.append(e)
 
@@ -119,6 +124,8 @@ class lazymap:
                 raise KeyError("node " + hex(key))
     def __setitem__(self, key, val):
         self.p.map[key] = val
+    def __delitem__(self, key):
+        del self.p.map[key]
 
 class revlog:
     def __init__(self, opener, indexfile, datafile):
@@ -126,6 +133,7 @@ class revlog:
         self.datafile = datafile
         self.opener = opener
         self.cache = None
+        self.parser = None
 
         try:
             i = self.opener(self.indexfile).read()
@@ -134,9 +142,9 @@ class revlog:
 
         if len(i) > 10000:
             # big index, let's parse it on demand
-            parser = lazyparser(i, self)
-            self.index = lazyindex(parser)
-            self.nodemap = lazymap(parser)
+            self.parser = lazyparser(i, self)
+            self.index = lazyindex(self.parser)
+            self.nodemap = lazymap(self.parser)
         else:
             s = struct.calcsize(indexformat)
             l = len(i) / s
@@ -543,3 +551,23 @@ class revlog:
         dfh.close()
         ifh.close()
         return node
+
+    def strip(self, rev, minlink):
+        if self.count() == 0 or rev >= self.count():
+            return
+
+        while minlink > self.index[rev][3]:
+            rev += 1
+            if rev >= self.count():
+                return
+
+        end = self.start(rev)
+        self.opener(self.datafile, "a").truncate(end)
+        end = rev * struct.calcsize(indexformat)
+        self.opener(self.indexfile, "a").truncate(end)
+        for p in self.index[rev:]:
+            del self.nodemap[p[6]]
+        del self.index[rev:]
+        if self.parser:
+            self.parser.trunc(end)
+

--


More information about the Mercurial mailing list