mercurial/revlog.py
changeset 5445 64cf1c853674
parent 5370 61462e7d62ed
child 5448 e038738714fd
equal deleted inserted replaced
5444:a0952e4e52eb 5445:64cf1c853674
  1138                 # this can happen if two branches make the same change
  1138                 # this can happen if two branches make the same change
  1139                 # if unique:
  1139                 # if unique:
  1140                 #    raise RevlogError(_("already have %s") % hex(node[:4]))
  1140                 #    raise RevlogError(_("already have %s") % hex(node[:4]))
  1141                 chain = node
  1141                 chain = node
  1142                 continue
  1142                 continue
  1143             delta = chunk[80:]
  1143             delta = buffer(chunk, 80)
       
  1144             del chunk
  1144 
  1145 
  1145             for p in (p1, p2):
  1146             for p in (p1, p2):
  1146                 if not p in self.nodemap:
  1147                 if not p in self.nodemap:
  1147                     raise LookupError(_("unknown parent %s") % short(p))
  1148                     raise LookupError(_("unknown parent %s") % short(p))
  1148 
  1149 
  1157             # version is not the one we have a delta against. We use
  1158             # version is not the one we have a delta against. We use
  1158             # the size of the previous full rev as a proxy for the
  1159             # the size of the previous full rev as a proxy for the
  1159             # current size.
  1160             # current size.
  1160 
  1161 
  1161             if chain == prev:
  1162             if chain == prev:
  1162                 tempd = compress(delta)
  1163                 cdelta = compress(delta)
  1163                 cdelta = tempd[0] + tempd[1]
  1164                 cdeltalen = len(cdelta[0]) + len(cdelta[1])
  1164                 textlen = mdiff.patchedsize(textlen, delta)
  1165                 textlen = mdiff.patchedsize(textlen, delta)
  1165 
  1166 
  1166             if chain != prev or (end - start + len(cdelta)) > textlen * 2:
  1167             if chain != prev or (end - start + cdeltalen) > textlen * 2:
  1167                 # flush our writes here so we can read it in revision
  1168                 # flush our writes here so we can read it in revision
  1168                 if dfh:
  1169                 if dfh:
  1169                     dfh.flush()
  1170                     dfh.flush()
  1170                 ifh.flush()
  1171                 ifh.flush()
  1171                 text = self.revision(chain)
  1172                 text = self.revision(chain)
  1172                 text = mdiff.patches(text, [delta])
  1173                 if len(text) == 0:
       
  1174                     # skip over trivial delta header
       
  1175                     text = buffer(delta, 12)
       
  1176                 else:
       
  1177                     text = mdiff.patches(text, [delta])
       
  1178                 del delta
  1173                 chk = self._addrevision(text, transaction, link, p1, p2, None,
  1179                 chk = self._addrevision(text, transaction, link, p1, p2, None,
  1174                                         ifh, dfh)
  1180                                         ifh, dfh)
  1175                 if not dfh and not self._inline:
  1181                 if not dfh and not self._inline:
  1176                     # addrevision switched from inline to conventional
  1182                     # addrevision switched from inline to conventional
  1177                     # reopen the index
  1183                     # reopen the index
  1179                     ifh = self.opener(self.indexfile, "a")
  1185                     ifh = self.opener(self.indexfile, "a")
  1180                 if chk != node:
  1186                 if chk != node:
  1181                     raise RevlogError(_("consistency error adding group"))
  1187                     raise RevlogError(_("consistency error adding group"))
  1182                 textlen = len(text)
  1188                 textlen = len(text)
  1183             else:
  1189             else:
  1184                 e = (offset_type(end, 0), len(cdelta), textlen, base,
  1190                 e = (offset_type(end, 0), cdeltalen, textlen, base,
  1185                      link, self.rev(p1), self.rev(p2), node)
  1191                      link, self.rev(p1), self.rev(p2), node)
  1186                 self.index.insert(-1, e)
  1192                 self.index.insert(-1, e)
  1187                 self.nodemap[node] = r
  1193                 self.nodemap[node] = r
  1188                 entry = self._io.packentry(e, self.node, self.version, r)
  1194                 entry = self._io.packentry(e, self.node, self.version, r)
  1189                 if self._inline:
  1195                 if self._inline:
  1190                     ifh.write(entry)
  1196                     ifh.write(entry)
  1191                     ifh.write(cdelta)
  1197                     ifh.write(cdelta[0])
       
  1198                     ifh.write(cdelta[1])
  1192                     self.checkinlinesize(transaction, ifh)
  1199                     self.checkinlinesize(transaction, ifh)
  1193                     if not self._inline:
  1200                     if not self._inline:
  1194                         dfh = self.opener(self.datafile, "a")
  1201                         dfh = self.opener(self.datafile, "a")
  1195                         ifh = self.opener(self.indexfile, "a")
  1202                         ifh = self.opener(self.indexfile, "a")
  1196                 else:
  1203                 else:
  1197                     dfh.write(cdelta)
  1204                     dfh.write(cdelta[0])
       
  1205                     dfh.write(cdelta[1])
  1198                     ifh.write(entry)
  1206                     ifh.write(entry)
  1199 
  1207 
  1200             t, r, chain, prev = r, r + 1, node, node
  1208             t, r, chain, prev = r, r + 1, node, node
  1201             base = self.base(t)
  1209             base = self.base(t)
  1202             start = self.start(base)
  1210             start = self.start(base)