~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/switch.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-01 08:02:42 UTC
  • mfrom: (5390.3.3 faster-revert-593560)
  • Revision ID: pqm@pqm.ubuntu.com-20100901080242-esg62ody4frwmy66
(spiv) Avoid repeatedly calling self.target.all_file_ids() in
 InterTree.iter_changes. (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007 Canonical Ltd.
 
1
# Copyright (C) 2007, 2009, 2010 Canonical Ltd.
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
# Original author: David Allouche
18
18
 
19
19
from bzrlib import errors, merge, revision
20
 
from bzrlib.branch import Branch, BranchFormat, BranchReferenceFormat
21
 
from bzrlib.bzrdir import BzrDir
 
20
from bzrlib.branch import Branch
22
21
from bzrlib.trace import note
23
22
 
24
23
 
25
 
def switch(control_dir, to_branch, force=False, quiet=False):
 
24
def _run_post_switch_hooks(control_dir, to_branch, force, revision_id):
 
25
    from bzrlib.branch import SwitchHookParams
 
26
    hooks = Branch.hooks['post_switch']
 
27
    if not hooks:
 
28
        return
 
29
    params = SwitchHookParams(control_dir, to_branch, force, revision_id)
 
30
    for hook in hooks:
 
31
        hook(params)
 
32
 
 
33
def switch(control_dir, to_branch, force=False, quiet=False, revision_id=None):
26
34
    """Switch the branch associated with a checkout.
27
35
 
28
36
    :param control_dir: BzrDir of the checkout to change
29
37
    :param to_branch: branch that the checkout is to reference
30
38
    :param force: skip the check for local commits in a heavy checkout
 
39
    :param revision_id: revision ID to switch to.
31
40
    """
32
41
    _check_pending_merges(control_dir, force)
33
42
    try:
36
45
        source_repository = to_branch.repository
37
46
    _set_branch_location(control_dir, to_branch, force)
38
47
    tree = control_dir.open_workingtree()
39
 
    _update(tree, source_repository, quiet)
40
 
 
 
48
    _update(tree, source_repository, quiet, revision_id)
 
49
    _run_post_switch_hooks(control_dir, to_branch, force, revision_id)
41
50
 
42
51
def _check_pending_merges(control, force=False):
43
52
    """Check that there are no outstanding pending merges before switching.
69
78
    branch_format = control.find_branch_format()
70
79
    if branch_format.get_reference(control) is not None:
71
80
        # Lightweight checkout: update the branch reference
72
 
        branch_format.set_reference(control, to_branch)
 
81
        branch_format.set_reference(control, None, to_branch)
73
82
    else:
74
83
        b = control.open_branch()
75
84
        bound_branch = b.get_bound_location()
118
127
    return False
119
128
 
120
129
 
121
 
def _update(tree, source_repository, quiet=False):
 
130
def _update(tree, source_repository, quiet=False, revision_id=None):
122
131
    """Update a working tree to the latest revision of its branch.
123
132
 
124
133
    :param tree: the working tree
127
136
    tree.lock_tree_write()
128
137
    try:
129
138
        to_branch = tree.branch
130
 
        if tree.last_revision() == to_branch.last_revision():
 
139
        if revision_id is None:
 
140
            revision_id = to_branch.last_revision()
 
141
        if tree.last_revision() == revision_id:
131
142
            if not quiet:
132
143
                note("Tree is up to date at revision %d.", to_branch.revno())
133
144
            return
134
145
        base_tree = source_repository.revision_tree(tree.last_revision())
135
 
        merge.Merge3Merger(tree, tree, base_tree, to_branch.basis_tree())
 
146
        merge.Merge3Merger(tree, tree, base_tree, to_branch.repository.revision_tree(revision_id))
136
147
        tree.set_last_revision(to_branch.last_revision())
137
148
        if not quiet:
138
149
            note('Updated to revision %d.' % to_branch.revno())