Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/upgrade.py @ 42715:0812d9fb63fe
upgrade: introduce the internal code for revlog cloning selection
For now we still clone every single revlogs but all the selection mechanism is
now in place in the lower layer.
The next changesets will introduce the user interface part of the selection.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 01 Aug 2019 03:15:58 +0200 |
parents | 5535a2201ff1 |
children | cf2b765cecd7 |
comparison
equal
deleted
inserted
replaced
42714:5535a2201ff1 | 42715:0812d9fb63fe |
---|---|
560 | 560 |
561 if not (unencodedname.endswith('00changelog.i') | 561 if not (unencodedname.endswith('00changelog.i') |
562 or unencodedname.endswith('00manifest.i')): | 562 or unencodedname.endswith('00manifest.i')): |
563 destrepo.svfs.fncache.add(unencodedname) | 563 destrepo.svfs.fncache.add(unencodedname) |
564 | 564 |
565 def _clonerevlogs(ui, srcrepo, dstrepo, tr, deltareuse, forcedeltabothparents): | 565 UPGRADE_CHANGELOG = object() |
566 UPGRADE_MANIFEST = object() | |
567 UPGRADE_FILELOG = object() | |
568 | |
569 UPGRADE_ALL_REVLOGS = frozenset([UPGRADE_CHANGELOG, | |
570 UPGRADE_MANIFEST, | |
571 UPGRADE_FILELOG]) | |
572 | |
573 def matchrevlog(revlogfilter, entry): | |
574 """check is a revlog is selected for cloning | |
575 | |
576 The store entry is checked against the passed filter""" | |
577 if entry.endswith('00changelog.i'): | |
578 return UPGRADE_CHANGELOG in revlogfilter | |
579 elif entry.endswith('00manifest.i'): | |
580 return UPGRADE_MANIFEST in revlogfilter | |
581 return UPGRADE_FILELOG in revlogfilter | |
582 | |
583 def _clonerevlogs(ui, srcrepo, dstrepo, tr, deltareuse, forcedeltabothparents, | |
584 revlogs=UPGRADE_ALL_REVLOGS): | |
566 """Copy revlogs between 2 repos.""" | 585 """Copy revlogs between 2 repos.""" |
567 revcount = 0 | 586 revcount = 0 |
568 srcsize = 0 | 587 srcsize = 0 |
569 srcrawsize = 0 | 588 srcrawsize = 0 |
570 dstsize = 0 | 589 dstsize = 0 |
641 for unencoded, encoded, size in alldatafiles: | 660 for unencoded, encoded, size in alldatafiles: |
642 if unencoded.endswith('.d'): | 661 if unencoded.endswith('.d'): |
643 continue | 662 continue |
644 | 663 |
645 oldrl = _revlogfrompath(srcrepo, unencoded) | 664 oldrl = _revlogfrompath(srcrepo, unencoded) |
646 newrl = _revlogfrompath(dstrepo, unencoded) | |
647 | 665 |
648 if isinstance(oldrl, changelog.changelog) and 'c' not in seen: | 666 if isinstance(oldrl, changelog.changelog) and 'c' not in seen: |
649 ui.write(_('finished migrating %d manifest revisions across %d ' | 667 ui.write(_('finished migrating %d manifest revisions across %d ' |
650 'manifests; change in size: %s\n') % | 668 'manifests; change in size: %s\n') % |
651 (mrevcount, mcount, util.bytecount(mdstsize - msrcsize))) | 669 (mrevcount, mcount, util.bytecount(mdstsize - msrcsize))) |
680 if progress: | 698 if progress: |
681 progress.complete() | 699 progress.complete() |
682 progress = srcrepo.ui.makeprogress(_('file revisions'), | 700 progress = srcrepo.ui.makeprogress(_('file revisions'), |
683 total=frevcount) | 701 total=frevcount) |
684 | 702 |
685 | 703 if matchrevlog(revlogs, unencoded): |
686 ui.note(_('cloning %d revisions from %s\n') % (len(oldrl), unencoded)) | 704 ui.note(_('cloning %d revisions from %s\n') |
687 oldrl.clone(tr, newrl, addrevisioncb=oncopiedrevision, | 705 % (len(oldrl), unencoded)) |
688 deltareuse=deltareuse, | 706 newrl = _revlogfrompath(dstrepo, unencoded) |
689 forcedeltabothparents=forcedeltabothparents) | 707 oldrl.clone(tr, newrl, addrevisioncb=oncopiedrevision, |
708 deltareuse=deltareuse, | |
709 forcedeltabothparents=forcedeltabothparents) | |
710 else: | |
711 msg = _('blindly copying %s containing %i revisions\n') | |
712 ui.note(msg % (unencoded, len(oldrl))) | |
713 _copyrevlog(tr, dstrepo, oldrl, unencoded) | |
714 | |
715 newrl = _revlogfrompath(dstrepo, unencoded) | |
690 | 716 |
691 info = newrl.storageinfo(storedsize=True) | 717 info = newrl.storageinfo(storedsize=True) |
692 datasize = info['storedsize'] or 0 | 718 datasize = info['storedsize'] or 0 |
693 | 719 |
694 dstsize += datasize | 720 dstsize += datasize |
744 | 770 |
745 This function is called after revlogs and store files have been copied but | 771 This function is called after revlogs and store files have been copied but |
746 before the new store is swapped into the original location. | 772 before the new store is swapped into the original location. |
747 """ | 773 """ |
748 | 774 |
749 def _upgraderepo(ui, srcrepo, dstrepo, requirements, actions): | 775 def _upgraderepo(ui, srcrepo, dstrepo, requirements, actions, |
776 revlogs=UPGRADE_ALL_REVLOGS): | |
750 """Do the low-level work of upgrading a repository. | 777 """Do the low-level work of upgrading a repository. |
751 | 778 |
752 The upgrade is effectively performed as a copy between a source | 779 The upgrade is effectively performed as a copy between a source |
753 repository and a temporary destination repository. | 780 repository and a temporary destination repository. |
754 | 781 |
773 else: | 800 else: |
774 deltareuse = revlog.revlog.DELTAREUSEALWAYS | 801 deltareuse = revlog.revlog.DELTAREUSEALWAYS |
775 | 802 |
776 with dstrepo.transaction('upgrade') as tr: | 803 with dstrepo.transaction('upgrade') as tr: |
777 _clonerevlogs(ui, srcrepo, dstrepo, tr, deltareuse, | 804 _clonerevlogs(ui, srcrepo, dstrepo, tr, deltareuse, |
778 're-delta-multibase' in actions) | 805 're-delta-multibase' in actions, revlogs=revlogs) |
779 | 806 |
780 # Now copy other files in the store directory. | 807 # Now copy other files in the store directory. |
781 # The sorted() makes execution deterministic. | 808 # The sorted() makes execution deterministic. |
782 for p, kind, st in sorted(srcrepo.store.vfs.readdir('', stat=True)): | 809 for p, kind, st in sorted(srcrepo.store.vfs.readdir('', stat=True)): |
783 if not _filterstorefile(srcrepo, dstrepo, requirements, | 810 if not _filterstorefile(srcrepo, dstrepo, requirements, |