mercurial/manifest.py
changeset 29926 be16091ac14d
parent 29916 8a658b8b795a
child 29938 a059b17352ef
equal deleted inserted replaced
29925:1619efcde9a4 29926:be16091ac14d
   960             m = manifestctx(self._revlog, node)
   960             m = manifestctx(self._revlog, node)
   961         if node != revlog.nullid:
   961         if node != revlog.nullid:
   962             self._mancache[node] = m
   962             self._mancache[node] = m
   963         return m
   963         return m
   964 
   964 
   965 class manifestctx(manifestdict):
   965 class manifestctx(object):
   966     """A class representing a single revision of a manifest, including its
   966     """A class representing a single revision of a manifest, including its
   967     contents, its parent revs, and its linkrev.
   967     contents, its parent revs, and its linkrev.
   968     """
   968     """
   969     def __init__(self, revlog, node):
   969     def __init__(self, revlog, node):
   970         self._revlog = revlog
   970         self._revlog = revlog
       
   971         self._data = None
   971 
   972 
   972         self._node = node
   973         self._node = node
   973 
   974 
   974         # TODO: We eventually want p1, p2, and linkrev exposed on this class,
   975         # TODO: We eventually want p1, p2, and linkrev exposed on this class,
   975         # but let's add it later when something needs it and we can load it
   976         # but let's add it later when something needs it and we can load it
   976         # lazily.
   977         # lazily.
   977         #self.p1, self.p2 = revlog.parents(node)
   978         #self.p1, self.p2 = revlog.parents(node)
   978         #rev = revlog.rev(node)
   979         #rev = revlog.rev(node)
   979         #self.linkrev = revlog.linkrev(rev)
   980         #self.linkrev = revlog.linkrev(rev)
   980 
   981 
   981         # This should eventually be made lazy loaded, so consumers can access
       
   982         # the node/p1/linkrev data without having to parse the whole manifest.
       
   983         data = revlog.revision(node)
       
   984         arraytext = array.array('c', data)
       
   985         revlog._fulltextcache[node] = arraytext
       
   986         super(manifestctx, self).__init__(data)
       
   987 
       
   988     def node(self):
   982     def node(self):
   989         return self._node
   983         return self._node
   990 
   984 
   991 class treemanifestctx(treemanifest):
   985     def read(self):
       
   986         if not self._data:
       
   987             if self._node == revlog.nullid:
       
   988                 self._data = manifestdict()
       
   989             else:
       
   990                 text = self._revlog.revision(self._node)
       
   991                 arraytext = array.array('c', text)
       
   992                 self._revlog._fulltextcache[self._node] = arraytext
       
   993                 self._data = manifestdict(text)
       
   994         return self._data
       
   995 
       
   996 class treemanifestctx(object):
   992     def __init__(self, revlog, dir, node):
   997     def __init__(self, revlog, dir, node):
   993         revlog = revlog.dirlog(dir)
   998         revlog = revlog.dirlog(dir)
   994         self._revlog = revlog
   999         self._revlog = revlog
   995         self._dir = dir
  1000         self._dir = dir
       
  1001         self._data = None
   996 
  1002 
   997         self._node = node
  1003         self._node = node
   998 
  1004 
   999         # TODO: Load p1/p2/linkrev lazily. They need to be lazily loaded so that
  1005         # TODO: Load p1/p2/linkrev lazily. They need to be lazily loaded so that
  1000         # we can instantiate treemanifestctx objects for directories we don't
  1006         # we can instantiate treemanifestctx objects for directories we don't
  1001         # have on disk.
  1007         # have on disk.
  1002         #self.p1, self.p2 = revlog.parents(node)
  1008         #self.p1, self.p2 = revlog.parents(node)
  1003         #rev = revlog.rev(node)
  1009         #rev = revlog.rev(node)
  1004         #self.linkrev = revlog.linkrev(rev)
  1010         #self.linkrev = revlog.linkrev(rev)
  1005 
  1011 
  1006         if revlog._treeondisk:
  1012     def read(self):
  1007             super(treemanifestctx, self).__init__(dir=dir)
  1013         if not self._data:
  1008             def gettext():
  1014             if self._node == revlog.nullid:
  1009                 return revlog.revision(node)
  1015                 self._data = treemanifest()
  1010             def readsubtree(dir, subm):
  1016             elif self._revlog._treeondisk:
  1011                 return revlog.dirlog(dir).read(subm)
  1017                 m = treemanifest(dir=self._dir)
  1012             self.read(gettext, readsubtree)
  1018                 def gettext():
  1013             self.setnode(node)
  1019                     return self._revlog.revision(self._node)
  1014         else:
  1020                 def readsubtree(dir, subm):
  1015             text = revlog.revision(node)
  1021                     return treemanifestctx(self._revlog, dir, subm).read()
  1016             arraytext = array.array('c', text)
  1022                 m.read(gettext, readsubtree)
  1017             revlog.fulltextcache[node] = arraytext
  1023                 m.setnode(self._node)
  1018             super(treemanifestctx, self).__init__(dir=dir, text=text)
  1024                 self._data = m
       
  1025             else:
       
  1026                 text = self._revlog.revision(self._node)
       
  1027                 arraytext = array.array('c', text)
       
  1028                 self._revlog.fulltextcache[self._node] = arraytext
       
  1029                 self._data = treemanifest(dir=self._dir, text=text)
       
  1030 
       
  1031         return self._data
  1019 
  1032 
  1020     def node(self):
  1033     def node(self):
  1021         return self._node
  1034         return self._node
  1022 
  1035 
  1023 class manifest(manifestrevlog):
  1036 class manifest(manifestrevlog):
  1128 
  1141 
  1129     def read(self, node):
  1142     def read(self, node):
  1130         if node == revlog.nullid:
  1143         if node == revlog.nullid:
  1131             return self._newmanifest() # don't upset local cache
  1144             return self._newmanifest() # don't upset local cache
  1132         if node in self._mancache:
  1145         if node in self._mancache:
  1133             return self._mancache[node]
  1146             cached = self._mancache[node]
       
  1147             if (isinstance(cached, manifestctx) or
       
  1148                 isinstance(cached, treemanifestctx)):
       
  1149                 cached = cached.read()
       
  1150             return cached
  1134         if self._treeondisk:
  1151         if self._treeondisk:
  1135             def gettext():
  1152             def gettext():
  1136                 return self.revision(node)
  1153                 return self.revision(node)
  1137             def readsubtree(dir, subm):
  1154             def readsubtree(dir, subm):
  1138                 return self.dirlog(dir).read(subm)
  1155                 return self.dirlog(dir).read(subm)