Show More
@@ -504,6 +504,10 b' class localrepository(object):' | |||
|
504 | 504 | def manifest(self): |
|
505 | 505 | return manifest.manifest(self.svfs) |
|
506 | 506 | |
|
507 | @storecache('00manifest.i') | |
|
508 | def manifestlog(self): | |
|
509 | return manifest.manifestlog(self.svfs, self.manifest) | |
|
510 | ||
|
507 | 511 | @repofilecache('dirstate') |
|
508 | 512 | def dirstate(self): |
|
509 | 513 | return dirstate.dirstate(self.vfs, self.ui, self.root, |
@@ -914,6 +914,70 b' class manifestrevlog(revlog.revlog):' | |||
|
914 | 914 | super(manifestrevlog, self).clearcaches() |
|
915 | 915 | self._fulltextcache.clear() |
|
916 | 916 | |
|
917 | class manifestlog(object): | |
|
918 | """A collection class representing the collection of manifest snapshots | |
|
919 | referenced by commits in the repository. | |
|
920 | ||
|
921 | In this situation, 'manifest' refers to the abstract concept of a snapshot | |
|
922 | of the list of files in the given commit. Consumers of the output of this | |
|
923 | class do not care about the implementation details of the actual manifests | |
|
924 | they receive (i.e. tree or flat or lazily loaded, etc).""" | |
|
925 | def __init__(self, opener, oldmanifest): | |
|
926 | self._revlog = oldmanifest | |
|
927 | ||
|
928 | # We'll separate this into it's own cache once oldmanifest is no longer | |
|
929 | # used | |
|
930 | self._mancache = oldmanifest._mancache | |
|
931 | ||
|
932 | # _revlog is the same as _oldmanifest right now, but we eventually want | |
|
933 | # to delete _oldmanifest while still allowing manifestlog to access the | |
|
934 | # revlog specific apis. | |
|
935 | self._oldmanifest = oldmanifest | |
|
936 | ||
|
937 | def __getitem__(self, node): | |
|
938 | """Retrieves the manifest instance for the given node. Throws a KeyError | |
|
939 | if not found. | |
|
940 | """ | |
|
941 | if (self._oldmanifest._treeondisk | |
|
942 | or self._oldmanifest._treeinmem): | |
|
943 | # TODO: come back and support tree manifests directly | |
|
944 | return self._oldmanifest.read(node) | |
|
945 | ||
|
946 | if node == revlog.nullid: | |
|
947 | return manifestdict() | |
|
948 | if node in self._mancache: | |
|
949 | cachemf = self._mancache[node] | |
|
950 | # The old manifest may put non-ctx manifests in the cache, so skip | |
|
951 | # those since they don't implement the full api. | |
|
952 | if isinstance(cachemf, manifestctx): | |
|
953 | return cachemf | |
|
954 | ||
|
955 | m = manifestctx(self._revlog, node) | |
|
956 | self._mancache[node] = m | |
|
957 | return m | |
|
958 | ||
|
959 | class manifestctx(manifestdict): | |
|
960 | """A class representing a single revision of a manifest, including its | |
|
961 | contents, its parent revs, and its linkrev. | |
|
962 | """ | |
|
963 | def __init__(self, revlog, node): | |
|
964 | self._revlog = revlog | |
|
965 | ||
|
966 | self._node = node | |
|
967 | self.p1, self.p2 = revlog.parents(node) | |
|
968 | rev = revlog.rev(node) | |
|
969 | self.linkrev = revlog.linkrev(rev) | |
|
970 | ||
|
971 | # This should eventually be made lazy loaded, so consumers can access | |
|
972 | # the node/p1/linkrev data without having to parse the whole manifest. | |
|
973 | data = revlog.revision(node) | |
|
974 | arraytext = array.array('c', data) | |
|
975 | revlog._fulltextcache[node] = arraytext | |
|
976 | super(manifestctx, self).__init__(data) | |
|
977 | ||
|
978 | def node(self): | |
|
979 | return self._node | |
|
980 | ||
|
917 | 981 | class manifest(manifestrevlog): |
|
918 | 982 | def __init__(self, opener, dir='', dirlogcache=None): |
|
919 | 983 | '''The 'dir' and 'dirlogcache' arguments are for internal use by |
General Comments 0
You need to be logged in to leave comments.
Login now