changeset 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 a4547dfbbf20
children 8040f2e4cad0
files mercurial/bundlerepo.py
diffstat 1 files changed, 22 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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: