~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_switch.py

(vila) Make all transport put_bytes() raises TypeError when given unicode
 strings rather than bytes (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2010 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
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
    lock,
 
26
    merge as _mod_merge,
 
27
    switch,
 
28
    tests,
 
29
    workingtree,
 
30
    )
23
31
 
24
32
 
25
33
class TestSwitch(tests.TestCaseWithTransport):
28
36
        super(TestSwitch, self).setUp()
29
37
        self.lightweight = True
30
38
 
 
39
    @staticmethod
 
40
    def _master_if_present(branch):
 
41
        master = branch.get_master_branch()
 
42
        if master:
 
43
            return master
 
44
        else:
 
45
            return branch
 
46
 
31
47
    def _setup_tree(self):
32
48
        tree = self.make_branch_and_tree('branch-1')
33
49
        self.build_tree(['branch-1/file-1'])
35
51
        tree.commit('rev1')
36
52
        return tree
37
53
 
 
54
    def _setup_uncommitted(self, same_revision=False):
 
55
        tree = self._setup_tree()
 
56
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
 
57
        self.build_tree(['branch-1/file-2'])
 
58
        if not same_revision:
 
59
            tree.add('file-2')
 
60
            tree.remove('file-1')
 
61
            tree.commit('rev2')
 
62
        checkout = tree.branch.create_checkout('checkout',
 
63
            lightweight=self.lightweight)
 
64
        self.build_tree(['checkout/file-3'])
 
65
        checkout.add('file-3')
 
66
        return checkout, to_branch
 
67
 
 
68
    def test_switch_store_uncommitted(self):
 
69
        """Test switch updates tree and stores uncommitted changes."""
 
70
        checkout, to_branch = self._setup_uncommitted()
 
71
        self.assertPathDoesNotExist('checkout/file-1')
 
72
        self.assertPathExists('checkout/file-2')
 
73
        switch.switch(checkout.bzrdir, to_branch, store_uncommitted=True)
 
74
        self.assertPathExists('checkout/file-1')
 
75
        self.assertPathDoesNotExist('checkout/file-2')
 
76
        self.assertPathDoesNotExist('checkout/file-3')
 
77
 
 
78
    def test_switch_restore_uncommitted(self):
 
79
        """Test switch updates tree and restores uncommitted changes."""
 
80
        checkout, to_branch = self._setup_uncommitted()
 
81
        old_branch = self._master_if_present(checkout.branch)
 
82
        self.assertPathDoesNotExist('checkout/file-1')
 
83
        self.assertPathExists('checkout/file-2')
 
84
        self.assertPathExists('checkout/file-3')
 
85
        switch.switch(checkout.bzrdir, to_branch, store_uncommitted=True)
 
86
        checkout = workingtree.WorkingTree.open('checkout')
 
87
        switch.switch(checkout.bzrdir, old_branch, store_uncommitted=True)
 
88
        self.assertPathDoesNotExist('checkout/file-1')
 
89
        self.assertPathExists('checkout/file-2')
 
90
        self.assertPathExists('checkout/file-3')
 
91
 
 
92
    def test_switch_restore_uncommitted_same_revision(self):
 
93
        """Test switch updates tree and restores uncommitted changes."""
 
94
        checkout, to_branch = self._setup_uncommitted(same_revision=True)
 
95
        old_branch = self._master_if_present(checkout.branch)
 
96
        switch.switch(checkout.bzrdir, to_branch, store_uncommitted=True)
 
97
        checkout = workingtree.WorkingTree.open('checkout')
 
98
        switch.switch(checkout.bzrdir, old_branch, store_uncommitted=True)
 
99
        self.assertPathExists('checkout/file-3')
 
100
 
38
101
    def test_switch_updates(self):
39
102
        """Test switch updates tree and keeps uncommitted changes."""
40
 
        tree = self._setup_tree()
41
 
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
42
 
        self.build_tree(['branch-1/file-2'])
43
 
        tree.add('file-2')
44
 
        tree.remove('file-1')
45
 
        tree.commit('rev2')
46
 
        checkout = tree.branch.create_checkout('checkout',
47
 
            lightweight=self.lightweight)
48
 
        self.build_tree(['checkout/file-3'])
49
 
        checkout.add('file-3')
50
 
        self.failIfExists('checkout/file-1')
51
 
        self.failUnlessExists('checkout/file-2')
 
