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