Mercurial > hg
diff mercurial/upgrade_utils/auto_upgrade.py @ 49195:411d591e0a27
auto-upgrade: introduce a way to auto-upgrade to/from dirstate-v2
This is similar to what we introduced for `share-safe`, but apply to the
tracked-hint feature.
Differential Revision: https://phab.mercurial-scm.org/D12614
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 22 Mar 2022 14:14:52 +0100 |
parents | e4b31016e194 |
children | 71774d799de7 |
line wrap: on
line diff
--- a/mercurial/upgrade_utils/auto_upgrade.py Tue Apr 05 05:20:05 2022 +0200 +++ b/mercurial/upgrade_utils/auto_upgrade.py Tue Mar 22 14:14:52 2022 +0100 @@ -136,7 +136,64 @@ return action +def get_dirstate_v2_action(repo): + """return an automatic-upgrade action for `dirstate-v2` if applicable + + If no action is needed, return None, otherwise return a callback to upgrade + or downgrade the repository according the configuration and repository + format. + """ + ui = repo.ui + requirements = set(repo.requirements) + auto_upgrade_tracked_hint = ui.configbool( + b'format', + b'use-dirstate-v2.automatic-upgrade-of-mismatching-repositories', + ) + + action = None + + if auto_upgrade_tracked_hint: + d2_config = ui.configbool(b'format', b'use-dirstate-v2') + d2_local = requirementsmod.DIRSTATE_V2_REQUIREMENT in requirements + if d2_config and not d2_local: + msg = _( + b"automatically upgrading repository to the `dirstate-v2`" + b" feature\n" + ) + hint = ( + b"(see `hg help config.format.use-dirstate-v2` for details)\n" + ) + + def action(): + if not ui.quiet: + ui.write_err(msg) + ui.write_err(hint) + requirements.add(requirementsmod.DIRSTATE_V2_REQUIREMENT) + fake_op = AutoUpgradeOperation(requirements) + engine.upgrade_dirstate(repo.ui, repo, fake_op, b'v1', b'v2') + + elif d2_local and not d2_config: + msg = _( + b"automatically downgrading repository from the `dirstate-v2`" + b" feature\n" + ) + hint = ( + b"(see `hg help config.format.use-dirstate-v2` for details)\n" + ) + + def action(): + if not ui.quiet: + ui.write_err(msg) + ui.write_err(hint) + requirements.discard(requirementsmod.DIRSTATE_V2_REQUIREMENT) + fake_op = AutoUpgradeOperation(requirements) + engine.upgrade_dirstate(repo.ui, repo, fake_op, b'v2', b'v1') + + return action + + AUTO_UPGRADE_ACTIONS = [ + get_dirstate_v2_action, get_share_safe_action, get_tracked_hint_action, ]