mercurial/branchmap.py
changeset 51521 0d4a6ab3c8da
parent 51520 fe8347b984f3
child 51523 ef369d16965d
equal deleted inserted replaced
51520:fe8347b984f3 51521:0d4a6ab3c8da
   776 
   776 
   777     This version is still EXPERIMENTAL and the format is subject to changes.
   777     This version is still EXPERIMENTAL and the format is subject to changes.
   778 
   778 
   779     The cache is serialized on disk in the following format:
   779     The cache is serialized on disk in the following format:
   780 
   780 
   781     <tip hex node> <tip rev number> [optional filtered repo hex hash]
   781     <cache-key-xxx>=<xxx-value> <cache-key-yyy>=<yyy-value> […]
   782     <branch head hex node> <open/closed state> <branch name>
   782     <branch head hex node> <open/closed state> <branch name>
   783     <branch head hex node> <open/closed state> <branch name>
   783     <branch head hex node> <open/closed state> <branch name>
   784     ...
   784     ...
   785 
   785 
   786     The first line is used to check if the cache is still valid. If the
   786     The first line is used to check if the cache is still valid. It is a series
   787     branch cache is for a filtered repo view, an optional third hash is
   787     of key value pair. The following key are recognized:
   788     included that hashes the hashes of all filtered and obsolete revisions.
   788 
       
   789     - tip-rev: the rev-num of the tip-most revision seen by this cache
       
   790     - tip-node: the node-id of the tip-most revision sen by this cache
       
   791     - filtered-hash: the hash of all filtered and obsolete revisions (before
       
   792                      tip-rev) ignored by this cache.
       
   793 
       
   794     The tip-rev is used to know how far behind the value in the file are
       
   795     compared to the current repository state.
       
   796 
       
   797     The tip-node and filtered-hash are used to detect if this cache can be used
       
   798     for this repository state at all.
   789 
   799 
   790     The open/closed state is represented by a single letter 'o' or 'c'.
   800     The open/closed state is represented by a single letter 'o' or 'c'.
   791     This field can be used to avoid changelog reads when determining if a
   801     This field can be used to avoid changelog reads when determining if a
   792     branch head closes a branch or not.
   802     branch head closes a branch or not.
   793     """
   803     """
   794 
   804 
   795     _base_filename = b"branch3"
   805     _base_filename = b"branch3"
       
   806 
       
   807     def _write_header(self, fp) -> None:
       
   808         cache_keys = {
       
   809             b"tip-node": hex(self.tipnode),
       
   810             b"tip-rev": b'%d' % self.tiprev,
       
   811         }
       
   812         if self.filteredhash is not None:
       
   813             cache_keys[b"filtered-hash"] = hex(self.filteredhash)
       
   814         pieces = (b"%s=%s" % i for i in sorted(cache_keys.items()))
       
   815         fp.write(b" ".join(pieces) + b'\n')
       
   816 
       
   817     @classmethod
       
   818     def _load_header(cls, repo, lineiter):
       
   819         header_line = next(lineiter)
       
   820         pieces = header_line.rstrip(b'\n').split(b" ")
       
   821         cache_keys = dict(p.split(b'=', 1) for p in pieces)
       
   822 
       
   823         args = {}
       
   824         for k, v in cache_keys.items():
       
   825             if k == b"tip-rev":
       
   826                 args["tiprev"] = int(v)
       
   827             elif k == b"tip-node":
       
   828                 args["tipnode"] = bin(v)
       
   829             elif k == b"filtered-hash":
       
   830                 args["filteredhash"] = bin(v)
       
   831             else:
       
   832                 msg = b"unknown cache key: %r" % k
       
   833                 raise ValueError(msg)
       
   834         return args
   796 
   835 
   797 
   836 
   798 class remotebranchcache(_BaseBranchCache):
   837 class remotebranchcache(_BaseBranchCache):
   799     """Branchmap info for a remote connection, should not write locally"""
   838     """Branchmap info for a remote connection, should not write locally"""
   800 
   839