103
        checkout, to_branch = self._setup_uncommitted()
 
104
        self.assertPathDoesNotExist('checkout/file-1')
 
105
        self.assertPathExists('checkout/file-2')
52
106
        switch.switch(checkout.bzrdir, to_branch)
53
 
        self.failUnlessExists('checkout/file-1')
54
 
        self.failIfExists('checkout/file-2')
55
 
        self.failUnlessExists('checkout/file-3')
 
107
        self.assertPathExists('checkout/file-1')
 
108
        self.assertPathDoesNotExist('checkout/file-2')
 
109
        self.assertPathExists('checkout/file-3')
56
110
 
57
111
    def test_switch_after_branch_moved(self):
58
112
        """Test switch after the branch is moved."""
78
132
                'Unable to connect to current master branch .*'
79
133
                'To switch anyway, use --force.')
80
134
        switch.switch(checkout.bzrdir, to_branch, force=True)
81
 
        self.failIfExists('checkout/file-1')
82
 
        self.failUnlessExists('checkout/file-2')
83
 
        self.failUnlessExists('checkout/file-3')
 
135
        self.assertPathDoesNotExist('checkout/file-1')
 
136
        self.assertPathExists('checkout/file-2')
 
137
        self.assertPathExists('checkout/file-3')
84
138
 
85
139
    def test_switch_when_pending_merges(self):
86
140
        """Test graceful failure if pending merges are outstanding."""
114
168
        checkout = tree.branch.create_checkout('checkout',
115
169
            lightweight=self.lightweight)
116
170
        switch.switch(checkout.bzrdir, tree.branch, revision_id="rev1")
117
 
        self.failUnlessExists('checkout/file-1')
118
 
        self.failIfExists('checkout/file-2')
 
171
        self.assertPathExists('checkout/file-1')
 
172
        self.assertPathDoesNotExist('checkout/file-2')
119
173
 
120
174
    def test_switch_changing_root_id(self):
121
175
        tree = self._setup_tree()
129
183
        switch.switch(checkout.bzrdir, tree2.branch)
130
184
        self.assertEqual('custom-root-id', tree2.get_root_id())
131
185
 
 
186
    def test_switch_configurable_file_merger(self):
 
187
        class DummyMerger(_mod_merge.ConfigurableFileMerger):
 
188
            name_prefix = 'file'
 
189
 
 
190
        _mod_merge.Merger.hooks.install_named_hook(
 
191
            'merge_file_content', DummyMerger,
 
192
            'test factory')
 
193
        foo = self.make_branch('foo')
 
194
        checkout = foo.create_checkout('checkout', lightweight=True)
 
195
        self.build_tree_contents([('checkout/file', 'a')])
 
196
        checkout.add('file')
 
197
        checkout.commit('a')
 
198
        bar = foo.bzrdir.sprout('bar').open_workingtree()
 
199
        self.build_tree_contents([('bar/file', 'b')])
 
200
        bar.commit('b')
 
201
        self.build_tree_contents([('checkout/file', 'c')])
 
202
        switch.switch(checkout.bzrdir, bar.branch)
 
203
 
132
204
 
133
205
class TestSwitchHeavyweight(TestSwitch):
134
206
 
155
227
        self.assertContainsRe(str(err),
156
228
            'Cannot switch as local commits found in the checkout.')
157
229
        # Check all is ok when force is given
158
 
        self.failIfExists('checkout/file-1')
159
 
        self.failUnlessExists('checkout/file-2')
 
230
        self.assertPathDoesNotExist('checkout/file-1')
 
231
        self.assertPathExists('checkout/file-2')
160
232
        switch.switch(checkout.bzrdir, to_branch, force=True)
161
 
        self.failUnlessExists('checkout/file-1')
162
 
        self.failIfExists('checkout/file-2')
163
 
        self.failIfExists('checkout/file-3')
164
 
        self.failUnlessExists('checkout/file-4')
 
233
        self.assertPathExists('checkout/file-1')
 
234
        self.assertPathDoesNotExist('checkout/file-2')
 
235
        self.assertPathDoesNotExist('checkout/file-3')
 
236
        self.assertPathExists('checkout/file-4')
165
237
        # Check that the checkout is a true mirror of the bound branch
166
238
        self.assertEqual(to_branch.last_revision_info(),
167
239
                         checkout.branch.last_revision_info())