--- 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()