Rev 6311: (jelmer) Reduce the number of connections made during "bzr branch in file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

Patch Queue Manager pqm at pqm.ubuntu.com
Mon Nov 28 10:33:41 UTC 2011


At file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 6311 [merge]
revision-id: pqm at pqm.ubuntu.com-20111128103340-4fwv8lav4ksmehbs
parent: pqm at pqm.ubuntu.com-20111128050740-md31i70uhigil8mq
parent: jelmer at samba.org-20111127232042-n3z9khon9fcq8dm8
committer: Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2011-11-28 10:33:40 +0000
message:
  (jelmer) Reduce the number of connections made during "bzr branch
   --stacked". (Jelmer Vernooij)
modified:
  bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/controldir.py           controldir.py-20100802102926-hvtvh0uae5epuibp-1
  bzrlib/plugins/weave_fmt/branch.py branch_weave.py-20110303112759-greg4a9dt5pent0m-1
  bzrlib/plugins/weave_fmt/bzrdir.py bzrdir_weave.py-20110310114200-ndz63gzqll03nf4z-1
  bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
  bzrlib/tests/test_branch.py    test_branch.py-20060116013032-97819aa07b8ab3b5
  bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
  bzrlib/tests/test_foreign.py   test_foreign.py-20081125004048-ywb901edgp9lluxo-1
  bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
  doc/en/release-notes/bzr-2.5.txt bzr2.5.txt-20110708125756-587p0hpw7oke4h05-1
=== modified file 'bzrlib/branch.py'
--- a/bzrlib/branch.py	2011-11-22 11:48:31 +0000
+++ b/bzrlib/branch.py	2011-11-27 17:50:41 +0000
@@ -86,7 +86,7 @@
     def user_transport(self):
         return self.bzrdir.user_transport
 
-    def __init__(self, *ignored, **ignored_too):
+    def __init__(self, possible_transports=None):
         self.tags = self._format.make_tags(self)
         self._revision_history_cache = None
         self._revision_id_to_revno_cache = None
@@ -96,15 +96,15 @@
         self._last_revision_info_cache = None
         self._master_branch_cache = None
         self._merge_sorted_revisions_cache = None
-        self._open_hook()
+        self._open_hook(possible_transports)
         hooks = Branch.hooks['open']
         for hook in hooks:
             hook(self)
 
-    def _open_hook(self):
+    def _open_hook(self, possible_transports):
         """Called by init to allow simpler extension of the base class."""
 
-    def _activate_fallback_location(self, url):
+    def _activate_fallback_location(self, url, possible_transports):
         """Activate the branch/repository from url as a fallback repository."""
         for existing_fallback_repo in self.repository._fallback_repositories:
             if existing_fallback_repo.user_url == url:
@@ -113,7 +113,7 @@
                 # confusing _unstack we don't add this a second time.
                 mutter('duplicate activation of fallback %r on %r', url, self)
                 return
-        repo = self._get_fallback_repository(url)
+        repo = self._get_fallback_repository(url, possible_transports)
         if repo.has_same_location(self.repository):
             raise errors.UnstackableLocationError(self.user_url, url)
         self.repository.add_fallback_repository(repo)
@@ -175,13 +175,16 @@
         """
         control = controldir.ControlDir.open(base, _unsupported,
                                      possible_transports=possible_transports)
-        return control.open_branch(unsupported=_unsupported)
+        return control.open_branch(unsupported=_unsupported,
+            possible_transports=possible_transports)
 
     @staticmethod
-    def open_from_transport(transport, name=None, _unsupported=False):
+    def open_from_transport(transport, name=None, _unsupported=False,
+            possible_transports=None):
         """Open the branch rooted at transport"""
         control = controldir.ControlDir.open_from_transport(transport, _unsupported)
-        return control.open_branch(name=name, unsupported=_unsupported)
+        return control.open_branch(name=name, unsupported=_unsupported,
+            possible_transports=possible_transports)
 
     @staticmethod
     def open_containing(url, possible_transports=None):
@@ -197,7 +200,8 @@
         """
         control, relpath = controldir.ControlDir.open_containing(url,
                                                          possible_transports)
-        return control.open_branch(), relpath
+        branch = control.open_branch(possible_transports=possible_transports)
+        return (branch, relpath)
 
     def _push_should_merge_tags(self):
         """Should _basic_push merge this branch's tags into the target?
@@ -239,11 +243,10 @@
         """
         raise NotImplementedError(self._get_config)
 
-    def _get_fallback_repository(self, url):
+    def _get_fallback_repository(self, url, possible_transports):
         """Get the repository we fallback to at url."""
         url = urlutils.join(self.base, url)
