comparison mercurial/manifest.py @ 24224:d71837d06597

manifest: do parsing inside manifestdict contstructor This shape to the code will make using a C implementation of the manifest storage easier.
author Augie Fackler <augie@google.com>
date Sat, 07 Mar 2015 11:43:12 -0500
parents b4df0d0c49e7
children 3e5c4af69808
comparison
equal deleted inserted replaced
24223:b4df0d0c49e7 24224:d71837d06597
18 fdict[f] = n[40:] 18 fdict[f] = n[40:]
19 mfdict[f] = bin(n[:40]) 19 mfdict[f] = bin(n[:40])
20 else: 20 else:
21 mfdict[f] = bin(n) 21 mfdict[f] = bin(n)
22 22
23 def _parse(lines): 23 def _parse(lines, mfdict, flags):
24 mfdict = manifestdict()
25 try: 24 try:
26 parsers.parse_manifest(mfdict, mfdict._flags, lines) 25 parsers.parse_manifest(mfdict, flags, lines)
27 except AttributeError: 26 except AttributeError:
28 _parsemanifest(mfdict, mfdict._flags, lines) 27 _parsemanifest(mfdict, flags, lines)
29 return mfdict 28 return mfdict
30 29
31 class manifestdict(dict): 30 class manifestdict(dict):
32 def __init__(self): 31 def __init__(self, data=''):
33 self._flags = {} 32 self._flags = {}
33 _parse(data, self, self._flags)
34
34 def __setitem__(self, k, v): 35 def __setitem__(self, k, v):
35 assert v is not None 36 assert v is not None
36 dict.__setitem__(self, k, v) 37 dict.__setitem__(self, k, v)
37 def flags(self, f): 38 def flags(self, f):
38 return self._flags.get(f, "") 39 return self._flags.get(f, "")
248 self._mancache = util.lrucachedict(cachesize) 249 self._mancache = util.lrucachedict(cachesize)
249 revlog.revlog.__init__(self, opener, "00manifest.i") 250 revlog.revlog.__init__(self, opener, "00manifest.i")
250 251
251 def readdelta(self, node): 252 def readdelta(self, node):
252 r = self.rev(node) 253 r = self.rev(node)
253 return _parse(mdiff.patchtext(self.revdiff(self.deltaparent(r), r))) 254 d = mdiff.patchtext(self.revdiff(self.deltaparent(r), r))
255 return manifestdict(d)
254 256
255 def readfast(self, node): 257 def readfast(self, node):
256 '''use the faster of readdelta or read''' 258 '''use the faster of readdelta or read'''
257 r = self.rev(node) 259 r = self.rev(node)
258 deltaparent = self.deltaparent(r) 260 deltaparent = self.deltaparent(r)
265 return manifestdict() # don't upset local cache 267 return manifestdict() # don't upset local cache
266 if node in self._mancache: 268 if node in self._mancache:
267 return self._mancache[node][0] 269 return self._mancache[node][0]
268 text = self.revision(node) 270 text = self.revision(node)
269 arraytext = array.array('c', text) 271 arraytext = array.array('c', text)
270 m = _parse(text) 272 m = manifestdict(text)
271 self._mancache[node] = (m, arraytext) 273 self._mancache[node] = (m, arraytext)
272 return m 274 return m
273 275
274 def find(self, node, f): 276 def find(self, node, f):
275 '''look up entry for a single file efficiently. 277 '''look up entry for a single file efficiently.