mercurial/revlog.py
changeset 4986 58cc017ec7e0
parent 4985 e6525e459157
child 4987 8d30004ada40
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)