-        a_branch = Branch.open(url,
-            possible_transports=[self.bzrdir.root_transport])
+        a_branch = Branch.open(url, possible_transports=possible_transports)
         return a_branch.repository
 
     @needs_read_lock
@@ -851,7 +854,8 @@
                 return
             self._unstack()
         else:
-            self._activate_fallback_location(url)
+            self._activate_fallback_location(url,
+                possible_transports=[self.bzrdir.root_transport])
         # write this out after the repository is stacked to avoid setting a
         # stacked config that doesn't work.
         self._set_config_location('stacked_on_location', url)
@@ -1717,7 +1721,7 @@
         raise NotImplementedError(self.network_name)
 
     def open(self, controldir, name=None, _found=False, ignore_fallbacks=False,
-            found_repository=None):
+            found_repository=None, possible_transports=None):
         """Return the branch object for controldir.
 
         :param controldir: A ControlDir that contains a branch.
@@ -2065,7 +2069,7 @@
         return self.get_format_string()
 
     def open(self, a_bzrdir, name=None, _found=False, ignore_fallbacks=False,
-            found_repository=None):
+            found_repository=None, possible_transports=None):
         """See BranchFormat.open()."""
         if not _found:
             format = BranchFormat.find_format(a_bzrdir, name=name)
@@ -2083,7 +2087,8 @@
                               name=name,
                               a_bzrdir=a_bzrdir,
                               _repository=found_repository,
-                              ignore_fallbacks=ignore_fallbacks)
+                              ignore_fallbacks=ignore_fallbacks,
+                              possible_transports=possible_transports)
         except errors.NoSuchFile:
             raise errors.NotBranchError(path=transport.base, bzrdir=a_bzrdir)
 
@@ -2345,7 +2350,8 @@
         real_bzrdir = controldir.ControlDir.open(
             location, possible_transports=possible_transports)
         result = real_bzrdir.open_branch(name=name, 
-            ignore_fallbacks=ignore_fallbacks)
+            ignore_fallbacks=ignore_fallbacks,
+            possible_transports=possible_transports)
         # this changes the behaviour of result.clone to create a new reference
         # rather than a copy of the content of the branch.
         # I did not use a proxy object because that needs much more extensive
@@ -2432,7 +2438,8 @@
 
     def __init__(self, _format=None,
                  _control_files=None, a_bzrdir=None, name=None,
-                 _repository=None, ignore_fallbacks=False):
+                 _repository=None, ignore_fallbacks=False,
+                 possible_transports=None):
         """Create new branch object at a particular location."""
         if a_bzrdir is None:
             raise ValueError('a_bzrdir must be supplied')
@@ -2450,7 +2457,7 @@
         self.control_files = _control_files
         self._transport = _control_files._transport
         self.repository = _repository
-        Branch.__init__(self)
+        Branch.__init__(self, possible_transports)
 
     def __str__(self):
         return '%s(%s)' % (self.__class__.__name__, self.user_url)
@@ -2819,9 +2826,11 @@
 class BzrBranch8(BzrBranch):
     """A branch that stores tree-reference locations."""
 
-    def _open_hook(self):
+    def _open_hook(self, possible_transports=None):
         if self._ignore_fallbacks:
             return
+        if possible_transports is None:
+            possible_transports = [self.bzrdir.root_transport]
         try:
             url = self.get_stacked_on_url()
         except (errors.UnstackableRepositoryFormat, errors.NotStacked,
@@ -2835,7 +2844,8 @@
                     raise AssertionError(
                         "'transform_fallback_location' hook %s returned "
                         "None, not a URL." % hook_name)
-            self._activate_fallback_location(url)
+            self._activate_fallback_location(url,
+                possible_transports=possible_transports)
 
     def __init__(self, *args, **kwargs):
         self._ignore_fallbacks = kwargs.get('ignore_fallbacks', False)

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2011-11-25 17:49:44 +0000
+++ b/bzrlib/builtins.py	2011-11-27 17:50:41 +0000
@@ -1350,7 +1350,9 @@
                                             force_new_repo=standalone,
                                             create_tree_if_local=not no_tree,
                                             source_branch=br_from)
-                branch = to_dir.open_branch()
+                branch = to_dir.open_branch(
+                    possible_transports=[
+                        br_from.bzrdir.root_transport, to_transport])
             except errors.NoSuchRevision:
                 to_transport.delete_tree('.')
                 msg = gettext("The branch {0} has no revision {1}.").format(

=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2011-11-25 14:59:57 +0000
+++ b/bzrlib/bzrdir.py	2011-11-28 10:33:40 +0000
@@ -370,6 +370,11 @@
         if revision_id is not None:
             fetch_spec_factory.add_revision_ids([revision_id])
             fetch_spec_factory.source_branch_stop_revision_id = revision_id
+        if possible_transports is None:
+            possible_transports = []
+        else:
+            possible_transports = list(possible_transports) + [
+                self.root_transport]
         target_transport = _mod_transport.get_transport(url,
             possible_transports)
         target_transport.ensure_base()
@@ -390,7 +395,8 @@
             stacked_branch_url = None
         repository_policy = result.determine_repository_policy(
             force_new_repo, stacked_branch_url, require_stacking=stacked)
-        result_repo, is_new_repo = repository_policy.acquire_repository()
+        result_repo, is_new_repo = repository_policy.acquire_repository(
+            possible_transports=possible_transports)
         add_cleanup(result_repo.lock_write().unlock)
         fetch_spec_factory.source_repo = source_repository
         fetch_spec_factory.target_repo = result_repo
@@ -947,14 +953,15 @@
         return False
 
     def open_branch(self, name=None, unsupported=False,
-                    ignore_fallbacks=False):
-        """See BzrDir.open_branch."""
+                    ignore_fallbacks=False, possible_transports=None):
+        """See ControlDir.open_branch."""
         if name is None:
             name = self._get_selected_branch()
         format = self.find_branch_format(name=name)
         format.check_support_status(unsupported)
         return format.open(self, name=name,
-            _found=True, ignore_fallbacks=ignore_fallbacks)
+            _found=True, ignore_fallbacks=ignore_fallbacks,
+            possible_transports=possible_transports)
 
     def open_repository(self, unsupported=False):
         """See BzrDir.open_repository."""
@@ -1845,7 +1852,8 @@
         else:
             self._require_stacking = True
 
-    def acquire_repository(self, make_working_trees=None, shared=False):
+    def acquire_repository(self, make_working_trees=None, shared=False,
+            possible_transports=None):
         """Acquire a repository for this bzrdir.
 
         Implementations may create a new repository or use a pre-exising
