mercurial/manifest.py
changeset 30368 ed45283a0ca7
parent 30345 fa54f7ade491
child 30369 d79c141fdf41
equal deleted inserted replaced
30367:e193870eb680 30368:ed45283a0ca7
  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