For certain imporvements, we will like to show a message after the operation
completed. This patch introduces that functionality.
Right now it's only used by share-safe feature.
| marmoute | |
| mharbison72 |
| hg-reviewers |
For certain imporvements, we will like to show a message after the operation
completed. This patch introduces that functionality.
Right now it's only used by share-safe feature.
| No Linters Available |
| No Unit Test Coverage |
| Path | Packages | |||
|---|---|---|---|---|
| M | mercurial/upgrade.py (20 lines) | |||
| M | mercurial/upgrade_utils/actions.py (42 lines) |
| Commit | Parents | Author | Summary | Date |
|---|---|---|---|---|
| 31901f48cea6 | 52cf924e702c | Pulkit Goyal | Dec 16 2020, 3:30 AM |
| Status | Author | Revision | |
|---|---|---|---|
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Changes Planned | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit | ||
| Closed | pulkit |
| % b', '.join(sorted(optimize)), | % b', '.join(sorted(optimize)), | ||||
| hint=_(b'run without arguments to see valid optimizations'), | hint=_(b'run without arguments to see valid optimizations'), | ||||
| ) | ) | ||||
| format_upgrades = upgrade_actions.find_format_upgrades(repo) | format_upgrades = upgrade_actions.find_format_upgrades(repo) | ||||
| up_actions = upgrade_actions.determine_upgrade_actions( | up_actions = upgrade_actions.determine_upgrade_actions( | ||||
| repo, format_upgrades, optimizations, repo.requirements, newreqs | repo, format_upgrades, optimizations, repo.requirements, newreqs | ||||
| ) | ) | ||||
| removed_actions = upgrade_actions.find_format_downgrades(repo) | |||||
| removedreqs = repo.requirements - newreqs | removedreqs = repo.requirements - newreqs | ||||
| addedreqs = newreqs - repo.requirements | addedreqs = newreqs - repo.requirements | ||||
| if revlogs != upgrade_engine.UPGRADE_ALL_REVLOGS: | if revlogs != upgrade_engine.UPGRADE_ALL_REVLOGS: | ||||
| incompatible = upgrade_actions.RECLONES_REQUIREMENTS & ( | incompatible = upgrade_actions.RECLONES_REQUIREMENTS & ( | ||||
| removedreqs | addedreqs | removedreqs | addedreqs | ||||
| ) | ) | ||||
| if incompatible: | if incompatible: | ||||
| msg = _( | msg = _( | ||||
| b'ignoring revlogs selection flags, format requirements ' | b'ignoring revlogs selection flags, format requirements ' | ||||
| b'change: %s\n' | b'change: %s\n' | ||||
| ) | ) | ||||
| ui.warn(msg % b', '.join(sorted(incompatible))) | ui.warn(msg % b', '.join(sorted(incompatible))) | ||||
| revlogs = upgrade_engine.UPGRADE_ALL_REVLOGS | revlogs = upgrade_engine.UPGRADE_ALL_REVLOGS | ||||
| upgrade_op = upgrade_actions.UpgradeOperation( | upgrade_op = upgrade_actions.UpgradeOperation( | ||||
| ui, | ui, | ||||
| newreqs, | newreqs, | ||||
| repo.requirements, | repo.requirements, | ||||
| up_actions, | up_actions, | ||||
| removed_actions, | |||||
| revlogs, | revlogs, | ||||
| ) | ) | ||||
| if not run: | if not run: | ||||
| fromconfig = [] | fromconfig = [] | ||||
| onlydefault = [] | onlydefault = [] | ||||
| for d in format_upgrades: | for d in format_upgrades: | ||||
| ui.warn( | ui.warn( | ||||
| _( | _( | ||||
| b'the old repository will not be deleted; remove ' | b'the old repository will not be deleted; remove ' | ||||
| b'it to free up disk space once the upgraded ' | b'it to free up disk space once the upgraded ' | ||||
| b'repository is verified\n' | b'repository is verified\n' | ||||
| ) | ) | ||||
| ) | ) | ||||
| if upgrade_actions.sharesafe.name in addedreqs: | upgrade_op.print_post_op_messages() | ||||
| ui.warn( | |||||
| _( | |||||
| b'repository upgraded to share safe mode, existing' | |||||
| b' shares will still work in old non-safe mode. ' | |||||
| b'Re-share existing shares to use them in safe mode' | |||||
| b' New shares will be created in safe mode.\n' | |||||
| ) | |||||
| ) | |||||
| if upgrade_actions.sharesafe.name in removedreqs: | |||||
| ui.warn( | |||||
| _( | |||||
| b'repository downgraded to not use share safe mode, ' | |||||
| b'existing shares will not work and needs to' | |||||
| b' be reshared.\n' | |||||
| ) | |||||
| ) | |||||
| Message intended for humans explaining the improvement in more detail, | Message intended for humans explaining the improvement in more detail, | ||||
| including the implications of it. For ``FORMAT_UPGRADE`` types, should be | including the implications of it. For ``FORMAT_UPGRADE`` types, should be | ||||
| worded in the present tense. For ``OPTIMISATION`` types, should be | worded in the present tense. For ``OPTIMISATION`` types, should be | ||||
| worded in the future tense. | worded in the future tense. | ||||
| upgrademessage | upgrademessage | ||||
| Message intended for humans explaining what an upgrade addressing this | Message intended for humans explaining what an upgrade addressing this | ||||
| issue will do. Should be worded in the future tense. | issue will do. Should be worded in the future tense. | ||||
| postupgrademessage | |||||
| Message intended for humans which will be shown post and upgrade | |||||
| operationupgrade when the improvement will be added | |||||
| postdowngrademessage | |||||
| Message intended for humans which will be shown post an upgrade | |||||
| operation in which this improvement was removed | |||||
| """ | """ | ||||
| def __init__(self, name, type, description, upgrademessage): | def __init__(self, name, type, description, upgrademessage): | ||||
| self.name = name | self.name = name | ||||
| self.type = type | self.type = type | ||||
| self.description = description | self.description = description | ||||
| self.upgrademessage = upgrademessage | self.upgrademessage = upgrademessage | ||||
| self.postupgrademessage = None | |||||
| self.postdowngrademessage = None | |||||
| def __eq__(self, other): | def __eq__(self, other): | ||||
| if not isinstance(other, improvement): | if not isinstance(other, improvement): | ||||
| # This is what python tell use to do | # This is what python tell use to do | ||||
| return NotImplemented | return NotImplemented | ||||
| return self.name == other.name | return self.name == other.name | ||||
| def __ne__(self, other): | def __ne__(self, other): | ||||
| # message intended for humans explaining what an upgrade addressing this | # message intended for humans explaining what an upgrade addressing this | ||||
| # issue will do. should be worded in the future tense. | # issue will do. should be worded in the future tense. | ||||
| upgrademessage = None | upgrademessage = None | ||||
| # value of current Mercurial default for new repository | # value of current Mercurial default for new repository | ||||
| default = None | default = None | ||||
| # Message intended for humans which will be shown post and upgrade | |||||
| # operationupgrade when the improvement will be added | |||||
| postupgrademessage = None | |||||
| # Message intended for humans which will be shown post an upgrade | |||||
| # operation in which this improvement was removed | |||||
| postdowngrademessage = None | |||||
| def __init__(self): | def __init__(self): | ||||
| raise NotImplementedError() | raise NotImplementedError() | ||||
| @staticmethod | @staticmethod | ||||
| def fromrepo(repo): | def fromrepo(repo): | ||||
| """current value of the variant in the repository""" | """current value of the variant in the repository""" | ||||
| raise NotImplementedError() | raise NotImplementedError() | ||||
| b'extensions are enabled.' | b'extensions are enabled.' | ||||
| ) | ) | ||||
| upgrademessage = _( | upgrademessage = _( | ||||
| b'Upgrades a repository to share-safe format so that future ' | b'Upgrades a repository to share-safe format so that future ' | ||||
| b'shares of this repository share its requirements and configs.' | b'shares of this repository share its requirements and configs.' | ||||
| ) | ) | ||||
| postdowngrademessage = _( | |||||
| b'repository downgraded to not use share safe mode, ' | |||||
| b'existing shares will not work and needs to' | |||||
| b' be reshared.' | |||||
| ) | |||||
| postupgrademessage = _( | |||||
| b'repository upgraded to share safe mode, existing' | |||||
| b' shares will still work in old non-safe mode. ' | |||||
| b'Re-share existing shares to use them in safe mode' | |||||
| b' New shares will be created in safe mode.' | |||||
| ) | |||||
| @registerformatvariant | @registerformatvariant | ||||
| class sparserevlog(requirementformatvariant): | class sparserevlog(requirementformatvariant): | ||||
| name = b'sparserevlog' | name = b'sparserevlog' | ||||
| _requirement = requirements.SPARSEREVLOG_REQUIREMENT | _requirement = requirements.SPARSEREVLOG_REQUIREMENT | ||||
| default = True | default = True | ||||
| """represent the work to be done during an upgrade""" | """represent the work to be done during an upgrade""" | ||||
| def __init__( | def __init__( | ||||
| self, | self, | ||||
| ui, | ui, | ||||
| new_requirements, | new_requirements, | ||||
| current_requirements, | current_requirements, | ||||
| upgrade_actions, | upgrade_actions, | ||||
| removed_actions, | |||||
| revlogs_to_process, | revlogs_to_process, | ||||
| ): | ): | ||||
| self.ui = ui | self.ui = ui | ||||
| self.new_requirements = new_requirements | self.new_requirements = new_requirements | ||||
| self.current_requirements = current_requirements | self.current_requirements = current_requirements | ||||
| # list of upgrae actions the operation will perform | # list of upgrae actions the operation will perform | ||||
| self.upgrade_actions = upgrade_actions | self.upgrade_actions = upgrade_actions | ||||
| self._upgrade_actions_names = set([a.name for a in upgrade_actions]) | self._upgrade_actions_names = set([a.name for a in upgrade_actions]) | ||||
| self.removed_actions = removed_actions | |||||
| self.revlogs_to_process = revlogs_to_process | self.revlogs_to_process = revlogs_to_process | ||||
| # requirements which will be added by the operation | # requirements which will be added by the operation | ||||
| self.added_requirements = ( | self.added_requirements = ( | ||||
| self.new_requirements - self.current_requirements | self.new_requirements - self.current_requirements | ||||
| ) | ) | ||||
| # requirements which will be removed by the operation | # requirements which will be removed by the operation | ||||
| self.removed_requirements = ( | self.removed_requirements = ( | ||||
| self.current_requirements - self.new_requirements | self.current_requirements - self.new_requirements | ||||
| def print_unused_optimizations(self): | def print_unused_optimizations(self): | ||||
| for i in self.unused_optimizations: | for i in self.unused_optimizations: | ||||
| self.ui.status(_(b'%s\n %s\n\n') % (i.name, i.description)) | self.ui.status(_(b'%s\n %s\n\n') % (i.name, i.description)) | ||||
| def has_upgrade_action(self, name): | def has_upgrade_action(self, name): | ||||
| """ Check whether the upgrade operation will perform this action """ | """ Check whether the upgrade operation will perform this action """ | ||||
| return name in self._upgrade_actions_names | return name in self._upgrade_actions_names | ||||
| def print_post_op_messages(self): | |||||
| """ print post upgrade operation warning messages """ | |||||
| for a in self.upgrade_actions: | |||||
| if a.postupgrademessage is not None: | |||||
| self.ui.warn(b'%s\n' % a.postupgrademessage) | |||||
| for a in self.removed_actions: | |||||
| if a.postdowngrademessage is not None: | |||||
| self.ui.warn(b'%s\n' % a.postdowngrademessage) | |||||
| ### Code checking if a repository can got through the upgrade process at all. # | ### Code checking if a repository can got through the upgrade process at all. # | ||||
| def requiredsourcerequirements(repo): | def requiredsourcerequirements(repo): | ||||
| """Obtain requirements required to be present to upgrade a repo. | """Obtain requirements required to be present to upgrade a repo. | ||||
| An upgrade will not be allowed if the repository doesn't have the | An upgrade will not be allowed if the repository doesn't have the | ||||