Rev 2137: Only try to get real repositories when an operation requires them. in file:///home/robertc/source/baz/hpss/

Robert Collins robertc at robertcollins.net
Sat Feb 3 18:57:32 GMT 2007


------------------------------------------------------------
revno: 2137
revision-id: robertc at robertcollins.net-20070203185724-i6gudgl39nbv1qa8
parent: robertc at robertcollins.net-20070203173724-gswe95wx03oqkjum
committer: Robert Collins <robertc at robertcollins.net>
branch nick: hpss
timestamp: Sun 2007-02-04 05:57:24 +1100
message:
  Only try to get real repositories when an operation requires them.
modified:
  bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py	2007-02-03 16:04:53 +0000
+++ b/bzrlib/remote.py	2007-02-03 18:57:24 +0000
@@ -49,12 +49,9 @@
         # to talk to the other side
         # XXX: We should go into find_format, but not allow it to find
         # RemoteBzrDirFormat and make sure it finds the real underlying format.
+        self._real_bzrdir = None
         
-        # THIS IS A COMPLETE AND UTTER LIE.
-        # XXX: XXX: XXX: must be removed before merging to mainline
-        # SMART_SERVER_MERGE_BLOCKER
-        default_format = BzrDirFormat.get_default_format()
-        self._real_bzrdir = default_format.open(transport, _found=True)
+        self._ensure_real()
         smartclient = client.SmartClient(self.client)
         path = self._path_for_remote_call(smartclient)
         #self._real_bzrdir._format.probe_transport(transport)
@@ -62,15 +59,23 @@
         if response == ('no',):
             raise errors.NotBranchError(path=transport.base)
 
+    def _ensure_real(self):
+        """Ensure that there is a _real_bzrdir set.
+
+        used before calls to self._real_bzrdir.
+        """
+        if not self._real_bzrdir:
+            default_format = BzrDirFormat.get_default_format()
+            self._real_bzrdir = default_format.open(self.root_transport,
+                _found=True)
+
     def create_repository(self, shared=False):
         return RemoteRepository(
             self, self._real_bzrdir.create_repository(shared=shared))
 
     def create_branch(self):
         real_branch = self._real_bzrdir.create_branch()
-        real_repository = real_branch.repository
-        remote_repository = RemoteRepository(self, real_repository)
-        return RemoteBranch(self, remote_repository, real_branch)
+        return RemoteBranch(self, self.find_repository(), real_branch)
 
     def create_workingtree(self, revision_id=None):
         real_workingtree = self._real_bzrdir.create_workingtree(revision_id=revision_id)
@@ -87,18 +92,7 @@
             raise errors.NotBranchError(path=self.root_transport.base)
         if response[1] == '':
             # branch at this location.
-            if vfs.vfs_enabled():
-                # if the VFS is enabled, create a local object using the VFS.
-                real_branch = self._real_bzrdir.open_branch(unsupported=_unsupported)
-                # This branch accessed through the smart server, so wrap the
-                # file-level objects.
-                real_repository = real_branch.repository
-                remote_repository = self.find_repository()
-                remote_repository._real_repository = real_repository
-                return RemoteBranch(self, remote_repository, real_branch)
-            else:
-                # otherwise just create a proxy for the branch.
-                return RemoteBranch(self, self.find_repository())
+            return RemoteBranch(self, self.find_repository())
         else:
             # a branch reference, use the existing BranchReference logic.
             format = BranchReferenceFormat()
@@ -113,10 +107,7 @@
         if response[0] == 'norepository':
             raise errors.NoRepositoryPresent(self)
         if response[1] == '':
-            if vfs.vfs_enabled():
-                return RemoteRepository(self, self._real_bzrdir.open_repository())
-            else:
-                return RemoteRepository(self)
+            return RemoteRepository(self)
         else:
             raise errors.NoRepositoryPresent(self)
 
@@ -190,6 +181,8 @@
         """
         if real_repository:
             self._real_repository = real_repository
+        else:
+            self._real_repository = None
         self.bzrdir = remote_bzrdir
         if _client is None:
             self._client = client.SmartClient(self.bzrdir.client)
@@ -197,6 +190,15 @@
             self._client = _client
         self._format = RemoteRepositoryFormat()
 
+    def _ensure_real(self):
+        """Ensure that there is a _real_repository set.
+
+        used before calls to self._real_repository.
+        """
+        if not self._real_repository:
+            self.bzrdir._ensure_real()
+            self._real_repository = self.bzrdir._real_bzrdir.open_repository()
+
     def get_revision_graph(self, revision_id=None):
         """See Repository.get_revision_graph()."""
         if revision_id is None:
@@ -271,11 +273,13 @@
 
     def lock_read(self):
         # wrong eventually - want a local lock cache context
+        self._ensure_real()
         return self._real_repository.lock_read()
 
     def lock_write(self):
         # definately wrong: want to check if there is a real repo
         # and not thunk through if not
+        self._ensure_real()
         return self._real_repository.lock_write()
 
     def unlock(self):
@@ -285,6 +289,7 @@
     def break_lock(self):
         # should hand off to the network - or better yet, we should not
         # allow stale network locks ?
+        self._ensure_real()
         return self._real_repository.break_lock()
 
 
@@ -349,26 +354,47 @@
         self.repository = remote_repository
         if real_branch is not None:
             self._real_branch = real_branch
+        else:
+            self._real_branch = None
         # Fill out expected attributes of branch for bzrlib api users.
         self._format = RemoteBranchFormat()
         self.base = self.bzrdir.root_transport.base
         self.control_files = RemoteBranchLockableFiles(self.bzrdir, self._client)
 
+    def _ensure_real(self):
+        """Ensure that there is a _real_branch set.
+
+        used before calls to self._real_branch.
+        """
+        if not self._real_branch:
+            assert vfs.vfs_enabled()
+            self.bzrdir._ensure_real()
+            self._real_branch = self.bzrdir._real_bzrdir.open_branch()
+            # give the repository the matching file level repo.
+            self.repository._real_repository = self._real_branch.repository
+            # give the branch the remote repository to let fast-pathing happen
+            self._real_branch.repository = self.repository
+
     def get_physical_lock_status(self):
         """See Branch.get_physical_lock_status()."""
         # should be an API call to the server, as branches must be lockable.
+        self._ensure_real()
         return self._real_branch.get_physical_lock_status()
 
     def lock_read(self):
+        self._ensure_real()
         return self._real_branch.lock_read()
 
     def lock_write(self):
+        self._ensure_real()
         return self._real_branch.lock_write()
 
     def unlock(self):
+        self._ensure_real()
         return self._real_branch.unlock()
 
     def break_lock(self):
+        self._ensure_real()
         return self._real_branch.break_lock()
 
     def last_revision_info(self):
@@ -396,12 +422,15 @@
         return result
 
     def set_revision_history(self, rev_history):
+        self._ensure_real()
         return self._real_branch.set_revision_history(rev_history)
 
     def get_parent(self):
+        self._ensure_real()
         return self._real_branch.get_parent()
         
     def set_parent(self, url):
+        self._ensure_real()
         return self._real_branch.set_parent(url)
         
 



More information about the bazaar-commits mailing list