@@ -1876,23 +1884,29 @@
                                              require_stacking)
         self._bzrdir = bzrdir
 
-    def acquire_repository(self, make_working_trees=None, shared=False):
+    def acquire_repository(self, make_working_trees=None, shared=False,
+            possible_transports=None):
         """Implementation of RepositoryAcquisitionPolicy.acquire_repository
 
         Creates the desired repository in the bzrdir we already have.
         """
+        if possible_transports is None:
+            possible_transports = []
+        else:
+            possible_transports = list(possible_transports)
+        possible_transports.append(self._bzrdir.root_transport)
         stack_on = self._get_full_stack_on()
         if stack_on:
             format = self._bzrdir._format
             format.require_stacking(stack_on=stack_on,
-                                    possible_transports=[self._bzrdir.root_transport])
+                                    possible_transports=possible_transports)
             if not self._require_stacking:
                 # We have picked up automatic stacking somewhere.
                 note(gettext('Using default stacking branch {0} at {1}').format(
                     self._stack_on, self._stack_on_pwd))
         repository = self._bzrdir.create_repository(shared=shared)
         self._add_fallback(repository,
-                           possible_transports=[self._bzrdir.transport])
+                           possible_transports=possible_transports)
         if make_working_trees is not None:
             repository.set_make_working_trees(make_working_trees)
         return repository, True
@@ -1914,13 +1928,19 @@
                                              require_stacking)
         self._repository = repository
 
-    def acquire_repository(self, make_working_trees=None, shared=False):
+    def acquire_repository(self, make_working_trees=None, shared=False,
+            possible_transports=None):
         """Implementation of RepositoryAcquisitionPolicy.acquire_repository
 
         Returns an existing repository to use.
         """
+        if possible_transports is None:
+            possible_transports = []
+        else:
+            possible_transports = list(possible_transports)
+        possible_transports.append(self._repository.bzrdir.transport)
         self._add_fallback(self._repository,
-                       possible_transports=[self._repository.bzrdir.transport])
+                       possible_transports=possible_transports)
         return self._repository, False
 
 

=== modified file 'bzrlib/controldir.py'
--- a/bzrlib/controldir.py	2011-10-13 16:35:57 +0000
+++ b/bzrlib/controldir.py	2011-11-27 16:55:11 +0000
@@ -222,13 +222,14 @@
         return None
 
     def open_branch(self, name=None, unsupported=False,
-                    ignore_fallbacks=False):
+                    ignore_fallbacks=False, possible_transports=None):
         """Open the branch object at this ControlDir if one is present.
 
-        If unsupported is True, then no longer supported branch formats can
-        still be opened.
-
-        TODO: static convenience version of this?
+        :param unsupported: if True, then no longer supported branch formats can
+            still be opened.
+        :param ignore_fallbacks: Whether to open fallback repositories
+        :param possible_transports: Transports to use for opening e.g.
+            fallback repositories.
         """
         raise NotImplementedError(self.open_branch)
 
