Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 39878:3e896b51aa5d
storageutil: move metadata parsing and packing from revlog (API)
Parsing and writing of revision text metadata is likely identical
across storage backends. Let's move the code out of revlog so we
don't need to import the revlog module in order to use it.
Differential Revision: https://phab.mercurial-scm.org/D4754
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 24 Sep 2018 14:31:31 -0700 |
parents | f8eb71f9e3bd |
children | d269ddbf54f0 |
comparison
equal
deleted
inserted
replaced
39877:f8eb71f9e3bd | 39878:3e896b51aa5d |
---|---|
15 | 15 |
16 import collections | 16 import collections |
17 import contextlib | 17 import contextlib |
18 import errno | 18 import errno |
19 import os | 19 import os |
20 import re | |
21 import struct | 20 import struct |
22 import zlib | 21 import zlib |
23 | 22 |
24 # import stuff from node for others to import from revlog | 23 # import stuff from node for others to import from revlog |
25 from .node import ( | 24 from .node import ( |
125 ellipsisreadprocessor, | 124 ellipsisreadprocessor, |
126 ellipsiswriteprocessor, | 125 ellipsiswriteprocessor, |
127 ellipsisrawprocessor, | 126 ellipsisrawprocessor, |
128 ) | 127 ) |
129 | 128 |
130 _mdre = re.compile('\1\n') | |
131 def parsemeta(text): | |
132 """return (metadatadict, metadatasize)""" | |
133 # text can be buffer, so we can't use .startswith or .index | |
134 if text[:2] != '\1\n': | |
135 return None, None | |
136 s = _mdre.search(text, 2).start() | |
137 mtext = text[2:s] | |
138 meta = {} | |
139 for l in mtext.splitlines(): | |
140 k, v = l.split(": ", 1) | |
141 meta[k] = v | |
142 return meta, (s + 2) | |
143 | |
144 def packmeta(meta, text): | |
145 keys = sorted(meta) | |
146 metatext = "".join("%s: %s\n" % (k, meta[k]) for k in keys) | |
147 return "\1\n%s\1\n%s" % (metatext, text) | |
148 | |
149 def _censoredtext(text): | 129 def _censoredtext(text): |
150 m, offs = parsemeta(text) | 130 m, offs = storageutil.parsemeta(text) |
151 return m and "censored" in m | 131 return m and "censored" in m |
152 | 132 |
153 def addflagprocessor(flag, processor): | 133 def addflagprocessor(flag, processor): |
154 """Register a flag processor on a revision data flag. | 134 """Register a flag processor on a revision data flag. |
155 | 135 |
2514 if (self.version & 0xFFFF) == REVLOGV0: | 2494 if (self.version & 0xFFFF) == REVLOGV0: |
2515 raise error.RevlogError(_('cannot censor with version %d revlogs') % | 2495 raise error.RevlogError(_('cannot censor with version %d revlogs') % |
2516 self.version) | 2496 self.version) |
2517 | 2497 |
2518 rev = self.rev(node) | 2498 rev = self.rev(node) |
2519 tombstone = packmeta({b'censored': tombstone}, b'') | 2499 tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
2520 | 2500 |
2521 if len(tombstone) > self.rawsize(rev): | 2501 if len(tombstone) > self.rawsize(rev): |
2522 raise error.Abort(_('censor tombstone must be no longer than ' | 2502 raise error.Abort(_('censor tombstone must be no longer than ' |
2523 'censored data')) | 2503 'censored data')) |
2524 | 2504 |