filteredhash: split the computation of revision sets
authorPierre-Yves David <pierre-yves.david@octobus.net>
Wed, 06 Mar 2024 01:43:51 +0100
changeset 51525 530b4cffd6a6
parent 51524 4bfae99c4021
child 51526 a03fa40afd01
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.
mercurial/scmutil.py
--- 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()