2335 DELTAREUSEFULLADD = 'fulladd' |
2335 DELTAREUSEFULLADD = 'fulladd' |
2336 |
2336 |
2337 DELTAREUSEALL = {'always', 'samerevs', 'never', 'fulladd'} |
2337 DELTAREUSEALL = {'always', 'samerevs', 'never', 'fulladd'} |
2338 |
2338 |
2339 def clone(self, tr, destrevlog, addrevisioncb=None, |
2339 def clone(self, tr, destrevlog, addrevisioncb=None, |
2340 deltareuse=DELTAREUSESAMEREVS, forcedeltabothparents=None): |
2340 deltareuse=DELTAREUSESAMEREVS, forcedeltabothparents=None): |
2341 """Copy this revlog to another, possibly with format changes. |
2341 """Copy this revlog to another, possibly with format changes. |
2342 |
2342 |
2343 The destination revlog will contain the same revisions and nodes. |
2343 The destination revlog will contain the same revisions and nodes. |
2344 However, it may not be bit-for-bit identical due to e.g. delta encoding |
2344 However, it may not be bit-for-bit identical due to e.g. delta encoding |
2345 differences. |
2345 differences. |
2403 destrevlog._lazydeltabase = False |
2403 destrevlog._lazydeltabase = False |
2404 destrevlog._lazydelta = False |
2404 destrevlog._lazydelta = False |
2405 |
2405 |
2406 destrevlog._deltabothparents = forcedeltabothparents or oldamd |
2406 destrevlog._deltabothparents = forcedeltabothparents or oldamd |
2407 |
2407 |
2408 deltacomputer = deltautil.deltacomputer(destrevlog) |
2408 self._clone(tr, destrevlog, addrevisioncb, deltareuse, |
2409 index = self.index |
2409 forcedeltabothparents) |
2410 for rev in self: |
2410 |
2411 entry = index[rev] |
|
2412 |
|
2413 # Some classes override linkrev to take filtered revs into |
|
2414 # account. Use raw entry from index. |
|
2415 flags = entry[0] & 0xffff |
|
2416 linkrev = entry[4] |
|
2417 p1 = index[entry[5]][7] |
|
2418 p2 = index[entry[6]][7] |
|
2419 node = entry[7] |
|
2420 |
|
2421 # (Possibly) reuse the delta from the revlog if allowed and |
|
2422 # the revlog chunk is a delta. |
|
2423 cachedelta = None |
|
2424 rawtext = None |
|
2425 if (deltareuse != self.DELTAREUSEFULLADD |
|
2426 and destrevlog._lazydelta): |
|
2427 dp = self.deltaparent(rev) |
|
2428 if dp != nullrev: |
|
2429 cachedelta = (dp, bytes(self._chunk(rev))) |
|
2430 |
|
2431 if not cachedelta: |
|
2432 rawtext = self.rawdata(rev) |
|
2433 |
|
2434 |
|
2435 if deltareuse == self.DELTAREUSEFULLADD: |
|
2436 destrevlog.addrevision(rawtext, tr, linkrev, p1, p2, |
|
2437 cachedelta=cachedelta, |
|
2438 node=node, flags=flags, |
|
2439 deltacomputer=deltacomputer) |
|
2440 else: |
|
2441 ifh = destrevlog.opener(destrevlog.indexfile, 'a+', |
|
2442 checkambig=False) |
|
2443 dfh = None |
|
2444 if not destrevlog._inline: |
|
2445 dfh = destrevlog.opener(destrevlog.datafile, 'a+') |
|
2446 try: |
|
2447 destrevlog._addrevision(node, rawtext, tr, linkrev, p1, |
|
2448 p2, flags, cachedelta, ifh, dfh, |
|
2449 deltacomputer=deltacomputer) |
|
2450 finally: |
|
2451 if dfh: |
|
2452 dfh.close() |
|
2453 ifh.close() |
|
2454 |
|
2455 if addrevisioncb: |
|
2456 addrevisioncb(self, rev, node) |
|
2457 finally: |
2411 finally: |
2458 destrevlog._lazydelta = oldlazydelta |
2412 destrevlog._lazydelta = oldlazydelta |
2459 destrevlog._lazydeltabase = oldlazydeltabase |
2413 destrevlog._lazydeltabase = oldlazydeltabase |
2460 destrevlog._deltabothparents = oldamd |
2414 destrevlog._deltabothparents = oldamd |
|
2415 |
|
2416 def _clone(self, tr, destrevlog, addrevisioncb, deltareuse, |
|
2417 forcedeltabothparents): |
|
2418 """perform the core duty of `revlog.clone` after parameter processing""" |
|
2419 deltacomputer = deltautil.deltacomputer(destrevlog) |
|
2420 index = self.index |
|
2421 for rev in self: |
|
2422 entry = index[rev] |
|
2423 |
|
2424 # Some classes override linkrev to take filtered revs into |
|
2425 # account. Use raw entry from index. |
|
2426 flags = entry[0] & 0xffff |
|
2427 linkrev = entry[4] |
|
2428 p1 = index[entry[5]][7] |
|
2429 p2 = index[entry[6]][7] |
|
2430 node = entry[7] |
|
2431 |
|
2432 # (Possibly) reuse the delta from the revlog if allowed and |
|
2433 # the revlog chunk is a delta. |
|
2434 cachedelta = None |
|
2435 rawtext = None |
|
2436 if (deltareuse != self.DELTAREUSEFULLADD and destrevlog._lazydelta): |
|
2437 dp = self.deltaparent(rev) |
|
2438 if dp != nullrev: |
|
2439 cachedelta = (dp, bytes(self._chunk(rev))) |
|
2440 |
|
2441 if not cachedelta: |
|
2442 rawtext = self.rawdata(rev) |
|
2443 |
|
2444 |
|
2445 if deltareuse == self.DELTAREUSEFULLADD: |
|
2446 destrevlog.addrevision(rawtext, tr, linkrev, p1, p2, |
|
2447 cachedelta=cachedelta, |
|
2448 node=node, flags=flags, |
|
2449 deltacomputer=deltacomputer) |
|
2450 else: |
|
2451 ifh = destrevlog.opener(destrevlog.indexfile, 'a+', |
|
2452 checkambig=False) |
|
2453 dfh = None |
|
2454 if not destrevlog._inline: |
|
2455 dfh = destrevlog.opener(destrevlog.datafile, 'a+') |
|
2456 try: |
|
2457 destrevlog._addrevision(node, rawtext, tr, linkrev, p1, |
|
2458 p2, flags, cachedelta, ifh, dfh, |
|
2459 deltacomputer=deltacomputer) |
|
2460 finally: |
|
2461 if dfh: |
|
2462 dfh.close() |
|
2463 ifh.close() |
|
2464 |
|
2465 if addrevisioncb: |
|
2466 addrevisioncb(self, rev, node) |
2461 |
2467 |
2462 def censorrevision(self, tr, censornode, tombstone=b''): |
2468 def censorrevision(self, tr, censornode, tombstone=b''): |
2463 if (self.version & 0xFFFF) == REVLOGV0: |
2469 if (self.version & 0xFFFF) == REVLOGV0: |
2464 raise error.RevlogError(_('cannot censor with version %d revlogs') % |
2470 raise error.RevlogError(_('cannot censor with version %d revlogs') % |
2465 self.version) |
2471 self.version) |