comparison mercurial/bundlerepo.py @ 5258:a35756389ef4

Make bundlerepo lazier This allows the localbranch extension to override sopener in time.
author Brendan Cully <brendan@kublai.com>
date Mon, 27 Aug 2007 15:48:21 -0700
parents aba624d2301d
children 8040f2e4cad0
comparison
equal deleted inserted replaced
5257:a4547dfbbf20 5258:a35756389ef4
191 # nothing to do 191 # nothing to do
192 pass 192 pass
193 else: 193 else:
194 raise util.Abort(_("%s: unknown bundle compression type") 194 raise util.Abort(_("%s: unknown bundle compression type")
195 % bundlename) 195 % bundlename)
196 self.changelog = bundlechangelog(self.sopener, self.bundlefile)
197 self.manifest = bundlemanifest(self.sopener, self.bundlefile,
198 self.changelog.rev)
199 # dict with the mapping 'filename' -> position in the bundle 196 # dict with the mapping 'filename' -> position in the bundle
200 self.bundlefilespos = {} 197 self.bundlefilespos = {}
201 while 1: 198
202 f = changegroup.getchunk(self.bundlefile) 199 def __getattr__(self, name):
203 if not f: 200 if name == 'changelog':
204 break 201 self.changelog = bundlechangelog(self.sopener, self.bundlefile)
205 self.bundlefilespos[f] = self.bundlefile.tell() 202 return self.changelog
206 for c in changegroup.chunkiter(self.bundlefile): 203 if name == 'manifest':
207 pass 204 self.manifest = bundlemanifest(self.sopener, self.bundlefile,
205 self.changelog.rev)
206 self.filestart = self.bundlefile.tell()
207 return self.manifest
208 return localrepo.localrepository.__getattr__(self, name)
208 209
209 def url(self): 210 def url(self):
210 return self._url 211 return self._url
211 212
212 def dev(self): 213 def dev(self):
213 return -1 214 return -1
214 215
215 def file(self, f): 216 def file(self, f):
217 if not self.bundlefilespos:
218 self.manifest
219 self.bundlefile.seek(self.filestart)
220 while 1:
221 chunk = changegroup.getchunk(self.bundlefile)
222 if not chunk:
223 break
224 self.bundlefilespos[chunk] = self.bundlefile.tell()
225 for c in changegroup.chunkiter(self.bundlefile):
226 pass
227
216 if f[0] == '/': 228 if f[0] == '/':
217 f = f[1:] 229 f = f[1:]
218 if f in self.bundlefilespos: 230 if f in self.bundlefilespos:
219 self.bundlefile.seek(self.bundlefilespos[f]) 231 self.bundlefile.seek(self.bundlefilespos[f])
220 return bundlefilelog(self.sopener, f, self.bundlefile, 232 return bundlefilelog(self.sopener, f, self.bundlefile,