@@ -240,8 +241,6 @@
         get at a repository.
 
         :param _unsupported: a private parameter, not part of the api.
-
-        TODO: static convenience version of this?
         """
         raise NotImplementedError(self.open_repository)
 
@@ -275,7 +274,7 @@
         branch and discards it, and that's somewhat expensive.)
         """
         try:
-            self.open_branch(name)
+            self.open_branch(name, ignore_fallbacks=True)
             return True
         except errors.NotBranchError:
             return False

=== modified file 'bzrlib/plugins/weave_fmt/branch.py'
--- a/bzrlib/plugins/weave_fmt/branch.py	2011-09-12 09:51:52 +0000
+++ b/bzrlib/plugins/weave_fmt/branch.py	2011-11-27 17:34:50 +0000
@@ -134,7 +134,7 @@
         return "Branch format 4"
 
     def open(self, a_bzrdir, name=None, _found=False, ignore_fallbacks=False,
-            found_repository=None):
+            found_repository=None, possible_transports=None):
         """See BranchFormat.open()."""
         if name is not None:
             raise errors.NoColocatedBranchSupport(self)
@@ -147,7 +147,8 @@
                          _control_files=a_bzrdir._control_files,
                          a_bzrdir=a_bzrdir,
                          name=name,
-                         _repository=found_repository)
+                         _repository=found_repository,
+                         possible_transports=possible_transports)
 
     def __str__(self):
         return "Bazaar-NG branch format 4"

=== modified file 'bzrlib/plugins/weave_fmt/bzrdir.py'
--- a/bzrlib/plugins/weave_fmt/bzrdir.py	2011-10-06 00:14:01 +0000
+++ b/bzrlib/plugins/weave_fmt/bzrdir.py	2011-11-27 17:34:50 +0000
@@ -867,12 +867,13 @@
         return not isinstance(self._format, format.__class__)
 
     def open_branch(self, name=None, unsupported=False,
-                    ignore_fallbacks=False):
+                    ignore_fallbacks=False, possible_transports=None):
         """See BzrDir.open_branch."""
         from bzrlib.plugins.weave_fmt.branch import BzrBranchFormat4
         format = BzrBranchFormat4()
         format.check_support_status(unsupported)
-        return format.open(self, name, _found=True)
+        return format.open(self, name, _found=True,
+            possible_transports=possible_transports)
 
     def sprout(self, url, revision_id=None, force_new_repo=False,
                possible_transports=None, accelerator_tree=None,

=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py	2011-11-28 05:07:40 +0000
+++ b/bzrlib/remote.py	2011-11-28 10:33:40 +0000
@@ -655,7 +655,7 @@
         return None, self.open_branch(name=name)
 
     def open_branch(self, name=None, unsupported=False,
-                    ignore_fallbacks=False):
+                    ignore_fallbacks=False, possible_transports=None):
         if unsupported:
             raise NotImplementedError('unsupported flag support not implemented yet.')
         if self._next_open_branch_result is not None:
@@ -668,13 +668,15 @@
             # a branch reference, use the existing BranchReference logic.
             format = BranchReferenceFormat()
             return format.open(self, name=name, _found=True,
-                location=response[1], ignore_fallbacks=ignore_fallbacks)
+                location=response[1], ignore_fallbacks=ignore_fallbacks,
+                possible_transports=possible_transports)
         branch_format_name = response[1]
         if not branch_format_name:
             branch_format_name = None
         format = RemoteBranchFormat(network_name=branch_format_name)
         return RemoteBranch(self, self.find_repository(), format=format,
-            setup_stacking=not ignore_fallbacks, name=name)
+            setup_stacking=not ignore_fallbacks, name=name,
+            possible_transports=possible_transports)
 
     def _open_repo_v1(self, path):
         verb = 'BzrDir.find_repository'
@@ -2809,7 +2811,8 @@
     """
 
     def __init__(self, remote_bzrdir, remote_repository, real_branch=None,
-        _client=None, format=None, setup_stacking=True, name=None):
+        _client=None, format=None, setup_stacking=True, name=None,
+        possible_transports=None):
         """Create a RemoteBranch instance.
 
         :param real_branch: An optional local implementation of the branch
@@ -2880,9 +2883,9 @@
             hook(self)
         self._is_stacked = False
         if setup_stacking:
