diff -r c7e81615b5c4 -r ec640dc9cebd mercurial/branchmap.py --- a/mercurial/branchmap.py Tue Feb 27 15:33:21 2024 +0100 +++ b/mercurial/branchmap.py Tue Feb 27 14:04:29 2024 +0100 @@ -100,7 +100,7 @@ bcache = self._per_filter.get(filtername) if bcache is None or not bcache.validfor(repo): # cache object missing or cache object stale? Read from disk - bcache = branchcache.fromfile(repo) + bcache = branch_cache_from_file(repo) revs = [] if bcache is None: @@ -116,7 +116,7 @@ revs.extend(r for r in extrarevs if r <= bcache.tiprev) else: # nothing to fall back on, start empty. - bcache = branchcache(repo) + bcache = new_branch_cache(repo) revs.extend(cl.revs(start=bcache.tiprev + 1)) if revs: @@ -147,7 +147,7 @@ if rbheads: rtiprev = max((int(clrev(node)) for node in rbheads)) - cache = branchcache( + cache = new_branch_cache( repo, remotebranchmap, repo[rtiprev].node(), @@ -199,21 +199,6 @@ This cache is used to avoid costly computations to determine all the branch heads of a repo. - - The cache is serialized on disk in the following format: - - [optional filtered repo hex hash] - - - ... - - The first line is used to check if the cache is still valid. If the - branch cache is for a filtered repo view, an optional third hash is - included that hashes the hashes of all filtered and obsolete revisions. - - The open/closed state is represented by a single letter 'o' or 'c'. - This field can be used to avoid changelog reads when determining if a - branch head closes a branch or not. """ def __init__( @@ -420,10 +405,10 @@ STATE_DIRTY = 3 -class branchcache(_BaseBranchCache): - """Branchmap info for a local repo or repoview""" +class _LocalBranchCache(_BaseBranchCache): + """base class of branch-map info for a local repo or repoview""" - _base_filename = b"branch2" + _base_filename = None def __init__( self, @@ -560,6 +545,7 @@ def _filename(cls, repo): """name of a branchcache file for a given repo or repoview""" filename = cls._base_filename + assert filename is not None if repo.filtername: filename = b'%s-%s' % (filename, repo.filtername) return filename @@ -741,6 +727,38 @@ self.write(repo) +def branch_cache_from_file(repo) -> Optional[_LocalBranchCache]: + """Build a branch cache from on-disk data if possible""" + return BranchCacheV2.fromfile(repo) + + +def new_branch_cache(repo, *args, **kwargs): + """Build a new branch cache from argument""" + return BranchCacheV2(repo, *args, **kwargs) + + +class BranchCacheV2(_LocalBranchCache): + """a branch cache using version 2 of the format on disk + + The cache is serialized on disk in the following format: + + [optional filtered repo hex hash] + + + ... + + The first line is used to check if the cache is still valid. If the + branch cache is for a filtered repo view, an optional third hash is + included that hashes the hashes of all filtered and obsolete revisions. + + The open/closed state is represented by a single letter 'o' or 'c'. + This field can be used to avoid changelog reads when determining if a + branch head closes a branch or not. + """ + + _base_filename = b"branch2" + + class remotebranchcache(_BaseBranchCache): """Branchmap info for a remote connection, should not write locally"""