--- a/mercurial/manifest.py Wed Feb 21 16:47:39 2018 -0800
+++ b/mercurial/manifest.py Thu Feb 22 20:04:42 2018 -0500
@@ -9,7 +9,6 @@
import heapq
import itertools
-import os
import struct
from .i18n import _
@@ -28,7 +27,7 @@
parsers = policy.importmod(r'parsers')
propertycache = util.propertycache
-def _parsev1(data):
+def _parse(data):
# This method does a little bit of excessive-looking
# precondition checking. This is so that the behavior of this
# class exactly matches its C counterpart to try and help
@@ -47,43 +46,7 @@
else:
yield f, bin(n), ''
-def _parsev2(data):
- metadataend = data.find('\n')
- # Just ignore metadata for now
- pos = metadataend + 1
- prevf = ''
- while pos < len(data):
- end = data.find('\n', pos + 1) # +1 to skip stem length byte
- if end == -1:
- raise ValueError('Manifest ended with incomplete file entry.')
- stemlen = ord(data[pos:pos + 1])
- items = data[pos + 1:end].split('\0')
- f = prevf[:stemlen] + items[0]
- if prevf > f:
- raise ValueError('Manifest entries not in sorted order.')
- fl = items[1]
- # Just ignore metadata (items[2:] for now)
- n = data[end + 1:end + 21]
- yield f, n, fl
- pos = end + 22
- prevf = f
-
-def _parse(data):
- """Generates (path, node, flags) tuples from a manifest text"""
- if data.startswith('\0'):
- return iter(_parsev2(data))
- else:
- return iter(_parsev1(data))
-
-def _text(it, usemanifestv2):
- """Given an iterator over (path, node, flags) tuples, returns a manifest
- text"""
- if usemanifestv2:
- return _textv2(it)
- else:
- return _textv1(it)
-
-def _textv1(it):
+def _text(it):
files = []
lines = []
_hex = revlog.hex
@@ -96,19 +59,6 @@
_checkforbidden(files)
return ''.join(lines)
-def _textv2(it):
- files = []
- lines = ['\0\n']
- prevf = ''
- for f, n, fl in it:
- files.append(f)
- stem = os.path.commonprefix([prevf, f])
- stemlen = min(len(stem), 255)
- lines.append("%c%s\0%s\n%s\n" % (stemlen, f[stemlen:], fl, n))
- prevf = f
- _checkforbidden(files)
- return ''.join(lines)
-
class lazymanifestiter(object):
def __init__(self, lm):
self.pos = 0
@@ -414,13 +364,7 @@
class manifestdict(object):
def __init__(self, data=''):
- if data.startswith('\0'):
- #_lazymanifest can not parse v2
- self._lm = _lazymanifest('')
- for f, n, fl in _parsev2(data):
- self._lm[f] = n, fl
- else:
- self._lm = _lazymanifest(data)
+ self._lm = _lazymanifest(data)
def __getitem__(self, key):
return self._lm[key][0]
@@ -589,12 +533,9 @@
def iterentries(self):
return self._lm.iterentries()
- def text(self, usemanifestv2=False):
- if usemanifestv2:
- return _textv2(self._lm.iterentries())
- else:
- # use (probably) native version for v1
- return self._lm.text()
+ def text(self):
+ # most likely uses native version
+ return self._lm.text()
def fastdelta(self, base, changes):
"""Given a base manifest text as a bytearray and a list of changes
@@ -1138,12 +1079,12 @@
if fl:
self._flags[f] = fl
- def text(self, usemanifestv2=False):
+ def text(self):
"""Get the full data of this manifest as a bytestring."""
self._load()
- return _text(self.iterentries(), usemanifestv2)
+ return _text(self.iterentries())
- def dirtext(self, usemanifestv2=False):
+ def dirtext(self):
"""Get the full data of this directory as a bytestring. Make sure that
any submanifests have been written first, so their nodeids are correct.
"""
@@ -1151,7 +1092,7 @@
flags = self.flags
dirs = [(d[:-1], self._dirs[d]._node, 't') for d in self._dirs]
files = [(f, self._files[f], flags(f)) for f in self._files]
- return _text(sorted(dirs + files), usemanifestv2)
+ return _text(sorted(dirs + files))
def read(self, gettext, readsubtree):
def _load_for_read(s):
@@ -1208,15 +1149,12 @@
# stacks of commits, the number can go up, hence the config knob below.
cachesize = 4
optiontreemanifest = False
- usemanifestv2 = False
opts = getattr(opener, 'options', None)
if opts is not None:
cachesize = opts.get('manifestcachesize', cachesize)
optiontreemanifest = opts.get('treemanifest', False)
- usemanifestv2 = opts.get('manifestv2', usemanifestv2)
self._treeondisk = optiontreemanifest or treemanifest
- self._usemanifestv2 = usemanifestv2
self._fulltextcache = util.lrucachedict(cachesize)
@@ -1262,8 +1200,7 @@
return self._dirlogcache[d]
def add(self, m, transaction, link, p1, p2, added, removed, readtree=None):
- if (p1 in self.fulltextcache and util.safehasattr(m, 'fastdelta')
- and not self._usemanifestv2):
+ if p1 in self.fulltextcache and util.safehasattr(m, 'fastdelta'):
# If our first parent is in the manifest cache, we can
# compute a delta here using properties we know about the
# manifest up-front, which may save time later for the
@@ -1290,7 +1227,7 @@
n = self._addtree(m, transaction, link, m1, m2, readtree)
arraytext = None
else:
- text = m.text(self._usemanifestv2)
+ text = m.text()
n = self.addrevision(text, transaction, link, p1, p2)
arraytext = bytearray(text)
@@ -1309,13 +1246,13 @@
sublog.add(subm, transaction, link, subp1, subp2, None, None,
readtree=readtree)
m.writesubtrees(m1, m2, writesubtree)
- text = m.dirtext(self._usemanifestv2)
+ text = m.dirtext()
n = None
if self._dir != '':
# Double-check whether contents are unchanged to one parent
- if text == m1.dirtext(self._usemanifestv2):
+ if text == m1.dirtext():
n = m1.node()
- elif text == m2.dirtext(self._usemanifestv2):
+ elif text == m2.dirtext():
n = m2.node()
if not n:
@@ -1493,19 +1430,6 @@
Changing the value of `shallow` has no effect on flat manifests.
'''
revlog = self._revlog()
- if revlog._usemanifestv2:
- # Need to perform a slow delta
- r0 = revlog.deltaparent(revlog.rev(self._node))
- m0 = self._manifestlog[revlog.node(r0)].read()
- m1 = self.read()
- md = manifestdict()
- for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
- if n1:
- md[f] = n1
- if fl1:
- md.setflag(f, fl1)
- return md
-
r = revlog.rev(self._node)
d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r))
return manifestdict(d)
@@ -1608,7 +1532,7 @@
its 't' flag.
'''
revlog = self._revlog()
- if shallow and not revlog._usemanifestv2:
+ if shallow:
r = revlog.rev(self._node)
d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r))
return manifestdict(d)