This function is super hacky and isn't correct 100% of the time. I'm going
to need this functionality on a future non-revlog store.
Let's copy things to storageutil so this code only exists once.
| hg-reviewers |
This function is super hacky and isn't correct 100% of the time. I'm going
to need this functionality on a future non-revlog store.
Let's copy things to storageutil so this code only exists once.
| Automatic diff as part of commit; lint not applicable. |
| Automatic diff as part of commit; unit tests not applicable. |
| return self.flags(rev) & REVIDX_ISCENSORED | return self.flags(rev) & REVIDX_ISCENSORED | ||||
| def _peek_iscensored(self, baserev, delta, flush): | def _peek_iscensored(self, baserev, delta, flush): | ||||
| """Quickly check if a delta produces a censored revision.""" | """Quickly check if a delta produces a censored revision.""" | ||||
| if not self._censorable: | if not self._censorable: | ||||
| return False | return False | ||||
| # Fragile heuristic: unless new file meta keys are added alphabetically | return storageutil.deltaiscensored(delta, baserev, self.rawsize) | ||||
| # preceding "censored", all censored revisions are prefixed by | |||||
| # "\1\ncensored:". A delta producing such a censored revision must be a | |||||
| # full-replacement delta, so we inspect the first and only patch in the | |||||
| # delta for this prefix. | |||||
| hlen = struct.calcsize(">lll") | |||||
| if len(delta) <= hlen: | |||||
| return False | |||||
| oldlen = self.rawsize(baserev) | |||||
| newlen = len(delta) - hlen | |||||
| if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen): | |||||
| return False | |||||
| add = "\1\ncensored:" | |||||
| addlen = len(add) | |||||
| return newlen >= addlen and delta[hlen:hlen + addlen] == add | |||||
| def getstrippoint(self, minlink): | def getstrippoint(self, minlink): | ||||
| """find the minimum rev that must be stripped to strip the linkrev | """find the minimum rev that must be stripped to strip the linkrev | ||||
| Returns a tuple containing the minimum rev and a set of all revs that | Returns a tuple containing the minimum rev and a set of all revs that | ||||
| have linkrevs that will be broken by this strip. | have linkrevs that will be broken by this strip. | ||||
| """ | """ | ||||
| return storageutil.resolvestripinfo(minlink, len(self) - 1, | return storageutil.resolvestripinfo(minlink, len(self) - 1, | ||||
| # storageutil.py - Storage functionality agnostic of backend implementation. | # storageutil.py - Storage functionality agnostic of backend implementation. | ||||
| # | # | ||||
| # Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com> | # Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com> | ||||
| # | # | ||||
| # This software may be used and distributed according to the terms of the | # This software may be used and distributed according to the terms of the | ||||
| # GNU General Public License version 2 or any later version. | # GNU General Public License version 2 or any later version. | ||||
| from __future__ import absolute_import | from __future__ import absolute_import | ||||
| import hashlib | import hashlib | ||||
| import re | import re | ||||
| import struct | |||||
| from ..i18n import _ | from ..i18n import _ | ||||
| from ..node import ( | from ..node import ( | ||||
| bin, | bin, | ||||
| nullid, | nullid, | ||||
| nullrev, | nullrev, | ||||
| ) | ) | ||||
| from .. import ( | from .. import ( | ||||
| p2node=fnode(p2rev), | p2node=fnode(p2rev), | ||||
| basenode=fnode(baserev), | basenode=fnode(baserev), | ||||
| flags=flagsfn(rev) if flagsfn else 0, | flags=flagsfn(rev) if flagsfn else 0, | ||||
| baserevisionsize=baserevisionsize, | baserevisionsize=baserevisionsize, | ||||
| revision=revision, | revision=revision, | ||||
| delta=delta) | delta=delta) | ||||
| prevrev = rev | prevrev = rev | ||||
| def deltaiscensored(delta, baserev, baselenfn): | |||||
| """Determine if a delta represents censored revision data. | |||||
| ``baserev`` is the base revision this delta is encoded against. | |||||
| ``baselenfn`` is a callable receiving a revision number that resolves the | |||||
| length of the revision fulltext. | |||||
| Returns a bool indicating if the result of the delta represents a censored | |||||
| revision. | |||||
| """ | |||||
| # Fragile heuristic: unless new file meta keys are added alphabetically | |||||
| # preceding "censored", all censored revisions are prefixed by | |||||
| # "\1\ncensored:". A delta producing such a censored revision must be a | |||||
| # full-replacement delta, so we inspect the first and only patch in the | |||||
| # delta for this prefix. | |||||
| hlen = struct.calcsize(">lll") | |||||
| if len(delta) <= hlen: | |||||
| return False | |||||
| oldlen = baselenfn(baserev) | |||||
| newlen = len(delta) - hlen | |||||
| if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen): | |||||
| return False | |||||
| add = "\1\ncensored:" | |||||
| addlen = len(add) | |||||
| return newlen >= addlen and delta[hlen:hlen + addlen] == add | |||||