equal
deleted
inserted
replaced
343 def addgroup(self, data, linkmapper, transaction): |
343 def addgroup(self, data, linkmapper, transaction): |
344 # given a set of deltas, add them to the revision log. the |
344 # given a set of deltas, add them to the revision log. the |
345 # first delta is against its parent, which should be in our |
345 # first delta is against its parent, which should be in our |
346 # log, the rest are against the previous delta. |
346 # log, the rest are against the previous delta. |
347 |
347 |
348 if len(data) <= 4: return |
348 if not data: return self.tip() |
349 |
349 |
350 # retrieve the parent revision of the delta chain |
350 # retrieve the parent revision of the delta chain |
351 chain = data[28:48] |
351 chain = data[24:44] |
352 text = self.revision(chain) |
|
353 |
352 |
354 # track the base of the current delta log |
353 # track the base of the current delta log |
355 r = self.count() |
354 r = self.count() |
356 t = r - 1 |
355 t = r - 1 |
357 |
356 |
368 transaction.add(self.indexfile, r * struct.calcsize(indexformat)) |
367 transaction.add(self.indexfile, r * struct.calcsize(indexformat)) |
369 dfh = self.opener(self.datafile, "a") |
368 dfh = self.opener(self.datafile, "a") |
370 ifh = self.opener(self.indexfile, "a") |
369 ifh = self.opener(self.indexfile, "a") |
371 |
370 |
372 # loop through our set of deltas |
371 # loop through our set of deltas |
373 pos = 4 |
372 pos = 0 |
374 while pos < len(data): |
373 while pos < len(data): |
375 l, node, p1, p2, cs = struct.unpack(">l20s20s20s20s", |
374 l, node, p1, p2, cs = struct.unpack(">l20s20s20s20s", |
376 data[pos:pos+84]) |
375 data[pos:pos+84]) |
377 link = linkmapper(cs) |
376 link = linkmapper(cs) |
378 delta = data[pos + 84:pos + l] |
377 delta = data[pos + 84:pos + l] |
389 |
388 |
390 if chain != prev or (end - start + len(cdelta)) > measure * 2: |
389 if chain != prev or (end - start + len(cdelta)) > measure * 2: |
391 # flush our writes here so we can read it in revision |
390 # flush our writes here so we can read it in revision |
392 dfh.flush() |
391 dfh.flush() |
393 ifh.flush() |
392 ifh.flush() |
394 text = self.revision(self.node(t)) |
393 text = self.revision(chain) |
395 text = self.patch(text, delta) |
394 text = self.patch(text, delta) |
396 chk = self.addrevision(text, transaction, link, p1, p2) |
395 chk = self.addrevision(text, transaction, link, p1, p2) |
397 if chk != node: |
396 if chk != node: |
398 raise "consistency error adding group" |
397 raise "consistency error adding group" |
399 measure = len(text) |
398 measure = len(text) |
402 self.index.append(e) |
401 self.index.append(e) |
403 self.nodemap[node] = r |
402 self.nodemap[node] = r |
404 dfh.write(cdelta) |
403 dfh.write(cdelta) |
405 ifh.write(struct.pack(indexformat, *e)) |
404 ifh.write(struct.pack(indexformat, *e)) |
406 |
405 |
407 t, r = r, r + 1 |
406 t, r, chain, prev = r, r + 1, node, node |
408 chain = prev |
|
409 start = self.start(self.base(t)) |
407 start = self.start(self.base(t)) |
410 end = self.end(t) |
408 end = self.end(t) |
411 |
409 |
412 dfh.close() |
410 dfh.close() |
413 ifh.close() |
411 ifh.close() |