##// END OF EJS Templates
narrow: when writing treemanifests, skip inspecting directories outside narrow...
spectral -
r39704:24870f1b default
parent child Browse files
Show More
@@ -2109,9 +2109,16 b' class localrepository(object):'
2109 2109 'changelog, but manifest differs)\n')
2110 2110 if files or md:
2111 2111 self.ui.note(_("committing manifest\n"))
2112 # we're using narrowmatch here since it's already applied at
2113 # other stages (such as dirstate.walk), so we're already
2114 # ignoring things outside of narrowspec in most cases. The
2115 # one case where we might have files outside the narrowspec
2116 # at this point is merges, and we already error out in the
2117 # case where the merge has files outside of the narrowspec,
2118 # so this is safe.
2112 2119 mn = mctx.write(trp, linkrev,
2113 2120 p1.manifestnode(), p2.manifestnode(),
2114 added, drop)
2121 added, drop, match=self.narrowmatch())
2115 2122 else:
2116 2123 self.ui.debug('reusing manifest form p1 (listed files '
2117 2124 'actually unchanged)\n')
@@ -1203,7 +1203,7 b' class treemanifest(object):'
1203 1203 s._dirty = False
1204 1204 self._loadfunc = _load_for_read
1205 1205
1206 def writesubtrees(self, m1, m2, writesubtree):
1206 def writesubtrees(self, m1, m2, writesubtree, match):
1207 1207 self._load() # for consistency; should never have any effect here
1208 1208 m1._load()
1209 1209 m2._load()
@@ -1214,12 +1214,21 b' class treemanifest(object):'
1214 1214 return ld[1]
1215 1215 return m._dirs.get(d, emptytree)._node
1216 1216
1217 # we should have always loaded everything by the time we get here for
1218 # `self`, but possibly not in `m1` or `m2`.
1219 assert not self._lazydirs
1220 # let's skip investigating things that `match` says we do not need.
1221 visit = match.visitchildrenset(self._dir[:-1] or '.')
1222 if visit == 'this' or visit == 'all':
1223 visit = None
1217 1224 for d, subm in self._dirs.iteritems():
1225 if visit and d[:-1] not in visit:
1226 continue
1218 1227 subp1 = getnode(m1, d)
1219 1228 subp2 = getnode(m2, d)
1220 1229 if subp1 == nullid:
1221 1230 subp1, subp2 = subp2, subp1
1222 writesubtree(subm, subp1, subp2)
1231 writesubtree(subm, subp1, subp2, match)
1223 1232
1224 1233 def walksubtrees(self, matcher=None):
1225 1234 """Returns an iterator of the subtrees of this manifest, including this
@@ -1445,7 +1454,8 b' class manifestrevlog(object):'
1445 1454 self._dirlogcache[d] = mfrevlog
1446 1455 return self._dirlogcache[d]
1447 1456
1448 def add(self, m, transaction, link, p1, p2, added, removed, readtree=None):
1457 def add(self, m, transaction, link, p1, p2, added, removed, readtree=None,
1458 match=None):
1449 1459 if p1 in self.fulltextcache and util.safehasattr(m, 'fastdelta'):
1450 1460 # If our first parent is in the manifest cache, we can
1451 1461 # compute a delta here using properties we know about the
@@ -1469,9 +1479,11 b' class manifestrevlog(object):'
1469 1479 # process.
1470 1480 if self._treeondisk:
1471 1481 assert readtree, "readtree must be set for treemanifest writes"
1482 assert match, "match must be specified for treemanifest writes"
1472 1483 m1 = readtree(self.tree, p1)
1473 1484 m2 = readtree(self.tree, p2)
1474 n = self._addtree(m, transaction, link, m1, m2, readtree)
1485 n = self._addtree(m, transaction, link, m1, m2, readtree,
1486 match=match)
1475 1487 arraytext = None
1476 1488 else:
1477 1489 text = m.text()
@@ -1483,17 +1495,17 b' class manifestrevlog(object):'
1483 1495
1484 1496 return n
1485 1497
1486 def _addtree(self, m, transaction, link, m1, m2, readtree):
1498 def _addtree(self, m, transaction, link, m1, m2, readtree, match):
1487 1499 # If the manifest is unchanged compared to one parent,
1488 1500 # don't write a new revision
1489 1501 if self.tree != '' and (m.unmodifiedsince(m1) or m.unmodifiedsince(
1490 1502 m2)):
1491 1503 return m.node()
1492 def writesubtree(subm, subp1, subp2):
1504 def writesubtree(subm, subp1, subp2, match):
1493 1505 sublog = self.dirlog(subm.dir())
1494 1506 sublog.add(subm, transaction, link, subp1, subp2, None, None,
1495 readtree=readtree)
1496 m.writesubtrees(m1, m2, writesubtree)
1507 readtree=readtree, match=match)
1508 m.writesubtrees(m1, m2, writesubtree, match)
1497 1509 text = m.dirtext()
1498 1510 n = None
1499 1511 if self.tree != '':
@@ -1697,9 +1709,9 b' class memmanifestctx(object):'
1697 1709 def read(self):
1698 1710 return self._manifestdict
1699 1711
1700 def write(self, transaction, link, p1, p2, added, removed):
1712 def write(self, transaction, link, p1, p2, added, removed, match=None):
1701 1713 return self._storage().add(self._manifestdict, transaction, link,
1702 p1, p2, added, removed)
1714 p1, p2, added, removed, match=match)
1703 1715
1704 1716 @interfaceutil.implementer(repository.imanifestrevisionstored)
1705 1717 class manifestctx(object):
@@ -1802,11 +1814,12 b' class memtreemanifestctx(object):'
1802 1814 def read(self):
1803 1815 return self._treemanifest
1804 1816
1805 def write(self, transaction, link, p1, p2, added, removed):
1817 def write(self, transaction, link, p1, p2, added, removed, match=None):
1806 1818 def readtree(dir, node):
1807 1819 return self._manifestlog.get(dir, node).read()
1808 1820 return self._storage().add(self._treemanifest, transaction, link,
1809 p1, p2, added, removed, readtree=readtree)
1821 p1, p2, added, removed, readtree=readtree,
1822 match=match)
1810 1823
1811 1824 @interfaceutil.implementer(repository.imanifestrevisionstored)
1812 1825 class treemanifestctx(object):
@@ -978,13 +978,18 b' class imanifestrevisionstored(imanifestr'
978 978 class imanifestrevisionwritable(imanifestrevisionbase):
979 979 """Interface representing a manifest revision that can be committed."""
980 980
981 def write(transaction, linkrev, p1node, p2node, added, removed):
981 def write(transaction, linkrev, p1node, p2node, added, removed, match=None):
982 982 """Add this revision to storage.
983 983
984 984 Takes a transaction object, the changeset revision number it will
985 985 be associated with, its parent nodes, and lists of added and
986 986 removed paths.
987 987
988 If match is provided, storage can choose not to inspect or write out
989 items that do not match. Storage is still required to be able to provide
990 the full manifest in the future for any directories written (these
991 manifests should not be "narrowed on disk").
992
988 993 Returns the binary node of the created revision.
989 994 """
990 995
@@ -1141,7 +1146,8 b' class imanifeststorage(interfaceutil.Int'
1141 1146 def dirlog(d):
1142 1147 """Obtain a manifest storage instance for a tree."""
1143 1148
1144 def add(m, transaction, link, p1, p2, added, removed, readtree=None):
1149 def add(m, transaction, link, p1, p2, added, removed, readtree=None,
1150 match=None):
1145 1151 """Add a revision to storage.
1146 1152
1147 1153 ``m`` is an object conforming to ``imanifestdict``.
@@ -1152,6 +1158,15 b' class imanifeststorage(interfaceutil.Int'
1152 1158
1153 1159 ``added`` and ``removed`` are iterables of added and removed paths,
1154 1160 respectively.
1161
1162 ``readtree`` is a function that can be used to read the child tree(s)
1163 when recursively writing the full tree structure when using
1164 treemanifets.
1165
1166 ``match`` is a matcher that can be used to hint to storage that not all
1167 paths must be inspected; this is an optimization and can be safely
1168 ignored. Note that the storage must still be able to reproduce a full
1169 manifest including files that did not match.
1155 1170 """
1156 1171
1157 1172 class imanifestlog(interfaceutil.Interface):
General Comments 0
You need to be logged in to leave comments. Login now