-            self._setup_stacking()
+            self._setup_stacking(possible_transports)
 
-    def _setup_stacking(self):
+    def _setup_stacking(self, possible_transports):
         # configure stacking into the remote repository, by reading it from
         # the vfs branch.
         try:
@@ -2891,7 +2894,13 @@
             errors.UnstackableRepositoryFormat), e:
             return
         self._is_stacked = True
-        self._activate_fallback_location(fallback_url)
+        if possible_transports is None:
+            possible_transports = []
+        else:
+            possible_transports = list(possible_transports)
+        possible_transports.append(self.bzrdir.root_transport)
+        self._activate_fallback_location(fallback_url,
+            possible_transports=possible_transports)
 
     def _get_config(self):
         return RemoteBranchConfig(self)

=== modified file 'bzrlib/tests/test_branch.py'
--- a/bzrlib/tests/test_branch.py	2011-09-27 11:34:38 +0000
+++ b/bzrlib/tests/test_branch.py	2011-11-27 17:42:25 +0000
@@ -122,7 +122,8 @@
     def is_supported(self):
         return False
 
-    def open(self, transport, name=None, _found=False, ignore_fallbacks=False):
+    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
+             possible_transports=None):
         return "opened branch."
 
 
@@ -143,7 +144,8 @@
         t.put_bytes('format', self.get_format_string())
         return 'A branch'
 
-    def open(self, transport, name=None, _found=False, ignore_fallbacks=False):
+    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
+             possible_transports=None):
         return "opened supported branch."
 
 
@@ -161,7 +163,8 @@
     def initialize(self, a_bzrdir, name=None):
         raise NotImplementedError(self.initialize)
 
-    def open(self, transport, name=None, _found=False, ignore_fallbacks=False):
+    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
+             possible_transports=None):
         raise NotImplementedError(self.open)
 
 

=== modified file 'bzrlib/tests/test_bzrdir.py'
--- a/bzrlib/tests/test_bzrdir.py	2011-11-04 16:32:00 +0000
+++ b/bzrlib/tests/test_bzrdir.py	2011-11-27 17:42:25 +0000
@@ -1244,7 +1244,7 @@
         self.test_branch = _TestBranch(self.transport)
         self.test_branch.repository = self.create_repository()
 
-    def open_branch(self, unsupported=False):
+    def open_branch(self, unsupported=False, possible_transports=None):
         return self.test_branch
 
     def cloning_metadir(self, require_stacking=False):

=== modified file 'bzrlib/tests/test_foreign.py'
--- a/bzrlib/tests/test_foreign.py	2011-11-17 17:24:57 +0000
+++ b/bzrlib/tests/test_foreign.py	2011-11-27 17:42:25 +0000
@@ -313,7 +313,8 @@
         self.root_transport.put_bytes(".bzr", "foo")
         return super(DummyForeignVcsDir, self).create_workingtree()
 
-    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True):
+    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True,
+            possible_transports=None):
         if name is not None:
             raise errors.NoColocatedBranchSupport(self)
         return self._format.get_branch_format().open(self, _found=True)

=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py	2011-11-28 05:07:40 +0000
+++ b/bzrlib/tests/test_remote.py	2011-11-28 10:33:40 +0000
@@ -679,7 +679,7 @@
         # _get_tree_branch is a form of open_branch, but it should only ask for
         # branch opening, not any other network requests.
         calls = []
-        def open_branch(name=None):
+        def open_branch(name=None, possible_transports=None):
             calls.append("Called")
             return "a-branch"
         transport = MemoryTransport()

=== modified file 'doc/en/release-notes/bzr-2.5.txt'
--- a/doc/en/release-notes/bzr-2.5.txt	2011-11-28 03:38:43 +0000
+++ b/doc/en/release-notes/bzr-2.5.txt	2011-11-28 10:33:40 +0000
@@ -33,6 +33,9 @@
 * ``bzr switch`` now accepts colocated branch names to switch to.
   (Jelmer Vernooij, #826814)
 
+* ``bzr branch --stacked`` now only makes a single connection to the remote
+  server rather than three. (Jelmer Vernooij, #444293)
+
 Bug Fixes
 *********
 
@@ -89,6 +92,9 @@
 .. Changes that may require updates in plugins or other code that uses
    bzrlib.
 
+* ``BzrDir.open_branch`` and ``BranchFormat.open`` now take an optional
+  ``possible_transports`` argument. (Jelmer Vernooij)
+
 * ``Repository.verify_revision`` has been renamed to
   ``Repository.verify_revision_signature``. (Jelmer Vernooij)
 




More information about the bazaar-commits mailing list