Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 4982:9672e3c42b0c
revlog: change _inline from a function to a variable
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 23 Jul 2007 20:44:08 -0500 |
parents | e7131935fbb3 |
children | 4dbcfc6e359e |
comparison
equal
deleted
inserted
replaced
4981:e7131935fbb3 | 4982:9672e3c42b0c |
---|---|
458 % (self.indexfile, flags >> 16)) | 458 % (self.indexfile, flags >> 16)) |
459 else: | 459 else: |
460 raise RevlogError(_("index %s unknown format %d") | 460 raise RevlogError(_("index %s unknown format %d") |
461 % (self.indexfile, fmt)) | 461 % (self.indexfile, fmt)) |
462 self.version = v | 462 self.version = v |
463 self._inline = v & REVLOGNGINLINEDATA | |
463 self.nodemap = {nullid: nullrev} | 464 self.nodemap = {nullid: nullrev} |
464 self.index = [] | 465 self.index = [] |
465 self._io = revlogio() | 466 self._io = revlogio() |
466 if self.version == REVLOGV0: | 467 if self.version == REVLOGV0: |
467 self._io = revlogoldio() | 468 self._io = revlogoldio() |
468 if i: | 469 if i: |
469 self.index, self.nodemap = self._io.parseindex(f, st, self._inline()) | 470 self.index, self.nodemap = self._io.parseindex(f, st, self._inline) |
470 # add the magic null revision at -1 | 471 # add the magic null revision at -1 |
471 self.index.append((0, 0, 0, -1, -1, -1, -1, nullid)) | 472 self.index.append((0, 0, 0, -1, -1, -1, -1, nullid)) |
472 | 473 |
473 def _loadindex(self, start, end): | 474 def _loadindex(self, start, end): |
474 """load a block of indexes all at once from the lazy parser""" | 475 """load a block of indexes all at once from the lazy parser""" |
486 """loads the map from the lazy parser""" | 487 """loads the map from the lazy parser""" |
487 if isinstance(self.nodemap, lazymap): | 488 if isinstance(self.nodemap, lazymap): |
488 self.nodemap.p.loadmap() | 489 self.nodemap.p.loadmap() |
489 self.nodemap = self.nodemap.p.map | 490 self.nodemap = self.nodemap.p.map |
490 | 491 |
491 def _inline(self): | |
492 return self.version & REVLOGNGINLINEDATA | |
493 def tip(self): | 492 def tip(self): |
494 return self.node(len(self.index) - 2) | 493 return self.node(len(self.index) - 2) |
495 def count(self): | 494 def count(self): |
496 return len(self.index) - 1 | 495 return len(self.index) - 1 |
497 | 496 |
842 """apply a list of patches to a string""" | 841 """apply a list of patches to a string""" |
843 return mdiff.patches(t, pl) | 842 return mdiff.patches(t, pl) |
844 | 843 |
845 def chunk(self, rev, df=None, cachelen=4096): | 844 def chunk(self, rev, df=None, cachelen=4096): |
846 start, length = self.start(rev), self.length(rev) | 845 start, length = self.start(rev), self.length(rev) |
847 inline = self._inline() | 846 inline = self._inline |
848 if inline: | 847 if inline: |
849 start += (rev + 1) * self._io.size | 848 start += (rev + 1) * self._io.size |
850 end = start + length | 849 end = start + length |
851 def loadcache(df): | 850 def loadcache(df): |
852 cache_length = max(cachelen, length) # 4k | 851 cache_length = max(cachelen, length) # 4k |
897 # look up what we need to read | 896 # look up what we need to read |
898 text = None | 897 text = None |
899 rev = self.rev(node) | 898 rev = self.rev(node) |
900 base = self.base(rev) | 899 base = self.base(rev) |
901 | 900 |
902 if self._inline(): | 901 if self._inline: |
903 # we probably have the whole chunk cached | 902 # we probably have the whole chunk cached |
904 df = None | 903 df = None |
905 else: | 904 else: |
906 df = self.opener(self.datafile) | 905 df = self.opener(self.datafile) |
907 | 906 |
927 | 926 |
928 self.cache = (node, rev, text) | 927 self.cache = (node, rev, text) |
929 return text | 928 return text |
930 | 929 |
931 def checkinlinesize(self, tr, fp=None): | 930 def checkinlinesize(self, tr, fp=None): |
932 if not self._inline(): | 931 if not self._inline: |
933 return | 932 return |
934 if not fp: | 933 if not fp: |
935 fp = self.opener(self.indexfile, 'r') | 934 fp = self.opener(self.indexfile, 'r') |
936 fp.seek(0, 2) | 935 fp.seek(0, 2) |
937 size = fp.tell() | 936 size = fp.tell() |
956 df.write(d) | 955 df.write(d) |
957 fp.close() | 956 fp.close() |
958 df.close() | 957 df.close() |
959 fp = self.opener(self.indexfile, 'w', atomictemp=True) | 958 fp = self.opener(self.indexfile, 'w', atomictemp=True) |
960 self.version &= ~(REVLOGNGINLINEDATA) | 959 self.version &= ~(REVLOGNGINLINEDATA) |
960 self._inline = False | |
961 if self.count(): | 961 if self.count(): |
962 x = self.index[0] | 962 x = self.index[0] |
963 e = struct.pack(indexformatng, *x)[4:] | 963 e = struct.pack(indexformatng, *x)[4:] |
964 l = struct.pack(versionformat, self.version) | 964 l = struct.pack(versionformat, self.version) |
965 fp.write(l) | 965 fp.write(l) |
985 link - the linkrev data to add | 985 link - the linkrev data to add |
986 p1, p2 - the parent nodeids of the revision | 986 p1, p2 - the parent nodeids of the revision |
987 d - an optional precomputed delta | 987 d - an optional precomputed delta |
988 """ | 988 """ |
989 dfh = None | 989 dfh = None |
990 if not self._inline(): | 990 if not self._inline: |
991 dfh = self.opener(self.datafile, "a") | 991 dfh = self.opener(self.datafile, "a") |
992 ifh = self.opener(self.indexfile, "a+") | 992 ifh = self.opener(self.indexfile, "a+") |
993 return self._addrevision(text, transaction, link, p1, p2, d, ifh, dfh) | 993 return self._addrevision(text, transaction, link, p1, p2, d, ifh, dfh) |
994 | 994 |
995 def _addrevision(self, text, transaction, link, p1, p2, d, ifh, dfh): | 995 def _addrevision(self, text, transaction, link, p1, p2, d, ifh, dfh): |
1028 else: | 1028 else: |
1029 entry = struct.pack(indexformatng, *e) | 1029 entry = struct.pack(indexformatng, *e) |
1030 if not curr: | 1030 if not curr: |
1031 entry = struct.pack(versionformat, self.version) + entry[4:] | 1031 entry = struct.pack(versionformat, self.version) + entry[4:] |
1032 | 1032 |
1033 if not self._inline(): | 1033 if not self._inline: |
1034 transaction.add(self.datafile, offset) | 1034 transaction.add(self.datafile, offset) |
1035 transaction.add(self.indexfile, curr * len(entry)) | 1035 transaction.add(self.indexfile, curr * len(entry)) |
1036 if data[0]: | 1036 if data[0]: |
1037 dfh.write(data[0]) | 1037 dfh.write(data[0]) |
1038 dfh.write(data[1]) | 1038 dfh.write(data[1]) |
1116 end = self.end(t) | 1116 end = self.end(t) |
1117 | 1117 |
1118 ifh = self.opener(self.indexfile, "a+") | 1118 ifh = self.opener(self.indexfile, "a+") |
1119 ifh.seek(0, 2) | 1119 ifh.seek(0, 2) |
1120 transaction.add(self.indexfile, ifh.tell(), self.count()) | 1120 transaction.add(self.indexfile, ifh.tell(), self.count()) |
1121 if self._inline(): | 1121 if self._inline: |
1122 dfh = None | 1122 dfh = None |
1123 else: | 1123 else: |
1124 transaction.add(self.datafile, end) | 1124 transaction.add(self.datafile, end) |
1125 dfh = self.opener(self.datafile, "a") | 1125 dfh = self.opener(self.datafile, "a") |
1126 | 1126 |
1165 ifh.flush() | 1165 ifh.flush() |
1166 text = self.revision(chain) | 1166 text = self.revision(chain) |
1167 text = self.patches(text, [delta]) | 1167 text = self.patches(text, [delta]) |
1168 chk = self._addrevision(text, transaction, link, p1, p2, None, | 1168 chk = self._addrevision(text, transaction, link, p1, p2, None, |
1169 ifh, dfh) | 1169 ifh, dfh) |
1170 if not dfh and not self._inline(): | 1170 if not dfh and not self._inline: |
1171 # addrevision switched from inline to conventional | 1171 # addrevision switched from inline to conventional |
1172 # reopen the index | 1172 # reopen the index |
1173 dfh = self.opener(self.datafile, "a") | 1173 dfh = self.opener(self.datafile, "a") |
1174 ifh = self.opener(self.indexfile, "a") | 1174 ifh = self.opener(self.indexfile, "a") |
1175 if chk != node: | 1175 if chk != node: |
1178 else: | 1178 else: |
1179 e = (offset_type(end, 0), len(cdelta), textlen, base, | 1179 e = (offset_type(end, 0), len(cdelta), textlen, base, |
1180 link, self.rev(p1), self.rev(p2), node) | 1180 link, self.rev(p1), self.rev(p2), node) |
1181 self.index.insert(-1, e) | 1181 self.index.insert(-1, e) |
1182 self.nodemap[node] = r | 1182 self.nodemap[node] = r |
1183 if self._inline(): | 1183 if self._inline: |
1184 ifh.write(struct.pack(indexformatng, *e)) | 1184 ifh.write(struct.pack(indexformatng, *e)) |
1185 ifh.write(cdelta) | 1185 ifh.write(cdelta) |
1186 self.checkinlinesize(transaction, ifh) | 1186 self.checkinlinesize(transaction, ifh) |
1187 if not self._inline(): | 1187 if not self._inline: |
1188 dfh = self.opener(self.datafile, "a") | 1188 dfh = self.opener(self.datafile, "a") |
1189 ifh = self.opener(self.indexfile, "a") | 1189 ifh = self.opener(self.indexfile, "a") |
1190 else: | 1190 else: |
1191 if self.version == REVLOGV0: | 1191 if self.version == REVLOGV0: |
1192 e = (end, len(cdelta), base, link, p1, p2, node) | 1192 e = (end, len(cdelta), base, link, p1, p2, node) |
1219 if rev >= self.count(): | 1219 if rev >= self.count(): |
1220 return | 1220 return |
1221 | 1221 |
1222 # first truncate the files on disk | 1222 # first truncate the files on disk |
1223 end = self.start(rev) | 1223 end = self.start(rev) |
1224 if not self._inline(): | 1224 if not self._inline: |
1225 df = self.opener(self.datafile, "a") | 1225 df = self.opener(self.datafile, "a") |
1226 df.truncate(end) | 1226 df.truncate(end) |
1227 end = rev * self._io.size | 1227 end = rev * self._io.size |
1228 else: | 1228 else: |
1229 end += rev * self._io.size | 1229 end += rev * self._io.size |
1259 f.seek(0, 2) | 1259 f.seek(0, 2) |
1260 actual = f.tell() | 1260 actual = f.tell() |
1261 s = self._io.size | 1261 s = self._io.size |
1262 i = actual / s | 1262 i = actual / s |
1263 di = actual - (i * s) | 1263 di = actual - (i * s) |
1264 if self._inline(): | 1264 if self._inline: |
1265 databytes = 0 | 1265 databytes = 0 |
1266 for r in xrange(self.count()): | 1266 for r in xrange(self.count()): |
1267 databytes += self.length(r) | 1267 databytes += self.length(r) |
1268 dd = 0 | 1268 dd = 0 |
1269 di = actual - self.count() * s - databytes | 1269 di = actual - self.count() * s - databytes |