filteredhash: split the computation of revision sets
The branch2's filteredhash combines the filtered revisions and the obsolete
ones, this will creates issue for implicit reference to heads we want to
introduce for the v3 of the branch cache format. So we isolate this logic for
alternative use.
--- a/mercurial/scmutil.py Tue Mar 05 15:21:18 2024 +0100
+++ b/mercurial/scmutil.py Wed Mar 06 01:43:51 2024 +0100
@@ -375,13 +375,30 @@
result = cl._filteredrevs_hashcache.get(key)
if not result:
- revs = sorted(r for r in cl.filteredrevs | obsrevs if r <= maxrev)
+ revs, obs_revs = _filtered_and_obs_revs(repo, maxrev)
+ if needobsolete:
+ revs = revs | obs_revs
+ revs = sorted(revs)
if revs:
result = _hash_revs(revs)
cl._filteredrevs_hashcache[key] = result
return result
+def _filtered_and_obs_revs(repo, max_rev):
+ """return the set of filtered and non-filtered obsolete revision"""
+ cl = repo.changelog
+ obs_set = obsolete.getrevs(repo, b'obsolete')
+ filtered_set = cl.filteredrevs
+ if cl.filteredrevs:
+ obs_set = obs_set - cl.filteredrevs
+ if max_rev < (len(cl) - 1):
+ # there might be revision to filter out
+ filtered_set = set(r for r in filtered_set if r <= max_rev)
+ obs_set = set(r for r in obs_set if r <= max_rev)
+ return (filtered_set, obs_set)
+
+
def _hash_revs(revs):
"""return a hash from a list of revision numbers"""
s = hashutil.sha1()