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,