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