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