diff -r 0b7594ada0db -r 24870f1be088 mercurial/manifest.py --- a/mercurial/manifest.py Mon Sep 17 15:16:20 2018 -0400 +++ b/mercurial/manifest.py Fri Sep 14 16:29:51 2018 -0700 @@ -1203,7 +1203,7 @@ s._dirty = False self._loadfunc = _load_for_read - def writesubtrees(self, m1, m2, writesubtree): + def writesubtrees(self, m1, m2, writesubtree, match): self._load() # for consistency; should never have any effect here m1._load() m2._load() @@ -1214,12 +1214,21 @@ return ld[1] return m._dirs.get(d, emptytree)._node + # we should have always loaded everything by the time we get here for + # `self`, but possibly not in `m1` or `m2`. + assert not self._lazydirs + # let's skip investigating things that `match` says we do not need. + visit = match.visitchildrenset(self._dir[:-1] or '.') + if visit == 'this' or visit == 'all': + visit = None for d, subm in self._dirs.iteritems(): + if visit and d[:-1] not in visit: + continue subp1 = getnode(m1, d) subp2 = getnode(m2, d) if subp1 == nullid: subp1, subp2 = subp2, subp1 - writesubtree(subm, subp1, subp2) + writesubtree(subm, subp1, subp2, match) def walksubtrees(self, matcher=None): """Returns an iterator of the subtrees of this manifest, including this @@ -1445,7 +1454,8 @@ self._dirlogcache[d] = mfrevlog return self._dirlogcache[d] - def add(self, m, transaction, link, p1, p2, added, removed, readtree=None): + def add(self, m, transaction, link, p1, p2, added, removed, readtree=None, + match=None): 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 @@ -1469,9 +1479,11 @@ # process. if self._treeondisk: assert readtree, "readtree must be set for treemanifest writes" + assert match, "match must be specified for treemanifest writes" m1 = readtree(self.tree, p1) m2 = readtree(self.tree, p2) - n = self._addtree(m, transaction, link, m1, m2, readtree) + n = self._addtree(m, transaction, link, m1, m2, readtree, + match=match) arraytext = None else: text = m.text() @@ -1483,17 +1495,17 @@ return n - def _addtree(self, m, transaction, link, m1, m2, readtree): + def _addtree(self, m, transaction, link, m1, m2, readtree, match): # If the manifest is unchanged compared to one parent, # don't write a new revision if self.tree != '' and (m.unmodifiedsince(m1) or m.unmodifiedsince( m2)): return m.node() - def writesubtree(subm, subp1, subp2): + def writesubtree(subm, subp1, subp2, match): sublog = self.dirlog(subm.dir()) sublog.add(subm, transaction, link, subp1, subp2, None, None, - readtree=readtree) - m.writesubtrees(m1, m2, writesubtree) + readtree=readtree, match=match) + m.writesubtrees(m1, m2, writesubtree, match) text = m.dirtext() n = None if self.tree != '': @@ -1697,9 +1709,9 @@ def read(self): return self._manifestdict - def write(self, transaction, link, p1, p2, added, removed): + def write(self, transaction, link, p1, p2, added, removed, match=None): return self._storage().add(self._manifestdict, transaction, link, - p1, p2, added, removed) + p1, p2, added, removed, match=match) @interfaceutil.implementer(repository.imanifestrevisionstored) class manifestctx(object): @@ -1802,11 +1814,12 @@ def read(self): return self._treemanifest - def write(self, transaction, link, p1, p2, added, removed): + def write(self, transaction, link, p1, p2, added, removed, match=None): def readtree(dir, node): return self._manifestlog.get(dir, node).read() return self._storage().add(self._treemanifest, transaction, link, - p1, p2, added, removed, readtree=readtree) + p1, p2, added, removed, readtree=readtree, + match=match) @interfaceutil.implementer(repository.imanifestrevisionstored) class treemanifestctx(object):