Skip to content
Snippets Groups Projects
Commit 1a9bdd0e authored by Pierre-Yves David's avatar Pierre-Yves David :octopus:
Browse files

branchcache: write branchmap in subset inheritance order

This way, we can guarantee a valid subset has been written before touching the
branchmap of another filter.

This is especially useful as we are bout to start deleting outdated branchmap
file.
parent 0ddc3433
No related branches found
No related tags found
2 merge requests!870Merge default into stable,!802small fixes around branchcache
......@@ -166,7 +166,10 @@
def write_delayed(self, repo):
unfi = repo.unfiltered()
for filtername, cache in self._per_filter.items():
for filtername in repoviewutil.get_ordered_subset():
cache = self._per_filter.get(filtername)
if cache is None:
continue
if cache._delayed:
if filtername is None:
repo = unfi
......
......@@ -6,6 +6,7 @@
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from .. import error
### Nearest subset relation
# Nearest subset of filter X is a filter Y so that:
......@@ -21,3 +22,30 @@
b'served': b'immutable',
b'immutable': b'base',
}
def get_ordered_subset():
"""return a list of subset name from dependencies to dependents"""
_unfinalized = set(subsettable.values())
ordered = []
# the subset table is expected to be small so we do the stupid N² version
# of the algorithm
while _unfinalized:
this_level = []
for candidate in _unfinalized:
dependency = subsettable.get(candidate)
if dependency not in _unfinalized:
this_level.append(candidate)
if not this_level:
msg = "cyclic dependencies in repoview subset %r"
msg %= subsettable
raise error.ProgrammingError(msg)
this_level.sort(key=lambda x: x if x is not None else '')
ordered.extend(this_level)
_unfinalized.difference_update(this_level)
return ordered
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment