76
76
'committed or reverted before using switch.')
79
def _set_branch_location(control, to_branch):
79
def _set_branch_location(control, to_branch, force=False):
80
80
"""Set location value of a branch reference.
82
82
:param control: BzrDir of the checkout to change
83
83
:param to_branch: branch that the checkout is to reference
84
:param force: skip the check for local commits in a heavy checkout
85
transport = control.get_branch_transport(None)
86
location = transport.put_bytes('location', to_branch.base)
86
branch_format = control.find_branch_format()
87
if branch_format.get_reference(control) is not None:
88
# Lightweight checkout: update the branch reference
89
branch_format.set_reference(control, to_branch)
91
b = control.open_branch()
92
bound_branch = b.get_bound_location()
93
if bound_branch is not None:
94
# Heavyweight checkout: check all local commits
95
# have been pushed to the current bound branch then
96
# synchronise the local branch with the new remote branch
98
if not force and _any_local_commits(b, bound_branch):
99
raise errors.BzrCommandError(
100
'Cannot switch as local commits found in the checkout. '
101
'Commit these to the bound branch or use --force to '
103
b.pull(to_branch, overwrite=True)
104
b.set_bound_location(to_branch.base)
106
raise errors.BzrCommandError('Cannot switch a branch, '
110
def _any_local_commits(this_branch, other_branch):
111
"""Does this branch have any commits not in the other branch?"""
112
last_rev = _mod_revision.ensure_null(this_branch.last_revision())
113
if last_rev != _mod_revision.NULL_REVISION:
114
other_branch.lock_read()
116
other_last_rev = other_branch.last_revision()
117
remote_graph = other_branch.repository.get_revision_graph(
119
if last_rev not in remote_graph:
122
other_branch.unlock()
89
126
def _update(tree, source_repository):