comparison mercurial/bundlerepo.py @ 19629:81241f978fd2

bundlerevlog: extract 'baserevision' method This makes possible to use bundlerevlog class with subclasses of revlog that override revlog's 'revision' method. In particular this change is necessary to implement manifest compression, as it allows extension to replace manifest class and override 'revision' method there.
author Wojciech Lopata <lopek@fb.com>
date Mon, 26 Aug 2013 16:50:31 -0700
parents f0564402d059
children 49f2d5644f04
comparison
equal deleted inserted replaced
19628:3193b23eec61 19629:81241f978fd2
118 text = self._cache[2] 118 text = self._cache[2]
119 break 119 break
120 chain.append(iterrev) 120 chain.append(iterrev)
121 iterrev = self.index[iterrev][3] 121 iterrev = self.index[iterrev][3]
122 if text is None: 122 if text is None:
123 text = revlog.revlog.revision(self, iterrev) 123 text = self.baserevision(iterrev)
124 124
125 while chain: 125 while chain:
126 delta = self._chunk(chain.pop()) 126 delta = self._chunk(chain.pop())
127 text = mdiff.patches(text, [delta]) 127 text = mdiff.patches(text, [delta])
128 128
129 self._checkhash(text, node, rev) 129 self._checkhash(text, node, rev)
130 self._cache = (node, rev, text) 130 self._cache = (node, rev, text)
131 return text 131 return text
132
133 def baserevision(self, nodeorrev):
134 # Revlog subclasses may override 'revision' method to modify format of
135 # content retrieved from revlog. To use bundlerevlog with such class one
136 # needs to override 'baserevision' and make more specific call here.
137 return revlog.revlog.revision(self, nodeorrev)
132 138
133 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None): 139 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
134 raise NotImplementedError 140 raise NotImplementedError
135 def addgroup(self, revs, linkmapper, transaction): 141 def addgroup(self, revs, linkmapper, transaction):
136 raise NotImplementedError 142 raise NotImplementedError
144 changelog.changelog.__init__(self, opener) 150 changelog.changelog.__init__(self, opener)
145 linkmapper = lambda x: x 151 linkmapper = lambda x: x
146 bundlerevlog.__init__(self, opener, self.indexfile, bundle, 152 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
147 linkmapper) 153 linkmapper)
148 154
155 def baserevision(self, nodeorrev):
156 # Although changelog doesn't override 'revision' method, some extensions
157 # may replace this class with another that does. Same story with
158 # manifest and filelog classes.
159 return changelog.changelog.revision(self, nodeorrev)
160
149 class bundlemanifest(bundlerevlog, manifest.manifest): 161 class bundlemanifest(bundlerevlog, manifest.manifest):
150 def __init__(self, opener, bundle, linkmapper): 162 def __init__(self, opener, bundle, linkmapper):
151 manifest.manifest.__init__(self, opener) 163 manifest.manifest.__init__(self, opener)
152 bundlerevlog.__init__(self, opener, self.indexfile, bundle, 164 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
153 linkmapper) 165 linkmapper)
166
167 def baserevision(self, nodeorrev):
168 return manifest.manifest.revision(self, nodeorrev)
154 169
155 class bundlefilelog(bundlerevlog, filelog.filelog): 170 class bundlefilelog(bundlerevlog, filelog.filelog):
156 def __init__(self, opener, path, bundle, linkmapper, repo): 171 def __init__(self, opener, path, bundle, linkmapper, repo):
157 filelog.filelog.__init__(self, opener, path) 172 filelog.filelog.__init__(self, opener, path)
158 bundlerevlog.__init__(self, opener, self.indexfile, bundle, 173 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
159 linkmapper) 174 linkmapper)
160 self._repo = repo 175 self._repo = repo
176
177 def baserevision(self, nodeorrev):
178 return filelog.filelog.revision(self, nodeorrev)
161 179
162 def _file(self, f): 180 def _file(self, f):
163 self._repo.file(f) 181 self._repo.file(f)
164 182
165 class bundlepeer(localrepo.localpeer): 183 class bundlepeer(localrepo.localpeer):