~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/switch.py

  • Committer: INADA Naoki
  • Date: 2011-05-18 06:01:08 UTC
  • mto: This revision was merged to the branch mainline in revision 5894.
  • Revision ID: songofacandy@gmail.com-20110518060108-86t2kffcrzu0nf6i
Update Japanese docs.

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()
94
103
            b.pull(to_branch, overwrite=True,
95
104
                possible_transports=possible_transports)
96
105
            b.set_bound_location(to_branch.base)
 
106
            b.set_parent(b.get_master_branch().get_parent())
97
107
        else:
98
108
            raise errors.BzrCommandError('Cannot switch a branch, '
99
109
                'only a checkout.')
118
128
    return False
119
129
 
120
130
 
121
 
def _update(tree, source_repository, quiet=False):
 
131
def _update(tree, source_repository, quiet=False, revision_id=None):
122
132
    """Update a working tree to the latest revision of its branch.
123
133
 
124
134
    :param tree: the working tree
127
137
    tree.lock_tree_write()
128
138
    try:
129
139
        to_branch = tree.branch
130
 
        if tree.last_revision() == to_branch.last_revision():
 
140
        if revision_id is None:
 
141
            revision_id = to_branch.last_revision()
 
142
        if tree.last_revision() == revision_id:
131
143
            if not quiet:
132
144
                note("Tree is up to date at revision %d.", to_branch.revno())
133
145
            return
134
146
        base_tree = source_repository.revision_tree(tree.last_revision())
135
 
        merge.Merge3Merger(tree, tree, base_tree, to_branch.basis_tree())
 
147
        merge.Merge3Merger(tree, tree, base_tree, to_branch.repository.revision_tree(revision_id))
136
148
        tree.set_last_revision(to_branch.last_revision())
137
149
        if not quiet:
138
150
            note('Updated to revision %d.' % to_branch.revno())