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) |