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