mercurial/revlog.py
changeset 1535 7ae0ce7a3dc4
parent 1533 3d11f81c9145
child 1550 ccb9b62de892
equal deleted inserted replaced
1534:80a3d6a0af71 1535:7ae0ce7a3dc4
    68         self.l = len(data)/self.s
    68         self.l = len(data)/self.s
    69         self.index = [None] * self.l
    69         self.index = [None] * self.l
    70         self.map = {nullid: -1}
    70         self.map = {nullid: -1}
    71         self.all = 0
    71         self.all = 0
    72         self.revlog = revlog
    72         self.revlog = revlog
       
    73 
       
    74     def trunc(self, pos):
       
    75         self.l = pos/self.s
    73 
    76 
    74     def load(self, pos=None):
    77     def load(self, pos=None):
    75         if self.all: return
    78         if self.all: return
    76         if pos is not None:
    79         if pos is not None:
    77             block = pos / 1000
    80             block = pos / 1000
   102             pos += len(self.p.index)
   105             pos += len(self.p.index)
   103         self.p.load(pos)
   106         self.p.load(pos)
   104         return self.p.index[pos]
   107         return self.p.index[pos]
   105     def __getitem__(self, pos):
   108     def __getitem__(self, pos):
   106         return self.p.index[pos] or self.load(pos)
   109         return self.p.index[pos] or self.load(pos)
       
   110     def __delitem__(self, pos):
       
   111         del self.p.index[pos]
   107     def append(self, e):
   112     def append(self, e):
   108         self.p.index.append(e)
   113         self.p.index.append(e)
       
   114     def trunc(self, pos):
       
   115         self.p.trunc(pos)
   109 
   116 
   110 class lazymap:
   117 class lazymap:
   111     """a lazy version of the node map"""
   118     """a lazy version of the node map"""
   112     def __init__(self, parser):
   119     def __init__(self, parser):
   113         self.p = parser
   120         self.p = parser
   138                 return self.p.map[key]
   145                 return self.p.map[key]
   139             except KeyError:
   146             except KeyError:
   140                 raise KeyError("node " + hex(key))
   147                 raise KeyError("node " + hex(key))
   141     def __setitem__(self, key, val):
   148     def __setitem__(self, key, val):
   142         self.p.map[key] = val
   149         self.p.map[key] = val
       
   150     def __delitem__(self, key):
       
   151         del self.p.map[key]
   143 
   152 
   144 class RevlogError(Exception): pass
   153 class RevlogError(Exception): pass
   145 
   154 
   146 class revlog:
   155 class revlog:
   147     """
   156     """
   832 
   841 
   833         dfh.close()
   842         dfh.close()
   834         ifh.close()
   843         ifh.close()
   835         return node
   844         return node
   836 
   845 
       
   846     def strip(self, rev, minlink):
       
   847         if self.count() == 0 or rev >= self.count():
       
   848             return
       
   849 
       
   850         # When stripping away a revision, we need to make sure it
       
   851         # does not actually belong to an older changeset.
       
   852         # The minlink parameter defines the oldest revision
       
   853         # we're allowed to strip away.
       
   854         while minlink > self.index[rev][3]:
       
   855             rev += 1
       
   856             if rev >= self.count():
       
   857                 return
       
   858 
       
   859         # first truncate the files on disk
       
   860         end = self.start(rev)
       
   861         self.opener(self.datafile, "a").truncate(end)
       
   862         end = rev * struct.calcsize(indexformat)
       
   863         self.opener(self.indexfile, "a").truncate(end)
       
   864 
       
   865         # then reset internal state in memory to forget those revisions
       
   866         self.cache = None
       
   867         for p in self.index[rev:]:
       
   868             del self.nodemap[p[6]]
       
   869         del self.index[rev:]
       
   870 
       
   871         # truncating the lazyindex also truncates the lazymap.
       
   872         if isinstance(self.index, lazyindex):
       
   873             self.index.trunc(end)
       
   874 
       
   875 
   837     def checksize(self):
   876     def checksize(self):
   838         expected = 0
   877         expected = 0
   839         if self.count():
   878         if self.count():
   840             expected = self.end(self.count() - 1)
   879             expected = self.end(self.count() - 1)
   841         try:
   880         try: