Mercurial > public > mercurial-scm > hg
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: |