Mercurial > hg
comparison mercurial/localrepo.py @ 48684:568f63b5a30f
dirstate: introduce a "tracked-key" feature
A new format variant is introduced. When used, a `tracked-key` file will be
generated. That file will be update when the set of tracked file might have
changed. This will be useful for external automation (e.g. build tool) to be
notified when the set of relevant files changes.
One of the motivation for this changes is to mitigate effect dirstate-v2 has on
such automation. Since the dirstate file is updated much more frequently on
dirstate-v2, monitoring update to that file is no longer a viable strategy.
See the associated documentation for details about the feature
To prevent older client to update the repository without updating that file, a
new requirements is introduced.
The `postfinalizegenerators` business is a bit weird, so I'll likely clean that
up soon.
Differential Revision: https://phab.mercurial-scm.org/D12124
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 31 Jan 2022 08:44:48 +0100 |
parents | e845537f6adb |
children | 79a967128055 |
comparison
equal
deleted
inserted
replaced
48683:111f5a0cbcaa | 48684:568f63b5a30f |
---|---|
1276 | 1276 |
1277 _basesupported = { | 1277 _basesupported = { |
1278 requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT, | 1278 requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT, |
1279 requirementsmod.CHANGELOGV2_REQUIREMENT, | 1279 requirementsmod.CHANGELOGV2_REQUIREMENT, |
1280 requirementsmod.COPIESSDC_REQUIREMENT, | 1280 requirementsmod.COPIESSDC_REQUIREMENT, |
1281 requirementsmod.DIRSTATE_TRACKED_KEY_V1, | |
1281 requirementsmod.DIRSTATE_V2_REQUIREMENT, | 1282 requirementsmod.DIRSTATE_V2_REQUIREMENT, |
1282 requirementsmod.DOTENCODE_REQUIREMENT, | 1283 requirementsmod.DOTENCODE_REQUIREMENT, |
1283 requirementsmod.FNCACHE_REQUIREMENT, | 1284 requirementsmod.FNCACHE_REQUIREMENT, |
1284 requirementsmod.GENERALDELTA_REQUIREMENT, | 1285 requirementsmod.GENERALDELTA_REQUIREMENT, |
1285 requirementsmod.INTERNAL_PHASE_REQUIREMENT, | 1286 requirementsmod.INTERNAL_PHASE_REQUIREMENT, |
1740 | 1741 |
1741 def _makedirstate(self): | 1742 def _makedirstate(self): |
1742 """Extension point for wrapping the dirstate per-repo.""" | 1743 """Extension point for wrapping the dirstate per-repo.""" |
1743 sparsematchfn = lambda: sparse.matcher(self) | 1744 sparsematchfn = lambda: sparse.matcher(self) |
1744 v2_req = requirementsmod.DIRSTATE_V2_REQUIREMENT | 1745 v2_req = requirementsmod.DIRSTATE_V2_REQUIREMENT |
1746 tk = requirementsmod.DIRSTATE_TRACKED_KEY_V1 | |
1745 use_dirstate_v2 = v2_req in self.requirements | 1747 use_dirstate_v2 = v2_req in self.requirements |
1748 use_tracked_key = tk in self.requirements | |
1746 | 1749 |
1747 return dirstate.dirstate( | 1750 return dirstate.dirstate( |
1748 self.vfs, | 1751 self.vfs, |
1749 self.ui, | 1752 self.ui, |
1750 self.root, | 1753 self.root, |
1751 self._dirstatevalidate, | 1754 self._dirstatevalidate, |
1752 sparsematchfn, | 1755 sparsematchfn, |
1753 self.nodeconstants, | 1756 self.nodeconstants, |
1754 use_dirstate_v2, | 1757 use_dirstate_v2, |
1758 use_tracked_key=use_tracked_key, | |
1755 ) | 1759 ) |
1756 | 1760 |
1757 def _dirstatevalidate(self, node): | 1761 def _dirstatevalidate(self, node): |
1758 try: | 1762 try: |
1759 self.changelog.rev(node) | 1763 self.changelog.rev(node) |
3689 if createopts.get(b'sharedrelative'): | 3693 if createopts.get(b'sharedrelative'): |
3690 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT) | 3694 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT) |
3691 else: | 3695 else: |
3692 requirements.add(requirementsmod.SHARED_REQUIREMENT) | 3696 requirements.add(requirementsmod.SHARED_REQUIREMENT) |
3693 | 3697 |
3698 tracked_key = ui.configint(b'format', b'exp-dirstate-tracked-key-version') | |
3699 if tracked_key: | |
3700 if tracked_key != 1: | |
3701 msg = _("ignoring unknown tracked key version: %d\n") | |
3702 hint = _( | |
3703 "see `hg help config.format.exp-dirstate-tracked-key-version" | |
3704 ) | |
3705 ui.warn(msg % tracked_key, hint=hint) | |
3706 else: | |
3707 requirements.add(requirementsmod.DIRSTATE_TRACKED_KEY_V1) | |
3708 | |
3694 return requirements | 3709 return requirements |
3695 | 3710 |
3696 | 3711 |
3697 def checkrequirementscompat(ui, requirements): | 3712 def checkrequirementscompat(ui, requirements): |
3698 """Checks compatibility of repository requirements enabled and disabled. | 3713 """Checks compatibility of repository requirements enabled and disabled. |