comparison mercurial/manifest.py @ 29941:1cc93a154723

manifest: move dirlog up to manifestrevlog This removes dirlog and its associated cache from manifest and puts it in manifestrevlog. The notion of there being sub-logs is specific to the revlog implementation, and therefore belongs on the revlog class. This patch will enable future patches to move the serialization logic for manifests onto manifestrevlog, which will allow us to move manifest.add onto manifestlog in a way that it just calls out to manifestrevlog for the serialization.
author Durham Goode <durham@fb.com>
date Tue, 13 Sep 2016 16:00:41 -0700
parents fa145a205a7f
children 483003c27938
comparison
equal deleted inserted replaced
29940:fa145a205a7f 29941:1cc93a154723
894 894
895 class manifestrevlog(revlog.revlog): 895 class manifestrevlog(revlog.revlog):
896 '''A revlog that stores manifest texts. This is responsible for caching the 896 '''A revlog that stores manifest texts. This is responsible for caching the
897 full-text manifest contents. 897 full-text manifest contents.
898 ''' 898 '''
899 def __init__(self, opener, dir=''): 899 def __init__(self, opener, dir='', dirlogcache=None):
900 # During normal operations, we expect to deal with not more than four 900 # During normal operations, we expect to deal with not more than four
901 # revs at a time (such as during commit --amend). When rebasing large 901 # revs at a time (such as during commit --amend). When rebasing large
902 # stacks of commits, the number can go up, hence the config knob below. 902 # stacks of commits, the number can go up, hence the config knob below.
903 cachesize = 4 903 cachesize = 4
904 usetreemanifest = False 904 usetreemanifest = False
919 assert self._treeondisk, 'opts is %r' % opts 919 assert self._treeondisk, 'opts is %r' % opts
920 if not dir.endswith('/'): 920 if not dir.endswith('/'):
921 dir = dir + '/' 921 dir = dir + '/'
922 indexfile = "meta/" + dir + "00manifest.i" 922 indexfile = "meta/" + dir + "00manifest.i"
923 self._dir = dir 923 self._dir = dir
924 # The dirlogcache is kept on the root manifest log
925 if dir:
926 self._dirlogcache = dirlogcache
927 else:
928 self._dirlogcache = {'': self}
924 929
925 super(manifestrevlog, self).__init__(opener, indexfile) 930 super(manifestrevlog, self).__init__(opener, indexfile)
926 931
927 @property 932 @property
928 def fulltextcache(self): 933 def fulltextcache(self):
929 return self._fulltextcache 934 return self._fulltextcache
930 935
931 def clearcaches(self): 936 def clearcaches(self):
932 super(manifestrevlog, self).clearcaches() 937 super(manifestrevlog, self).clearcaches()
933 self._fulltextcache.clear() 938 self._fulltextcache.clear()
939 self._dirlogcache = {'': self}
940
941 def dirlog(self, dir):
942 if dir:
943 assert self._treeondisk
944 if dir not in self._dirlogcache:
945 self._dirlogcache[dir] = manifestrevlog(self.opener, dir,
946 self._dirlogcache)
947 return self._dirlogcache[dir]
934 948
935 class manifestlog(object): 949 class manifestlog(object):
936 """A collection class representing the collection of manifest snapshots 950 """A collection class representing the collection of manifest snapshots
937 referenced by commits in the repository. 951 referenced by commits in the repository.
938 952
1113 if opts is not None: 1127 if opts is not None:
1114 cachesize = opts.get('manifestcachesize', cachesize) 1128 cachesize = opts.get('manifestcachesize', cachesize)
1115 usetreemanifest = opts.get('treemanifest', usetreemanifest) 1129 usetreemanifest = opts.get('treemanifest', usetreemanifest)
1116 self._mancache = util.lrucachedict(cachesize) 1130 self._mancache = util.lrucachedict(cachesize)
1117 self._treeinmem = usetreemanifest 1131 self._treeinmem = usetreemanifest
1118 super(manifest, self).__init__(opener, dir=dir) 1132 super(manifest, self).__init__(opener, dir=dir, dirlogcache=dirlogcache)
1119 # The dirlogcache is kept on the root manifest log
1120 if dir:
1121 self._dirlogcache = dirlogcache
1122 else:
1123 self._dirlogcache = {'': self}
1124 1133
1125 def _newmanifest(self, data=''): 1134 def _newmanifest(self, data=''):
1126 if self._treeinmem: 1135 if self._treeinmem:
1127 return treemanifest(self._dir, data) 1136 return treemanifest(self._dir, data)
1128 return manifestdict(data) 1137 return manifestdict(data)
1129 1138
1130 def dirlog(self, dir): 1139 def dirlog(self, dir):
1140 """This overrides the base revlog implementation to allow construction
1141 'manifest' types instead of manifestrevlog types. This is only needed
1142 until we migrate off the 'manifest' type."""
1131 if dir: 1143 if dir:
1132 assert self._treeondisk 1144 assert self._treeondisk
1133 if dir not in self._dirlogcache: 1145 if dir not in self._dirlogcache:
1134 self._dirlogcache[dir] = manifest(self.opener, dir, 1146 self._dirlogcache[dir] = manifest(self.opener, dir,
1135 self._dirlogcache) 1147 self._dirlogcache)
1280 return n 1292 return n
1281 1293
1282 def clearcaches(self): 1294 def clearcaches(self):
1283 super(manifest, self).clearcaches() 1295 super(manifest, self).clearcaches()
1284 self._mancache.clear() 1296 self._mancache.clear()
1285 self._dirlogcache = {'': self}