mercurial/branchmap.py
changeset 51529 4141d12de073
parent 51527 fa9e3976a5a0
child 51531 f85f23f1479b
--- a/mercurial/branchmap.py	Wed Mar 06 12:07:31 2024 +0100
+++ b/mercurial/branchmap.py	Wed Mar 06 11:39:44 2024 +0100
@@ -813,14 +813,16 @@
 
     - tip-rev: the rev-num of the tip-most revision seen by this cache
     - tip-node: the node-id of the tip-most revision sen by this cache
-    - filtered-hash: the hash of all filtered and obsolete revisions (before
+    - filtered-hash: the hash of all filtered revisions (before tip-rev)
+                     ignored by this cache.
+    - obsolete-hash: the hash of all non-filtered obsolete revisions (before
                      tip-rev) ignored by this cache.
 
     The tip-rev is used to know how far behind the value in the file are
     compared to the current repository state.
 
-    The tip-node and filtered-hash are used to detect if this cache can be used
-    for this repository state at all.
+    The tip-node, filtered-hash and obsolete-hash are used to detect if this
+    cache can be used for this repository state at all.
 
     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
@@ -828,6 +830,7 @@
     """
 
     _base_filename = b"branch3"
+    _default_key_hashes = (None, None)
 
     def _write_header(self, fp) -> None:
         cache_keys = {
@@ -835,7 +838,10 @@
             b"tip-rev": b'%d' % self.tiprev,
         }
         if self.key_hashes:
-            cache_keys[b"filtered-hash"] = hex(self.key_hashes[0])
+            if self.key_hashes[0] is not None:
+                cache_keys[b"filtered-hash"] = hex(self.key_hashes[0])
+            if self.key_hashes[1] is not None:
+                cache_keys[b"obsolete-hash"] = hex(self.key_hashes[1])
         pieces = (b"%s=%s" % i for i in sorted(cache_keys.items()))
         fp.write(b" ".join(pieces) + b'\n')
 
@@ -846,29 +852,29 @@
         cache_keys = dict(p.split(b'=', 1) for p in pieces)
 
         args = {}
+        filtered_hash = None
+        obsolete_hash = None
         for k, v in cache_keys.items():
             if k == b"tip-rev":
                 args["tiprev"] = int(v)
             elif k == b"tip-node":
                 args["tipnode"] = bin(v)
             elif k == b"filtered-hash":
-                args["key_hashes"] = (bin(v),)
+                filtered_hash = bin(v)
+            elif k == b"obsolete-hash":
+                obsolete_hash = bin(v)
             else:
                 msg = b"unknown cache key: %r" % k
                 raise ValueError(msg)
+        args["key_hashes"] = (filtered_hash, obsolete_hash)
         return args
 
     def _compute_key_hashes(self, repo) -> Tuple[bytes]:
         """return the cache key hashes that match this repoview state"""
-        filtered_hash = scmutil.combined_filtered_and_obsolete_hash(
+        return scmutil.filtered_and_obsolete_hash(
             repo,
             self.tiprev,
-            needobsolete=True,
         )
-        if filtered_hash is None:
-            return cast(Tuple[bytes], ())
-        else:
-            return (filtered_hash,)
 
 
 class remotebranchcache(_BaseBranchCache):