mercurial/manifest.py
changeset 39316 53363a8eff57
parent 39315 57c3864f3aad
child 39317 eb9b8679c852
equal deleted inserted replaced
39315:57c3864f3aad 39316:53363a8eff57
    14 
    14 
    15 from .i18n import _
    15 from .i18n import _
    16 from .node import (
    16 from .node import (
    17     bin,
    17     bin,
    18     hex,
    18     hex,
       
    19     nullid,
       
    20     nullrev,
    19 )
    21 )
    20 from . import (
    22 from . import (
    21     error,
    23     error,
    22     mdiff,
    24     mdiff,
    23     policy,
    25     policy,
    53             yield f, bin(n), ''
    55             yield f, bin(n), ''
    54 
    56 
    55 def _text(it):
    57 def _text(it):
    56     files = []
    58     files = []
    57     lines = []
    59     lines = []
    58     _hex = revlog.hex
       
    59     for f, n, fl in it:
    60     for f, n, fl in it:
    60         files.append(f)
    61         files.append(f)
    61         # if this is changed to support newlines in filenames,
    62         # if this is changed to support newlines in filenames,
    62         # be sure to check the templates/ dir again (especially *-raw.tmpl)
    63         # be sure to check the templates/ dir again (especially *-raw.tmpl)
    63         lines.append("%s\0%s%s\n" % (f, _hex(n), fl))
    64         lines.append("%s\0%s%s\n" % (f, hex(n), fl))
    64 
    65 
    65     _checkforbidden(files)
    66     _checkforbidden(files)
    66     return ''.join(lines)
    67     return ''.join(lines)
    67 
    68 
    68 class lazymanifestiter(object):
    69 class lazymanifestiter(object):
   564             for f, todelete in changes:
   565             for f, todelete in changes:
   565                 # bs will either be the index of the item or the insert point
   566                 # bs will either be the index of the item or the insert point
   566                 start, end = _msearch(addbuf, f, start)
   567                 start, end = _msearch(addbuf, f, start)
   567                 if not todelete:
   568                 if not todelete:
   568                     h, fl = self._lm[f]
   569                     h, fl = self._lm[f]
   569                     l = "%s\0%s%s\n" % (f, revlog.hex(h), fl)
   570                     l = "%s\0%s%s\n" % (f, hex(h), fl)
   570                 else:
   571                 else:
   571                     if start == end:
   572                     if start == end:
   572                         # item we want to delete was not found, error out
   573                         # item we want to delete was not found, error out
   573                         raise AssertionError(
   574                         raise AssertionError(
   574                                 _("failed to remove %s from manifest") % f)
   575                                 _("failed to remove %s from manifest") % f)
   678 _noop = lambda s: None
   679 _noop = lambda s: None
   679 
   680 
   680 class treemanifest(object):
   681 class treemanifest(object):
   681     def __init__(self, dir='', text=''):
   682     def __init__(self, dir='', text=''):
   682         self._dir = dir
   683         self._dir = dir
   683         self._node = revlog.nullid
   684         self._node = nullid
   684         self._loadfunc = _noop
   685         self._loadfunc = _noop
   685         self._copyfunc = _noop
   686         self._copyfunc = _noop
   686         self._dirty = False
   687         self._dirty = False
   687         self._dirs = {}
   688         self._dirs = {}
   688         # Using _lazymanifest here is a little slower than plain old dicts
   689         # Using _lazymanifest here is a little slower than plain old dicts
   716         return (not self._files and (not self._dirs or
   717         return (not self._files and (not self._dirs or
   717                 all(m._isempty() for m in self._dirs.values())))
   718                 all(m._isempty() for m in self._dirs.values())))
   718 
   719 
   719     def __repr__(self):
   720     def __repr__(self):
   720         return ('<treemanifest dir=%s, node=%s, loaded=%s, dirty=%s at 0x%x>' %
   721         return ('<treemanifest dir=%s, node=%s, loaded=%s, dirty=%s at 0x%x>' %
   721                 (self._dir, revlog.hex(self._node),
   722                 (self._dir, hex(self._node),
   722                  bool(self._loadfunc is _noop),
   723                  bool(self._loadfunc is _noop),
   723                  self._dirty, id(self)))
   724                  self._dirty, id(self)))
   724 
   725 
   725     def dir(self):
   726     def dir(self):
   726         '''The directory that this tree manifest represents, including a
   727         '''The directory that this tree manifest represents, including a
  1115         m2._load()
  1116         m2._load()
  1116         emptytree = treemanifest()
  1117         emptytree = treemanifest()
  1117         for d, subm in self._dirs.iteritems():
  1118         for d, subm in self._dirs.iteritems():
  1118             subp1 = m1._dirs.get(d, emptytree)._node
  1119             subp1 = m1._dirs.get(d, emptytree)._node
  1119             subp2 = m2._dirs.get(d, emptytree)._node
  1120             subp2 = m2._dirs.get(d, emptytree)._node
  1120             if subp1 == revlog.nullid:
  1121             if subp1 == nullid:
  1121                 subp1, subp2 = subp2, subp1
  1122                 subp1, subp2 = subp2, subp1
  1122             writesubtree(subm, subp1, subp2)
  1123             writesubtree(subm, subp1, subp2)
  1123 
  1124 
  1124     def walksubtrees(self, matcher=None):
  1125     def walksubtrees(self, matcher=None):
  1125         """Returns an iterator of the subtrees of this manifest, including this
  1126         """Returns an iterator of the subtrees of this manifest, including this
  1555             if self._treemanifests:
  1556             if self._treemanifests:
  1556                 m = treemanifestctx(self, '', node)
  1557                 m = treemanifestctx(self, '', node)
  1557             else:
  1558             else:
  1558                 m = manifestctx(self, node)
  1559                 m = manifestctx(self, node)
  1559 
  1560 
  1560         if node != revlog.nullid:
  1561         if node != nullid:
  1561             mancache = self._dirmancache.get(tree)
  1562             mancache = self._dirmancache.get(tree)
  1562             if not mancache:
  1563             if not mancache:
  1563                 mancache = util.lrucachedict(self._cachesize)
  1564                 mancache = util.lrucachedict(self._cachesize)
  1564                 self._dirmancache[tree] = mancache
  1565                 self._dirmancache[tree] = mancache
  1565             mancache[node] = m
  1566             mancache[node] = m
  1635     def parents(self):
  1636     def parents(self):
  1636         return self._revlog().parents(self._node)
  1637         return self._revlog().parents(self._node)
  1637 
  1638 
  1638     def read(self):
  1639     def read(self):
  1639         if self._data is None:
  1640         if self._data is None:
  1640             if self._node == revlog.nullid:
  1641             if self._node == nullid:
  1641                 self._data = manifestdict()
  1642                 self._data = manifestdict()
  1642             else:
  1643             else:
  1643                 rl = self._revlog()
  1644                 rl = self._revlog()
  1644                 if self._node in rl._fulltextcache:
  1645                 if self._node in rl._fulltextcache:
  1645                     text = pycompat.bytestr(rl._fulltextcache[self._node])
  1646                     text = pycompat.bytestr(rl._fulltextcache[self._node])
  1658         If `shallow` is True, nothing changes since this is a flat manifest.
  1659         If `shallow` is True, nothing changes since this is a flat manifest.
  1659         '''
  1660         '''
  1660         rl = self._revlog()
  1661         rl = self._revlog()
  1661         r = rl.rev(self._node)
  1662         r = rl.rev(self._node)
  1662         deltaparent = rl.deltaparent(r)
  1663         deltaparent = rl.deltaparent(r)
  1663         if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r):
  1664         if deltaparent != nullrev and deltaparent in rl.parentrevs(r):
  1664             return self.readdelta()
  1665             return self.readdelta()
  1665         return self.read()
  1666         return self.read()
  1666 
  1667 
  1667     def readdelta(self, shallow=False):
  1668     def readdelta(self, shallow=False):
  1668         '''Returns a manifest containing just the entries that are present
  1669         '''Returns a manifest containing just the entries that are present
  1730         return self._manifestlog.getstorage(self._dir)
  1731         return self._manifestlog.getstorage(self._dir)
  1731 
  1732 
  1732     def read(self):
  1733     def read(self):
  1733         if self._data is None:
  1734         if self._data is None:
  1734             rl = self._revlog()
  1735             rl = self._revlog()
  1735             if self._node == revlog.nullid:
  1736             if self._node == nullid:
  1736                 self._data = treemanifest()
  1737                 self._data = treemanifest()
  1737             elif rl._treeondisk:
  1738             elif rl._treeondisk:
  1738                 m = treemanifest(dir=self._dir)
  1739                 m = treemanifest(dir=self._dir)
  1739                 def gettext():
  1740                 def gettext():
  1740                     return rl.revision(self._node)
  1741                     return rl.revision(self._node)
  1809         and not any submanifests.
  1810         and not any submanifests.
  1810         '''
  1811         '''
  1811         rl = self._revlog()
  1812         rl = self._revlog()
  1812         r = rl.rev(self._node)
  1813         r = rl.rev(self._node)
  1813         deltaparent = rl.deltaparent(r)
  1814         deltaparent = rl.deltaparent(r)
  1814         if (deltaparent != revlog.nullrev and
  1815         if (deltaparent != nullrev and
  1815             deltaparent in rl.parentrevs(r)):
  1816             deltaparent in rl.parentrevs(r)):
  1816             return self.readdelta(shallow=shallow)
  1817             return self.readdelta(shallow=shallow)
  1817 
  1818 
  1818         if shallow:
  1819         if shallow:
  1819             return manifestdict(rl.revision(self._node))
  1820             return manifestdict(rl.revision(self._node))