/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: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
# Original author: David Allouche
20
20
 
21
 
from bzrlib import (
22
 
    errors,
23
 
    lock,
24
 
    merge,
25
 
    revision
26
 
    )
 
21
from bzrlib import errors, merge, revision
27
22
from bzrlib.branch import Branch
28
23
from bzrlib.i18n import gettext
29
24
from bzrlib.trace import note
37
32
    for hook in hooks:
38
33
        hook(params)
39
34
 
40
 
def switch(control_dir, to_branch, force=False, quiet=False, revision_id=None,
41
 
           store_uncommitted=False):
 
35
def switch(control_dir, to_branch, force=False, quiet=False, revision_id=None):
42
36
    """Switch the branch associated with a checkout.
43
37
 
44
38
    :param control_dir: ControlDir of the checkout to change
45
39
    :param to_branch: branch that the checkout is to reference
46
40
    :param force: skip the check for local commits in a heavy checkout
47
41
    :param revision_id: revision ID to switch to.
48
 
    :param store_uncommitted: If True, store uncommitted changes in the
49
 
        branch.
50
42
    """
51
43
    _check_pending_merges(control_dir, force)
52
44
    try:
53
45
        source_repository = control_dir.open_branch().repository
54
46
    except errors.NotBranchError:
55
47
        source_repository = to_branch.repository
56
 
    if store_uncommitted:
57
 
        with lock.write_locked(control_dir.open_workingtree()) as tree:
58
 
            tree.store_uncommitted()
59
 
    to_branch.lock_read()
60
 
    try:
61
 
        _set_branch_location(control_dir, to_branch, force)
62
 
    finally:
63
 
        to_branch.unlock()
 
48
    _set_branch_location(control_dir, to_branch, force)
64
49
    tree = control_dir.open_workingtree()
65
 
    _update(tree, source_repository, quiet, revision_id, store_uncommitted)
 
50
    _update(tree, source_repository, quiet, revision_id)
66
51
    _run_post_switch_hooks(control_dir, to_branch, force, revision_id)
67
52
 
68
53
def _check_pending_merges(control, force=False):
126
111
            finally:
127
112
                b.unlock()
128
113
        else:
129
 
            # If this is a standalone tree and the new branch
130
 
            # is derived from this one, create a lightweight checkout.
131
 
            b.lock_read()
132
 
            try:
133
 
                graph = b.repository.get_graph(to_branch.repository)
134
 
                if (b.bzrdir._format.colocated_branches and
135
 
                     (force or graph.is_ancestor(b.last_revision(),
136
 
                        to_branch.last_revision()))):
137
 
                    b.bzrdir.destroy_branch()
138
 
                    b.bzrdir.set_branch_reference(to_branch, name="")
139
 
                else:
140
 
                    raise errors.BzrCommandError(gettext('Cannot switch a branch, '
141
 
                        'only a checkout.'))
142
 
            finally:
143
 
                b.unlock()
 
114
            raise errors.BzrCommandError(gettext('Cannot switch a branch, '
 
115
                'only a checkout.'))
144
116
 
145
117
 
146
118
def _any_local_commits(this_branch, possible_transports):
162
134
    return False
163
135
 
164
136
 
165
 
def _update(tree, source_repository, quiet=False, revision_id=None,
166
 
            restore_uncommitted=False):
 
137
def _update(tree, source_repository, quiet=False, revision_id=None):
167
138
    """Update a working tree to the latest revision of its branch.
168
139
 
169
140
    :param tree: the working tree
170
141
    :param source_repository: repository holding the revisions
171
 
    :param restore_uncommitted: restore any uncommitted changes in the branch.
172
142
    """
173
 
    if restore_uncommitted:
174
 
        tree.lock_write()
175
 
    else:
176
 
        tree.lock_tree_write()
 
143
    tree.lock_tree_write()
177
144
    try:
178
145
        to_branch = tree.branch
179
146
        if revision_id is None:
181
148
        if tree.last_revision() == revision_id:
182
149
            if not quiet:
183
150
                note(gettext("Tree is up to date at revision %d."), to_branch.revno())
184
 
        else:
185
 
            base_tree = source_repository.revision_tree(tree.last_revision())
186
 
            merge.Merge3Merger(tree, tree, base_tree,
187
 
                               to_branch.repository.revision_tree(revision_id))
188
 
            tree.set_last_revision(to_branch.last_revision())
189
 
            if not quiet:
190
 
                note(gettext('Updated to revision %d.') % to_branch.revno())
191
 
        if restore_uncommitted:
192
 
            tree.restore_uncommitted()
 
151
            return
 
152
        base_tree = source_repository.revision_tree(tree.last_revision())
 
153
        merge.Merge3Merger(tree, tree, base_tree, to_branch.repository.revision_tree(revision_id))
 
154
        tree.set_last_revision(to_branch.last_revision())
 
155
        if not quiet:
 
156
            note(gettext('Updated to revision %d.') % to_branch.revno())
193
157
    finally:
194
158
        tree.unlock()