/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/switch.py

  • Committer: Ian Clatworthy
  • Date: 2007-12-05 06:49:46 UTC
  • mto: (3092.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 3093.
  • Revision ID: ian.clatworthy@internode.on.net-20071205064946-snjfrx883fc49osl
Refactor switch to support heavyweight checkouts

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
            'committed or reverted before using switch.')
77
77
 
78
78
 
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.
81
81
 
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
84
85
    """
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)
 
90
    else:
 
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
 
97
            # and bind to it
 
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 '
 
102
                    'throw them away.')
 
103
            b.pull(to_branch, overwrite=True)
 
104
            b.set_bound_location(to_branch.base)
 
105
        else:
 
106
            raise errors.BzrCommandError('Cannot switch a branch, '
 
107
                'only a checkout.')
 
108
 
 
109
 
 
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()
 
115
        try:
 
116
            other_last_rev = other_branch.last_revision()
 
117
            remote_graph = other_branch.repository.get_revision_graph(
 
118
                other_last_rev)
 
119
            if last_rev not in remote_graph:
 
120
                return True
 
121
        finally:
 
122
            other_branch.unlock()
 
123
    return False
87
124
 
88
125
 
89
126
def _update(tree, source_repository):