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.