1181 if dir not in self._dirlogcache: |
1181 if dir not in self._dirlogcache: |
1182 self._dirlogcache[dir] = manifestrevlog(self.opener, dir, |
1182 self._dirlogcache[dir] = manifestrevlog(self.opener, dir, |
1183 self._dirlogcache) |
1183 self._dirlogcache) |
1184 return self._dirlogcache[dir] |
1184 return self._dirlogcache[dir] |
1185 |
1185 |
1186 def add(self, m, transaction, link, p1, p2, added, removed): |
1186 def add(self, m, transaction, link, p1, p2, added, removed, readtree=None): |
1187 if (p1 in self.fulltextcache and util.safehasattr(m, 'fastdelta') |
1187 if (p1 in self.fulltextcache and util.safehasattr(m, 'fastdelta') |
1188 and not self._usemanifestv2): |
1188 and not self._usemanifestv2): |
1189 # If our first parent is in the manifest cache, we can |
1189 # If our first parent is in the manifest cache, we can |
1190 # compute a delta here using properties we know about the |
1190 # compute a delta here using properties we know about the |
1191 # manifest up-front, which may save time later for the |
1191 # manifest up-front, which may save time later for the |
1204 # The first parent manifest isn't already loaded, so we'll |
1204 # The first parent manifest isn't already loaded, so we'll |
1205 # just encode a fulltext of the manifest and pass that |
1205 # just encode a fulltext of the manifest and pass that |
1206 # through to the revlog layer, and let it handle the delta |
1206 # through to the revlog layer, and let it handle the delta |
1207 # process. |
1207 # process. |
1208 if self._treeondisk: |
1208 if self._treeondisk: |
1209 m1 = self.read(p1) |
1209 assert readtree, "readtree must be set for treemanifest writes" |
1210 m2 = self.read(p2) |
1210 m1 = readtree(self._dir, p1) |
1211 n = self._addtree(m, transaction, link, m1, m2) |
1211 m2 = readtree(self._dir, p2) |
|
1212 n = self._addtree(m, transaction, link, m1, m2, readtree) |
1212 arraytext = None |
1213 arraytext = None |
1213 else: |
1214 else: |
1214 text = m.text(self._usemanifestv2) |
1215 text = m.text(self._usemanifestv2) |
1215 n = self.addrevision(text, transaction, link, p1, p2) |
1216 n = self.addrevision(text, transaction, link, p1, p2) |
1216 arraytext = array.array('c', text) |
1217 arraytext = array.array('c', text) |
1218 if arraytext is not None: |
1219 if arraytext is not None: |
1219 self.fulltextcache[n] = arraytext |
1220 self.fulltextcache[n] = arraytext |
1220 |
1221 |
1221 return n |
1222 return n |
1222 |
1223 |
1223 def _addtree(self, m, transaction, link, m1, m2): |
1224 def _addtree(self, m, transaction, link, m1, m2, readtree): |
1224 # If the manifest is unchanged compared to one parent, |
1225 # If the manifest is unchanged compared to one parent, |
1225 # don't write a new revision |
1226 # don't write a new revision |
1226 if m.unmodifiedsince(m1) or m.unmodifiedsince(m2): |
1227 if m.unmodifiedsince(m1) or m.unmodifiedsince(m2): |
1227 return m.node() |
1228 return m.node() |
1228 def writesubtree(subm, subp1, subp2): |
1229 def writesubtree(subm, subp1, subp2): |
1229 sublog = self.dirlog(subm.dir()) |
1230 sublog = self.dirlog(subm.dir()) |
1230 sublog.add(subm, transaction, link, subp1, subp2, None, None) |
1231 sublog.add(subm, transaction, link, subp1, subp2, None, None, |
|
1232 readtree=readtree) |
1231 m.writesubtrees(m1, m2, writesubtree) |
1233 m.writesubtrees(m1, m2, writesubtree) |
1232 text = m.dirtext(self._usemanifestv2) |
1234 text = m.dirtext(self._usemanifestv2) |
1233 # Double-check whether contents are unchanged to one parent |
1235 # Double-check whether contents are unchanged to one parent |
1234 if text == m1.dirtext(self._usemanifestv2): |
1236 if text == m1.dirtext(self._usemanifestv2): |
1235 n = m1.node() |
1237 n = m1.node() |
1447 |
1449 |
1448 def read(self): |
1450 def read(self): |
1449 return self._treemanifest |
1451 return self._treemanifest |
1450 |
1452 |
1451 def write(self, transaction, link, p1, p2, added, removed): |
1453 def write(self, transaction, link, p1, p2, added, removed): |
|
1454 def readtree(dir, node): |
|
1455 return self._repo.manifestlog.get(dir, node).read() |
1452 return self._revlog().add(self._treemanifest, transaction, link, p1, p2, |
1456 return self._revlog().add(self._treemanifest, transaction, link, p1, p2, |
1453 added, removed) |
1457 added, removed, readtree=readtree) |
1454 |
1458 |
1455 class treemanifestctx(object): |
1459 class treemanifestctx(object): |
1456 def __init__(self, repo, dir, node): |
1460 def __init__(self, repo, dir, node): |
1457 self._repo = repo |
1461 self._repo = repo |
1458 self._dir = dir |
1462 self._dir = dir |