~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_switch.py

  • Committer: John Arbash Meinel
  • Date: 2011-05-11 11:35:28 UTC
  • mto: This revision was merged to the branch mainline in revision 5851.
  • Revision ID: john@arbash-meinel.com-20110511113528-qepibuwxicjrbb2h
Break compatibility with python <2.6.

This includes auditing the code for places where we were doing
explicit 'sys.version' checks and removing them as appropriate.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
 
1
# Copyright (C) 2007-2011 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Tests for bzrlib.switch."""
18
18
 
19
19
 
20
20
import os
21
21
 
22
 
from bzrlib import branch, errors, switch, tests
 
22
from bzrlib import (
 
23
    branch,
 
24
    errors,
 
25
    merge as _mod_merge,
 
26
    switch,
 
27
    tests,
 
28
    )
23
29
 
24
30
 
25
31
class TestSwitch(tests.TestCaseWithTransport):
26
32
 
 
33
    def setUp(self):
 
34
        super(TestSwitch, self).setUp()
 
35
        self.lightweight = True
 
36
 
27
37
    def _setup_tree(self):
28
38
        tree = self.make_branch_and_tree('branch-1')
29
39
        self.build_tree(['branch-1/file-1'])
39
49
        tree.add('file-2')
40
50
        tree.remove('file-1')
41
51
        tree.commit('rev2')
42
 
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
 
52
        checkout = tree.branch.create_checkout('checkout',
 
53
            lightweight=self.lightweight)
43
54
        self.build_tree(['checkout/file-3'])
44
55
        checkout.add('file-3')
45
 
        self.failIfExists('checkout/file-1')
46
 
        self.failUnlessExists('checkout/file-2')
 
56
        self.assertPathDoesNotExist('checkout/file-1')
 
57
        self.assertPathExists('checkout/file-2')
47
58
        switch.switch(checkout.bzrdir, to_branch)
48
 
        self.failUnlessExists('checkout/file-1')
49
 
        self.failIfExists('checkout/file-2')
50
 
        self.failUnlessExists('checkout/file-3')
 
59
        self.assertPathExists('checkout/file-1')
 
60
        self.assertPathDoesNotExist('checkout/file-2')
 
61
        self.assertPathExists('checkout/file-3')
51
62
 
52
63
    def test_switch_after_branch_moved(self):
53
64
        """Test switch after the branch is moved."""
54
65
        tree = self._setup_tree()
55
 
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
 
66
        checkout = tree.branch.create_checkout('checkout',
 
67
            lightweight=self.lightweight)
56
68
        self.build_tree(['branch-1/file-2'])
57
69
        tree.add('file-2')
58
70
        tree.remove('file-1')
59
71
        tree.commit('rev2')
 
72
        self.build_tree(['checkout/file-3'])
 
73
        checkout.add('file-3')
 
74
        checkout_dir = checkout.bzrdir
 
75
        # rename the branch on disk, the checkout object is now invalid.
60
76
        os.rename('branch-1', 'branch-2')
61
77
        to_branch = branch.Branch.open('branch-2')
62
 
        self.build_tree(['checkout/file-3'])
63
 
        checkout.add('file-3')
64
 
        switch.switch(checkout.bzrdir, to_branch)
65
 
        self.failIfExists('checkout/file-1')
66
 
        self.failUnlessExists('checkout/file-2')
67
 
        self.failUnlessExists('checkout/file-3')
68
 
 
69
 
    def test_switch_on_heavy_checkout(self):
70
 
        """Test graceful failure on heavyweight checkouts."""
71
 
        tree = self._setup_tree()
72
 
        checkout = tree.branch.create_checkout('checkout-1', lightweight=False)
73
 
        branch2 = self.make_branch('branch-2')
74
 
        err = self.assertRaises(errors.BzrCommandError,
75
 
            switch.switch, checkout.bzrdir, branch2)
76
 
        self.assertContainsRe(str(err),
77
 
            "The switch command can only be used on a lightweight checkout")
 
78
        # Check fails without --force
 
79
        err = self.assertRaises(
 
80
            (errors.BzrCommandError, errors.NotBranchError),
 
81
            switch.switch, checkout.bzrdir, to_branch)
 
82
        if isinstance(err, errors.BzrCommandError):
 
83
            self.assertContainsRe(str(err),
 
84
                'Unable to connect to current master branch .*'
 
85
                'To switch anyway, use --force.')
 
86
        switch.switch(checkout.bzrdir, to_branch, force=True)
 
87
        self.assertPathDoesNotExist('checkout/file-1')
 
88
        self.assertPathExists('checkout/file-2')
 
89
        self.assertPathExists('checkout/file-3')
78
90
 
79
91
    def test_switch_when_pending_merges(self):
80
92
        """Test graceful failure if pending merges are outstanding."""
81
93
        # Create 2 branches and a checkout
82
94
        tree = self._setup_tree()
83
95
        tree2 = tree.bzrdir.sprout('branch-2').open_workingtree()
