Mercurial > public > mercurial-scm > hg
diff mercurial/utils/storageutil.py @ 47078:223b47235d1c
sidedata: enable sidedata computers to optionally rewrite flags
Sidedata computers may want to influence the flags of the revision they touch.
For example, the computer for changelog-based copytracing can add a flag to
signify that this revision might affect copytracing, inversely removing said
flag if the information is no longer applicable.
See inline documentation in `storageutil` for more details.
Differential Revision: https://phab.mercurial-scm.org/D10344
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Thu, 08 Apr 2021 16:55:17 +0200 |
parents | 119790e1c67c |
children | 3aab2330b7d3 |
line wrap: on
line diff
--- a/mercurial/utils/storageutil.py Sat Apr 10 11:27:40 2021 +0200 +++ b/mercurial/utils/storageutil.py Thu Apr 08 16:55:17 2021 +0200 @@ -366,12 +366,17 @@ If not None, means that sidedata should be included. A dictionary of revlog type to tuples of `(repo, computers, removers)`: * `repo` is used as an argument for computers - * `computers` is a list of `(category, (keys, computer)` that + * `computers` is a list of `(category, (keys, computer, flags)` that compute the missing sidedata categories that were asked: * `category` is the sidedata category * `keys` are the sidedata keys to be affected + * `flags` is a bitmask (an integer) of flags to remove when + removing the category. * `computer` is the function `(repo, store, rev, sidedata)` that - returns a new sidedata dict. + returns a tuple of + `(new sidedata dict, (flags to add, flags to remove))`. + For example, it will return `({}, (0, 1 << 15))` to return no + sidedata, with no flags to add and one flag to remove. * `removers` will remove the keys corresponding to the categories that are present, but not needed. If both `computers` and `removers` are empty, sidedata are simply not @@ -491,12 +496,13 @@ available.add(rev) serialized_sidedata = None + sidedata_flags = (0, 0) if sidedata_helpers: - sidedata = store.sidedata(rev) - sidedata = run_sidedata_helpers( + old_sidedata = store.sidedata(rev) + sidedata, sidedata_flags = run_sidedata_helpers( store=store, sidedata_helpers=sidedata_helpers, - sidedata=sidedata, + sidedata=old_sidedata, rev=rev, ) if sidedata: @@ -507,6 +513,8 @@ if serialized_sidedata: # Advertise that sidedata exists to the other side protocol_flags |= CG_FLAG_SIDEDATA + # Computers and removers can return flags to add and/or remove + flags = flags | sidedata_flags[0] & ~sidedata_flags[1] yield resultcls( node=node, @@ -535,12 +543,17 @@ """ repo, sd_computers, sd_removers = sidedata_helpers kind = store.revlog_kind - for _keys, sd_computer in sd_computers.get(kind, []): - sidedata = sd_computer(repo, store, rev, sidedata) - for keys, _computer in sd_removers.get(kind, []): + flags_to_add = 0 + flags_to_remove = 0 + for _keys, sd_computer, _flags in sd_computers.get(kind, []): + sidedata, flags = sd_computer(repo, store, rev, sidedata) + flags_to_add |= flags[0] + flags_to_remove |= flags[1] + for keys, _computer, flags in sd_removers.get(kind, []): for key in keys: sidedata.pop(key, None) - return sidedata + flags_to_remove |= flags + return sidedata, (flags_to_add, flags_to_remove) def deltaiscensored(delta, baserev, baselenfn):