mercurial/manifest.py
changeset 25185 bf6b476f3b36
parent 25151 6eb4bdad198f
child 25188 2773540c3650
equal deleted inserted replaced
25184:819cd397e306 25185:bf6b476f3b36
   794             if subp1 == revlog.nullid:
   794             if subp1 == revlog.nullid:
   795                 subp1, subp2 = subp2, subp1
   795                 subp1, subp2 = subp2, subp1
   796             writesubtree(subm, subp1, subp2)
   796             writesubtree(subm, subp1, subp2)
   797 
   797 
   798 class manifest(revlog.revlog):
   798 class manifest(revlog.revlog):
   799     def __init__(self, opener, dir=''):
   799     def __init__(self, opener, dir='', dirlogcache=None):
       
   800         '''The 'dir' and 'dirlogcache' arguments are for internal use by
       
   801         manifest.manifest only. External users should create a root manifest
       
   802         log with manifest.manifest(opener) and call dirlog() on it.
       
   803         '''
   800         # During normal operations, we expect to deal with not more than four
   804         # During normal operations, we expect to deal with not more than four
   801         # revs at a time (such as during commit --amend). When rebasing large
   805         # revs at a time (such as during commit --amend). When rebasing large
   802         # stacks of commits, the number can go up, hence the config knob below.
   806         # stacks of commits, the number can go up, hence the config knob below.
   803         cachesize = 4
   807         cachesize = 4
   804         usetreemanifest = False
   808         usetreemanifest = False
   818             if not dir.endswith('/'):
   822             if not dir.endswith('/'):
   819                 dir = dir + '/'
   823                 dir = dir + '/'
   820             indexfile = "meta/" + dir + "00manifest.i"
   824             indexfile = "meta/" + dir + "00manifest.i"
   821         revlog.revlog.__init__(self, opener, indexfile)
   825         revlog.revlog.__init__(self, opener, indexfile)
   822         self._dir = dir
   826         self._dir = dir
       
   827         # The dirlogcache is kept on the root manifest log
       
   828         if dir:
       
   829             self._dirlogcache = dirlogcache
       
   830         else:
       
   831             self._dirlogcache = {'': self}
   823 
   832 
   824     def _newmanifest(self, data=''):
   833     def _newmanifest(self, data=''):
   825         if self._treeinmem:
   834         if self._treeinmem:
   826             return treemanifest(self._dir, data)
   835             return treemanifest(self._dir, data)
   827         return manifestdict(data)
   836         return manifestdict(data)
       
   837 
       
   838     def dirlog(self, dir):
       
   839         assert self._treeondisk
       
   840         if dir not in self._dirlogcache:
       
   841             self._dirlogcache[dir] = manifest(self.opener, dir,
       
   842                                               self._dirlogcache)
       
   843         return self._dirlogcache[dir]
   828 
   844 
   829     def _slowreaddelta(self, node):
   845     def _slowreaddelta(self, node):
   830         r0 = self.deltaparent(self.rev(node))
   846         r0 = self.deltaparent(self.rev(node))
   831         m0 = self.read(self.node(r0))
   847         m0 = self.read(self.node(r0))
   832         m1 = self.read(node)
   848         m1 = self.read(node)
   865         if node in self._mancache:
   881         if node in self._mancache:
   866             return self._mancache[node][0]
   882             return self._mancache[node][0]
   867         text = self.revision(node)
   883         text = self.revision(node)
   868         if self._treeondisk:
   884         if self._treeondisk:
   869             def readsubtree(dir, subm):
   885             def readsubtree(dir, subm):
   870                 sublog = manifest(self.opener, dir)
   886                 return self.dirlog(dir).read(subm)
   871                 return sublog.read(subm)
       
   872             m = self._newmanifest()
   887             m = self._newmanifest()
   873             m.parse(text, readsubtree)
   888             m.parse(text, readsubtree)
   874             m.setnode(node)
   889             m.setnode(node)
   875             arraytext = None
   890             arraytext = None
   876         else:
   891         else:
   927 
   942 
   928         return n
   943         return n
   929 
   944 
   930     def _addtree(self, m, transaction, link, m1, m2):
   945     def _addtree(self, m, transaction, link, m1, m2):
   931         def writesubtree(subm, subp1, subp2):
   946         def writesubtree(subm, subp1, subp2):
   932             sublog = manifest(self.opener, subm.dir())
   947             sublog = self.dirlog(subm.dir())
   933             sublog.add(subm, transaction, link, subp1, subp2, None, None)
   948             sublog.add(subm, transaction, link, subp1, subp2, None, None)
   934         m.writesubtrees(m1, m2, writesubtree)
   949         m.writesubtrees(m1, m2, writesubtree)
   935         text = m.dirtext(self._usemanifestv2)
   950         text = m.dirtext(self._usemanifestv2)
   936         # If the manifest is unchanged compared to one parent,
   951         # If the manifest is unchanged compared to one parent,
   937         # don't write a new revision
   952         # don't write a new revision