84
 
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
 
96
        checkout = tree.branch.create_checkout('checkout',
 
97
            lightweight=self.lightweight)
85
98
        # Change tree2 and merge it into the checkout without committing
86
99
        self.build_tree(['branch-2/file-2'])
87
100
        tree2.add('file-2')
92
105
            switch.switch, checkout.bzrdir, tree2.branch)
93
106
        self.assertContainsRe(str(err),
94
107
            "Pending merges must be committed or reverted before using switch")
 
108
 
 
109
    def test_switch_with_revision(self):
 
110
        """Test switch when a revision is given."""
 
111
        # Create a tree with 2 revisions
 
112
        tree = self.make_branch_and_tree('branch-1')
 
113
        self.build_tree(['branch-1/file-1'])
 
114
        tree.add('file-1')
 
115
        tree.commit(rev_id='rev1', message='rev1')
 
116
        self.build_tree(['branch-1/file-2'])
 
117
        tree.add('file-2')
 
118
        tree.commit(rev_id='rev2', message='rev2')
 
119
        # Check it out and switch to revision 1
 
120
        checkout = tree.branch.create_checkout('checkout',
 
121
            lightweight=self.lightweight)
 
122
        switch.switch(checkout.bzrdir, tree.branch, revision_id="rev1")
 
123
        self.assertPathExists('checkout/file-1')
 
124
        self.assertPathDoesNotExist('checkout/file-2')
 
125
 
 
126
    def test_switch_changing_root_id(self):
 
127
        tree = self._setup_tree()
 
128
        tree2 = self.make_branch_and_tree('tree-2')
 
129
        tree2.set_root_id('custom-root-id')
 
130
        self.build_tree(['tree-2/file-2'])
 
131
        tree2.add(['file-2'])
 
132
        tree2.commit('rev1b')
 
133
        checkout = tree.branch.create_checkout('checkout',
 
134
            lightweight=self.lightweight)
 
135
        switch.switch(checkout.bzrdir, tree2.branch)
 
136
        self.assertEqual('custom-root-id', tree2.get_root_id())
 
137
 
 
138
    def test_switch_configurable_file_merger(self):
 
139
        class DummyMerger(_mod_merge.ConfigurableFileMerger):
 
140
            name_prefix = 'file'
 
141
 
 
142
        _mod_merge.Merger.hooks.install_named_hook(
 
143
            'merge_file_content', DummyMerger,
 
144
            'test factory')
 
145
        foo = self.make_branch('foo')
 
146
        checkout = foo.create_checkout('checkout', lightweight=True)
 
147
        self.build_tree_contents([('checkout/file', 'a')])
 
148
        checkout.add('file')
 
149
        checkout.commit('a')
 
150
        bar = foo.bzrdir.sprout('bar').open_workingtree()
 
151
        self.build_tree_contents([('bar/file', 'b')])
 
152
        bar.commit('b')
 
153
        self.build_tree_contents([('checkout/file', 'c')])
 
154
        switch.switch(checkout.bzrdir, bar.branch)
 
155
 
 
156
 
 
157
class TestSwitchHeavyweight(TestSwitch):
 
158
 
 
159
    def setUp(self):
 
160
        super(TestSwitchHeavyweight, self).setUp()
 
161
        self.lightweight = False
 
162
 
 
163
    def test_switch_with_local_commits(self):
 
164
        """Test switch complains about local commits unless --force given."""
 
165
        tree = self._setup_tree()
 
166
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
 
167
        self.build_tree(['branch-1/file-2'])
 
168
        tree.add('file-2')
 
169
        tree.remove('file-1')
 
170
        tree.commit('rev2')
 
171
        checkout = tree.branch.create_checkout('checkout')
 
172
        self.build_tree(['checkout/file-3'])
 
173
        checkout.add('file-3')
 
174
        checkout.commit(message='local only commit', local=True)
 
175
        self.build_tree(['checkout/file-4'])
 
176
        # Check the error reporting is as expected
 
177
        err = self.assertRaises(errors.BzrCommandError,
 
178
            switch.switch, checkout.bzrdir, to_branch)
 
179
        self.assertContainsRe(str(err),
 
180
            'Cannot switch as local commits found in the checkout.')
 
181
        # Check all is ok when force is given
 
182
        self.assertPathDoesNotExist('checkout/file-1')
 
183
        self.assertPathExists('checkout/file-2')
 
184
        switch.switch(checkout.bzrdir, to_branch, force=True)
 
185
        self.assertPathExists('checkout/file-1')
 
186
        self.assertPathDoesNotExist('checkout/file-2')
 
187
        self.assertPathDoesNotExist('checkout/file-3')
 
188
        self.assertPathExists('checkout/file-4')
 
189
        # Check that the checkout is a true mirror of the bound branch
 
190
        self.assertEqual(to_branch.last_revision_info(),
 
191
                         checkout.branch.last_revision_info())