comparison mercurial/revlog.py @ 1535:7ae0ce7a3dc4

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.
author mason@suse.com
date Fri, 11 Nov 2005 18:20:24 -0800
parents 3d11f81c9145
children ccb9b62de892
comparison
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: