Mercurial > hg
view tests/test-upgrade-repo.t @ 30813:2cbbd4622ab0
convert: config option to control Git committer actions
When converting a Git repository to Mercurial at Mozilla, I encountered
a scenario where I didn't want `hg convert` to automatically add the
"committer: <committer>" line to commit messages. While I can hack around
this by rewriting the Git commit before it is fed into `hg convert`,
I figured it would be a useful knob to control.
This patch introduces a config option that allows lots of control
over the committer value. I initially implemented this as a single
boolean flag to control whether to save the committer message. But
then there was feedback that it would be useful to save the committer
in extra data. While this patch doesn't implement support for saving
in extra data, it does add a mechanism for extending which actions
to take on the committer field. We should be able to easily add
actions to save in extra data.
Some of the implemented features weren't asked for. But I figured they
could be useful. If nothing else they demonstrate the extensibility
of this mechanism.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 13 Jan 2017 23:21:10 -0800 |
parents | f2c069bf78ee |
children | 8c9178d647f7 |
line wrap: on
line source
$ cat >> $HGRCPATH << EOF > [extensions] > share = > EOF store and revlogv1 are required in source $ hg --config format.usestore=false init no-store $ hg -R no-store debugupgraderepo abort: cannot upgrade repository; requirement missing: store [255] $ hg init no-revlogv1 $ cat > no-revlogv1/.hg/requires << EOF > dotencode > fncache > generaldelta > store > EOF $ hg -R no-revlogv1 debugupgraderepo abort: cannot upgrade repository; requirement missing: revlogv1 [255] Cannot upgrade shared repositories $ hg init share-parent $ hg -q share share-parent share-child $ hg -R share-child debugupgraderepo abort: cannot upgrade repository; unsupported source requirement: shared [255] Do not yet support upgrading manifestv2 and treemanifest repos $ hg --config experimental.manifestv2=true init manifestv2 $ hg -R manifestv2 debugupgraderepo abort: cannot upgrade repository; unsupported source requirement: manifestv2 [255] $ hg --config experimental.treemanifest=true init treemanifest $ hg -R treemanifest debugupgraderepo abort: cannot upgrade repository; unsupported source requirement: treemanifest [255] Cannot add manifestv2 or treemanifest requirement during upgrade $ hg init disallowaddedreq $ hg -R disallowaddedreq --config experimental.manifestv2=true --config experimental.treemanifest=true debugupgraderepo abort: cannot upgrade repository; do not support adding requirement: manifestv2, treemanifest [255] An upgrade of a repository created with recommended settings only suggests optimizations $ hg init empty $ cd empty $ hg debugupgraderepo (no feature deficiencies found in existing repository) performing an upgrade with "--run" will make the following changes: requirements preserved: dotencode, fncache, generaldelta, revlogv1, store additional optimizations are available by specifying "--optimize <name>": redeltaparent deltas within internal storage will be recalculated to choose an optimal base revision where this was not already done; the size of the repository may shrink and various operations may become faster; the first time this optimization is performed could slow down upgrade execution considerably; subsequent invocations should not run noticeably slower redeltamultibase deltas within internal storage will be recalculated against multiple base revision and the smallest difference will be used; the size of the repository may shrink significantly when there are many merges; this optimization will slow down execution in proportion to the number of merges in the repository and the amount of files in the repository; this slow down should not be significant unless there are tens of thousands of files and thousands of merges redeltaall deltas within internal storage will always be recalculated without reusing prior deltas; this will likely make execution run several times slower; this optimization is typically not needed --optimize can be used to add optimizations $ hg debugupgrade --optimize redeltaparent (no feature deficiencies found in existing repository) performing an upgrade with "--run" will make the following changes: requirements preserved: dotencode, fncache, generaldelta, revlogv1, store redeltaparent deltas within internal storage will choose a new base revision if needed additional optimizations are available by specifying "--optimize <name>": redeltamultibase deltas within internal storage will be recalculated against multiple base revision and the smallest difference will be used; the size of the repository may shrink significantly when there are many merges; this optimization will slow down execution in proportion to the number of merges in the repository and the amount of files in the repository; this slow down should not be significant unless there are tens of thousands of files and thousands of merges redeltaall deltas within internal storage will always be recalculated without reusing prior deltas; this will likely make execution run several times slower; this optimization is typically not needed Various sub-optimal detections work $ cat > .hg/requires << EOF > revlogv1 > store > EOF $ hg debugupgraderepo repository lacks features recommended by current config options: fncache long and reserved filenames may not work correctly; repository performance is sub-optimal dotencode storage of filenames beginning with a period or space may not work correctly generaldelta deltas within internal storage are unable to choose optimal revisions; repository is larger and slower than it could be; interaction with other repositories may require extra network and CPU resources, making "hg push" and "hg pull" slower performing an upgrade with "--run" will make the following changes: requirements preserved: revlogv1, store added: dotencode, fncache, generaldelta fncache repository will be more resilient to storing certain paths and performance of certain operations should be improved dotencode repository will be better able to store files beginning with a space or period generaldelta repository storage will be able to create optimal deltas; new repository data will be smaller and read times should decrease; interacting with other repositories using this storage model should require less network and CPU resources, making "hg push" and "hg pull" faster additional optimizations are available by specifying "--optimize <name>": redeltaparent deltas within internal storage will be recalculated to choose an optimal base revision where this was not already done; the size of the repository may shrink and various operations may become faster; the first time this optimization is performed could slow down upgrade execution considerably; subsequent invocations should not run noticeably slower redeltamultibase deltas within internal storage will be recalculated against multiple base revision and the smallest difference will be used; the size of the repository may shrink significantly when there are many merges; this optimization will slow down execution in proportion to the number of merges in the repository and the amount of files in the repository; this slow down should not be significant unless there are tens of thousands of files and thousands of merges redeltaall deltas within internal storage will always be recalculated without reusing prior deltas; this will likely make execution run several times slower; this optimization is typically not needed $ hg --config format.dotencode=false debugupgraderepo repository lacks features recommended by current config options: fncache long and reserved filenames may not work correctly; repository performance is sub-optimal generaldelta deltas within internal storage are unable to choose optimal revisions; repository is larger and slower than it could be; interaction with other repositories may require extra network and CPU resources, making "hg push" and "hg pull" slower repository lacks features used by the default config options: dotencode storage of filenames beginning with a period or space may not work correctly performing an upgrade with "--run" will make the following changes: requirements preserved: revlogv1, store added: fncache, generaldelta fncache repository will be more resilient to storing certain paths and performance of certain operations should be improved generaldelta repository storage will be able to create optimal deltas; new repository data will be smaller and read times should decrease; interacting with other repositories using this storage model should require less network and CPU resources, making "hg push" and "hg pull" faster additional optimizations are available by specifying "--optimize <name>": redeltaparent deltas within internal storage will be recalculated to choose an optimal base revision where this was not already done; the size of the repository may shrink and various operations may become faster; the first time this optimization is performed could slow down upgrade execution considerably; subsequent invocations should not run noticeably slower redeltamultibase deltas within internal storage will be recalculated against multiple base revision and the smallest difference will be used; the size of the repository may shrink significantly when there are many merges; this optimization will slow down execution in proportion to the number of merges in the repository and the amount of files in the repository; this slow down should not be significant unless there are tens of thousands of files and thousands of merges redeltaall deltas within internal storage will always be recalculated without reusing prior deltas; this will likely make execution run several times slower; this optimization is typically not needed $ cd .. Upgrading a repository that is already modern essentially no-ops $ hg init modern $ hg -R modern debugupgraderepo --run upgrade will perform the following actions: requirements preserved: dotencode, fncache, generaldelta, revlogv1, store beginning upgrade... repository locked and read-only creating temporary repository to stage migrated data: $TESTTMP/modern/.hg/upgrade.* (glob) (it is safe to interrupt this process any time before data migration completes) data fully migrated to temporary repository marking source repository as being upgraded; clients will be unable to read from repository starting in-place swap of repository data replaced files will be backed up at $TESTTMP/modern/.hg/upgradebackup.* (glob) replacing store... store replacement complete; repository was inconsistent for *s (glob) finalizing requirements file and making repository readable again removing temporary repository $TESTTMP/modern/.hg/upgrade.* (glob) copy of old repository backed up at $TESTTMP/modern/.hg/upgradebackup.* (glob) the old repository will not be deleted; remove it to free up disk space once the upgraded repository is verified Upgrading a repository to generaldelta works $ hg --config format.usegeneraldelta=false init upgradegd $ cd upgradegd $ touch f0 $ hg -q commit -A -m initial $ touch f1 $ hg -q commit -A -m 'add f1' $ hg -q up -r 0 $ touch f2 $ hg -q commit -A -m 'add f2' $ hg debugupgraderepo --run upgrade will perform the following actions: requirements preserved: dotencode, fncache, revlogv1, store added: generaldelta generaldelta repository storage will be able to create optimal deltas; new repository data will be smaller and read times should decrease; interacting with other repositories using this storage model should require less network and CPU resources, making "hg push" and "hg pull" faster beginning upgrade... repository locked and read-only creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob) (it is safe to interrupt this process any time before data migration completes) migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog) migrating 341 bytes in store; 401 bytes tracked data migrating 3 filelogs containing 3 revisions (0 bytes in store; 0 bytes tracked data) finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes migrating 1 manifests containing 3 revisions (157 bytes in store; 220 bytes tracked data) finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes migrating changelog containing 3 revisions (184 bytes in store; 181 bytes tracked data) finished migrating 3 changelog revisions; change in size: 0 bytes finished migrating 9 total revisions; total change in store size: 0 bytes copying phaseroots data fully migrated to temporary repository marking source repository as being upgraded; clients will be unable to read from repository starting in-place swap of repository data replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob) replacing store... store replacement complete; repository was inconsistent for *s (glob) finalizing requirements file and making repository readable again removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob) copy of old repository backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob) the old repository will not be deleted; remove it to free up disk space once the upgraded repository is verified Original requirements backed up $ cat .hg/upgradebackup.*/requires dotencode fncache revlogv1 store generaldelta added to original requirements files $ cat .hg/requires dotencode fncache generaldelta revlogv1 store store directory has files we expect $ ls .hg/store 00changelog.i 00manifest.i data fncache phaseroots undo undo.backupfiles undo.phaseroots manifest should be generaldelta $ hg debugrevlog -m | grep flags flags : inline, generaldelta verify should be happy $ hg verify checking changesets checking manifests crosschecking files in changesets and manifests checking files 3 files, 3 changesets, 3 total revisions old store should be backed up $ ls .hg/upgradebackup.*/store 00changelog.i 00manifest.i data fncache phaseroots undo undo.backup.fncache undo.backupfiles undo.phaseroots $ cd ..