comparison mercurial/revlog.py @ 4986:58cc017ec7e0

revlog: abstract out index entry packing This lets us remove most of the remaining v0/v1 logic from revlog
author Matt Mackall <mpm@selenic.com>
date Mon, 23 Jul 2007 20:44:08 -0500
parents e6525e459157
children 8d30004ada40
comparison
equal deleted inserted replaced
4985:e6525e459157 4986:58cc017ec7e0
327 nodemap[e[6]] = n 327 nodemap[e[6]] = n
328 n += 1 328 n += 1
329 329
330 return index, nodemap, None 330 return index, nodemap, None
331 331
332 def packentry(self, entry, node, version):
333 e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4],
334 node(entry[5]), node(entry[6]), entry[7])
335 return struct.pack(indexformatv0, *e2)
336
332 class revlogio(object): 337 class revlogio(object):
333 def __init__(self): 338 def __init__(self):
334 self.size = struct.calcsize(indexformatng) 339 self.size = struct.calcsize(indexformatng)
335 340
336 def parseindex(self, fp, inline): 341 def parseindex(self, fp, inline):
375 type = gettype(e[0]) 380 type = gettype(e[0])
376 e[0] = offset_type(0, type) 381 e[0] = offset_type(0, type)
377 index[0] = e 382 index[0] = e
378 383
379 return index, nodemap, cache 384 return index, nodemap, cache
385
386 def packentry(self, entry, node, version):
387 p = struct.pack(indexformatng, *entry)
388 if not entry[3] and not getoffset(entry[0]) and entry[5] == nullrev:
389 p = struct.pack(versionformat, version) + p[4:]
390 return p
380 391
381 class revlog(object): 392 class revlog(object):
382 """ 393 """
383 the underlying revision storage object 394 the underlying revision storage object
384 395
944 fp.close() 955 fp.close()
945 df.close() 956 df.close()
946 fp = self.opener(self.indexfile, 'w', atomictemp=True) 957 fp = self.opener(self.indexfile, 'w', atomictemp=True)
947 self.version &= ~(REVLOGNGINLINEDATA) 958 self.version &= ~(REVLOGNGINLINEDATA)
948 self._inline = False 959 self._inline = False
949 if self.count(): 960 for i in xrange(self.count()):
950 x = self.index[0] 961 e = self._io.packentry(self.index[i], self.node, self.version)
951 e = struct.pack(indexformatng, *x)[4:]
952 l = struct.pack(versionformat, self.version)
953 fp.write(l)
954 fp.write(e)
955
956 for i in xrange(1, self.count()):
957 x = self.index[i]
958 e = struct.pack(indexformatng, *x)
959 fp.write(e) 962 fp.write(e)
960 963
961 # if we don't call rename, the temp file will never replace the 964 # if we don't call rename, the temp file will never replace the
962 # real index 965 # real index
963 fp.rename() 966 fp.rename()
1008 e = (offset_type(offset, 0), l, len(text), 1011 e = (offset_type(offset, 0), l, len(text),
1009 base, link, self.rev(p1), self.rev(p2), node) 1012 base, link, self.rev(p1), self.rev(p2), node)
1010 self.index.insert(-1, e) 1013 self.index.insert(-1, e)
1011 self.nodemap[node] = curr 1014 self.nodemap[node] = curr
1012 1015
1013 if self.version == REVLOGV0: 1016 entry = self._io.packentry(e, self.node, self.version)
1014 e = (offset, l, base, link, p1, p2, node)
1015 entry = struct.pack(indexformatv0, *e)
1016 else:
1017 entry = struct.pack(indexformatng, *e)
1018 if not curr:
1019 entry = struct.pack(versionformat, self.version) + entry[4:]
1020
1021 if not self._inline: 1017 if not self._inline:
1022 transaction.add(self.datafile, offset) 1018 transaction.add(self.datafile, offset)
1023 transaction.add(self.indexfile, curr * len(entry)) 1019 transaction.add(self.indexfile, curr * len(entry))
1024 if data[0]: 1020 if data[0]:
1025 dfh.write(data[0]) 1021 dfh.write(data[0])
1166 else: 1162 else:
1167 e = (offset_type(end, 0), len(cdelta), textlen, base, 1163 e = (offset_type(end, 0), len(cdelta), textlen, base,
1168 link, self.rev(p1), self.rev(p2), node) 1164 link, self.rev(p1), self.rev(p2), node)
1169 self.index.insert(-1, e) 1165 self.index.insert(-1, e)
1170 self.nodemap[node] = r 1166 self.nodemap[node] = r
1167 entry = self._io.packentry(e, self.node, self.version)
1171 if self._inline: 1168 if self._inline:
1172 ifh.write(struct.pack(indexformatng, *e)) 1169 ifh.write(entry)
1173 ifh.write(cdelta) 1170 ifh.write(cdelta)
1174 self.checkinlinesize(transaction, ifh) 1171 self.checkinlinesize(transaction, ifh)
1175 if not self._inline: 1172 if not self._inline:
1176 dfh = self.opener(self.datafile, "a") 1173 dfh = self.opener(self.datafile, "a")
1177 ifh = self.opener(self.indexfile, "a") 1174 ifh = self.opener(self.indexfile, "a")
1178 else: 1175 else:
1179 if self.version == REVLOGV0:
1180 e = (end, len(cdelta), base, link, p1, p2, node)
1181 entry = struct.pack(indexformatv0, *e)
1182 else:
1183 entry = struct.pack(indexformatng, *e)
1184 dfh.write(cdelta) 1176 dfh.write(cdelta)
1185 ifh.write(entry) 1177 ifh.write(entry)
1186 1178
1187 t, r, chain, prev = r, r + 1, node, node 1179 t, r, chain, prev = r, r + 1, node, node
1188 base = self.base(t) 1180 base = self.base(t)