# HG changeset patch # User Brendan Cully # Date 1188254901 25200 # Node ID a35756389ef4c86a88ac96e23c03ad80b8911775 # Parent a4547dfbbf206c68a93d40a9788ed5d47d002e7a Make bundlerepo lazier This allows the localbranch extension to override sopener in time. diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py +++ b/mercurial/bundlerepo.py @@ -193,18 +193,19 @@ class bundlerepository(localrepo.localre else: raise util.Abort(_("%s: unknown bundle compression type") % bundlename) - self.changelog = bundlechangelog(self.sopener, self.bundlefile) - self.manifest = bundlemanifest(self.sopener, self.bundlefile, - self.changelog.rev) # dict with the mapping 'filename' -> position in the bundle self.bundlefilespos = {} - while 1: - f = changegroup.getchunk(self.bundlefile) - if not f: - break - self.bundlefilespos[f] = self.bundlefile.tell() - for c in changegroup.chunkiter(self.bundlefile): - pass + + def __getattr__(self, name): + if name == 'changelog': + self.changelog = bundlechangelog(self.sopener, self.bundlefile) + return self.changelog + if name == 'manifest': + self.manifest = bundlemanifest(self.sopener, self.bundlefile, + self.changelog.rev) + self.filestart = self.bundlefile.tell() + return self.manifest + return localrepo.localrepository.__getattr__(self, name) def url(self): return self._url @@ -213,6 +214,17 @@ class bundlerepository(localrepo.localre return -1 def file(self, f): + if not self.bundlefilespos: + self.manifest + self.bundlefile.seek(self.filestart) + while 1: + chunk = changegroup.getchunk(self.bundlefile) + if not chunk: + break + self.bundlefilespos[chunk] = self.bundlefile.tell() + for c in changegroup.chunkiter(self.bundlefile): + pass + if f[0] == '/': f = f[1:] if f in self.bundlefilespos: