~bzr-pqm/bzr/bzr.dev

2796.2.1 by Aaron Bentley
Begin work on reconfigure command
1
# Copyright (C) 2007 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
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
16
17
from bzrlib import (
18
    branch as _mod_branch,
19
    errors,
20
    reconfigure,
2796.2.25 by Aaron Bentley
Avoid destroying shared repositories
21
    repository,
2796.2.1 by Aaron Bentley
Begin work on reconfigure command
22
    tests,
23
    workingtree,
24
    )
25
26
27
class TestReconfigure(tests.TestCaseWithTransport):
28
29
    def test_tree_to_branch(self):
30
        tree = self.make_branch_and_tree('tree')
31
        reconfiguration = reconfigure.Reconfigure.to_branch(tree.bzrdir)
32
        reconfiguration.apply()
33
        self.assertRaises(errors.NoWorkingTree, workingtree.WorkingTree.open,
34
                          'tree')
35
36
    def test_modified_tree_to_branch(self):
37
        tree = self.make_branch_and_tree('tree')
38
        self.build_tree(['tree/file'])
39
        tree.add('file')
40
        reconfiguration = reconfigure.Reconfigure.to_branch(tree.bzrdir)
41
        self.assertRaises(errors.UncommittedChanges, reconfiguration.apply)
42
        reconfiguration.apply(force=True)
43
        self.assertRaises(errors.NoWorkingTree, workingtree.WorkingTree.open,
44
                          'tree')
45
46
    def test_branch_to_branch(self):
47
        branch = self.make_branch('branch')
48
        self.assertRaises(errors.AlreadyBranch,
49
                          reconfigure.Reconfigure.to_branch, branch.bzrdir)
50
51
    def test_repo_to_branch(self):
52
        repo = self.make_repository('repo')
2796.2.23 by Aaron Bentley
Add support for reconfiguring repositories into branches or trees
53
        reconfiguration = reconfigure.Reconfigure.to_branch(repo.bzrdir)
54
        reconfiguration.apply()
2796.2.1 by Aaron Bentley
Begin work on reconfigure command
55
56
    def test_checkout_to_branch(self):
57
        branch = self.make_branch('branch')
58
        checkout = branch.create_checkout('checkout')
59
        reconfiguration = reconfigure.Reconfigure.to_branch(checkout.bzrdir)
60
        reconfiguration.apply()
61
        self.assertIs(None, checkout.branch.get_bound_location())
2796.2.2 by Aaron Bentley
Refuse to turn lightweight checkouts into branches
62
2796.2.32 by Aaron Bentley
Preserve tags converting from lightweight checkouts
63
    def prepare_lightweight_checkout_to_branch(self):
64
        branch = self.make_branch('branch')
65
        checkout = branch.create_checkout('checkout', lightweight=True)
66
        checkout.commit('first commit', rev_id='rev1')
67
        reconfiguration = reconfigure.Reconfigure.to_branch(checkout.bzrdir)
68
        return reconfiguration, checkout
69
2796.2.2 by Aaron Bentley
Refuse to turn lightweight checkouts into branches
70
    def test_lightweight_checkout_to_branch(self):
2796.2.32 by Aaron Bentley
Preserve tags converting from lightweight checkouts
71
        reconfiguration, checkout = \
72
            self.prepare_lightweight_checkout_to_branch()
2796.2.7 by Aaron Bentley
Implement converting a lightweight checkout to a branch
73
        reconfiguration.apply()
74
        checkout_branch = checkout.bzrdir.open_branch()
75
        self.assertEqual(checkout_branch.bzrdir.root_transport.base,
76
                         checkout.bzrdir.root_transport.base)
2796.2.8 by Aaron Bentley
Ensure conversion from lightweight fetches revisions and sets revision info
77
        self.assertEqual('rev1', checkout_branch.last_revision())
78
        repo = checkout.bzrdir.open_repository()
79
        repo.get_revision('rev1')
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
80
2796.2.32 by Aaron Bentley
Preserve tags converting from lightweight checkouts
81
    def test_lightweight_checkout_to_branch_tags(self):
82
        reconfiguration, checkout = \
83
            self.prepare_lightweight_checkout_to_branch()
84
        checkout.branch.tags.set_tag('foo', 'bar')
85
        reconfiguration.apply()
86
        checkout_branch = checkout.bzrdir.open_branch()
87
        self.assertEqual('bar', checkout_branch.tags.lookup_tag('foo'))
88
2796.2.33 by Aaron Bentley
Add lightweight-checkout-to-checkout tags test
89
    def prepare_lightweight_checkout_to_checkout(self):
90
        branch = self.make_branch('branch')
91
        checkout = branch.create_checkout('checkout', lightweight=True)
92
        reconfiguration = reconfigure.Reconfigure.to_checkout(checkout.bzrdir)
93
        return reconfiguration, checkout
94
2796.2.9 by Aaron Bentley
Ensure conversion from lightweight checkout works
95
    def test_lightweight_checkout_to_checkout(self):
2796.2.33 by Aaron Bentley
Add lightweight-checkout-to-checkout tags test
96
        reconfiguration, checkout = \
97
            self.prepare_lightweight_checkout_to_checkout()
2796.2.9 by Aaron Bentley
Ensure conversion from lightweight checkout works
98
        reconfiguration.apply()
99
        checkout_branch = checkout.bzrdir.open_branch()
100
        self.assertIsNot(checkout_branch.get_bound_location(), None)
101
2796.2.33 by Aaron Bentley
Add lightweight-checkout-to-checkout tags test
102
    def test_lightweight_checkout_to_checkout_tags(self):
103
        reconfiguration, checkout = \
104
            self.prepare_lightweight_checkout_to_checkout()
105
        checkout.branch.tags.set_tag('foo', 'bar')
106
        reconfiguration.apply()
107
        checkout_branch = checkout.bzrdir.open_branch()
108
        self.assertEqual('bar', checkout_branch.tags.lookup_tag('foo'))
109
2796.2.10 by Aaron Bentley
Ensure that shared repositories are used where possible
110
    def test_lightweight_conversion_uses_shared_repo(self):
111
        parent = self.make_branch('parent')
112
        shared_repo = self.make_repository('repo', shared=True)
113
        checkout = parent.create_checkout('repo/checkout', lightweight=True)
114
        reconfigure.Reconfigure.to_tree(checkout.bzrdir).apply()
115
        checkout_repo = checkout.bzrdir.open_branch().repository
116
        self.assertEqual(shared_repo.bzrdir.root_transport.base,
117
                         checkout_repo.bzrdir.root_transport.base)
118
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
119
    def test_branch_to_tree(self):
120
        branch = self.make_branch('branch')
121
        reconfiguration=reconfigure.Reconfigure.to_tree(branch.bzrdir)
122
        reconfiguration.apply()
123
        branch.bzrdir.open_workingtree()
124
125
    def test_tree_to_tree(self):
126
        tree = self.make_branch_and_tree('tree')
127
        self.assertRaises(errors.AlreadyTree, reconfigure.Reconfigure.to_tree,
128
                          tree.bzrdir)
129
130
    def test_select_bind_location(self):
131
        branch = self.make_branch('branch')
132
        reconfiguration = reconfigure.Reconfigure(branch.bzrdir)
133
        self.assertRaises(errors.NoBindLocation,
134
                          reconfiguration._select_bind_location)
135
        branch.set_parent('http://parent')
136
        self.assertEqual('http://parent',
137
                         reconfiguration._select_bind_location())
138
        branch.set_push_location('sftp://push')
139
        self.assertEqual('sftp://push',
140
                         reconfiguration._select_bind_location())
2796.2.22 by Aaron Bentley
Tweak from review
141
        branch.set_bound_location('bzr://foo/old-bound')
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
142
        branch.set_bound_location(None)
2796.2.22 by Aaron Bentley
Tweak from review
143
        self.assertEqual('bzr://foo/old-bound',
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
144
                         reconfiguration._select_bind_location())
2796.2.22 by Aaron Bentley
Tweak from review
145
        branch.set_bound_location('bzr://foo/cur-bound')
146
        self.assertEqual('bzr://foo/cur-bound',
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
147
                         reconfiguration._select_bind_location())
2796.2.11 by Aaron Bentley
Cleanups
148
        reconfiguration.new_bound_location = 'ftp://user-specified'
149
        self.assertEqual('ftp://user-specified',
150
                         reconfiguration._select_bind_location())
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
151
2796.2.9 by Aaron Bentley
Ensure conversion from lightweight checkout works
152
    def test_select_reference_bind_location(self):
153
        branch = self.make_branch('branch')
154
        checkout = branch.create_checkout('checkout', lightweight=True)
155
        reconfiguration = reconfigure.Reconfigure(checkout.bzrdir)
156
        self.assertEqual(branch.base,
157
                         reconfiguration._select_bind_location())
158
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
159
    def test_tree_to_checkout(self):
160
        # A tree with no related branches and no supplied bind location cannot
161
        # become a checkout
162
        parent = self.make_branch('parent')
163
164
        tree = self.make_branch_and_tree('tree')
165
        reconfiguration = reconfigure.Reconfigure.to_checkout(tree.bzrdir)
166
        self.assertRaises(errors.NoBindLocation, reconfiguration.apply)
167
        # setting a parent allows it to become a checkout
168
        tree.branch.set_parent(parent.base)
169
        reconfiguration.apply()
170
        # supplying a location allows it to become a checkout
171
        tree2 = self.make_branch_and_tree('tree2')
172
        reconfiguration = reconfigure.Reconfigure.to_checkout(tree2.bzrdir,
173
                                                              parent.base)
2796.2.4 by Aaron Bentley
Fix support for reconfiguring to selected bound location
174
        reconfiguration.apply()
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
175
2796.2.26 by Aaron Bentley
Support converting standalone tree to lightweight checkout
176
    def test_tree_to_lightweight_checkout(self):
177
        # A tree with no related branches and no supplied bind location cannot
178
        # become a checkout
179
        parent = self.make_branch('parent')
180
181
        tree = self.make_branch_and_tree('tree')
182
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
183
            tree.bzrdir)
184
        self.assertRaises(errors.NoBindLocation, reconfiguration.apply)
185
        # setting a parent allows it to become a checkout
186
        tree.branch.set_parent(parent.base)
187
        reconfiguration.apply()
188
        # supplying a location allows it to become a checkout
189
        tree2 = self.make_branch_and_tree('tree2')
190
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
191
            tree2.bzrdir, parent.base)
192
        reconfiguration.apply()
193
2796.2.3 by Aaron Bentley
Implement conversion to tree and checkout
194
    def test_checkout_to_checkout(self):
195
        parent = self.make_branch('parent')
196
        checkout = parent.create_checkout('checkout')
197
        self.assertRaises(errors.AlreadyCheckout,
198
                          reconfigure.Reconfigure.to_checkout, checkout.bzrdir)
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
199
200
    def test_checkout_to_lightweight(self):
201
        parent = self.make_branch('parent')
202
        checkout = parent.create_checkout('checkout')
203
        checkout.commit('test', rev_id='new-commit', local=True)
204
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
205
            checkout.bzrdir)
206
        reconfiguration.apply()
207
        wt = checkout.bzrdir.open_workingtree()
208
        self.assertTrue(parent.repository.has_same_location(
209
            wt.branch.repository))
210
        parent.repository.get_revision('new-commit')
211
        self.assertRaises(errors.NoRepositoryPresent,
212
                          checkout.bzrdir.open_repository)
213
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
214
    def prepare_branch_to_lightweight_checkout(self):
215
        parent = self.make_branch('parent')
216
        child = parent.bzrdir.sprout('child').open_workingtree()
217
        child.commit('test', rev_id='new-commit')
218
        child.bzrdir.destroy_workingtree()
219
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
220
            child.bzrdir)
221
        return parent, child, reconfiguration
222
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
223
    def test_branch_to_lightweight_checkout(self):
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
224
        parent, child, reconfiguration = \
225
            self.prepare_branch_to_lightweight_checkout()
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
226
        reconfiguration.apply()
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
227
        self.assertTrue(reconfiguration._destroy_branch)
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
228
        wt = child.bzrdir.open_workingtree()
229
        self.assertTrue(parent.repository.has_same_location(
230
            wt.branch.repository))
231
        parent.repository.get_revision('new-commit')
232
        self.assertRaises(errors.NoRepositoryPresent,
233
                          child.bzrdir.open_repository)
234
2796.2.30 by Aaron Bentley
Reconfigure can safely be interrupted while fetching (#179316)
235
    def test_branch_to_lightweight_checkout_failure(self):
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
236
        parent, child, reconfiguration = \
237
            self.prepare_branch_to_lightweight_checkout()
2796.2.30 by Aaron Bentley
Reconfigure can safely be interrupted while fetching (#179316)
238
        old_Repository_fetch = repository.Repository.fetch
239
        repository.Repository.fetch = None
240
        try:
241
            self.assertRaises(TypeError, reconfiguration.apply)
242
        finally:
243
            repository.Repository.fetch = old_Repository_fetch
244
        child = _mod_branch.Branch.open('child')
245
        self.assertContainsRe(child.base, 'child/$')
246
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
247
    def test_branch_to_lightweight_checkout_fetch_tags(self):
248
        parent, child, reconfiguration = \
249
            self.prepare_branch_to_lightweight_checkout()
250
        child.branch.tags.set_tag('foo', 'bar')
251
        reconfiguration.apply()
252
        child = _mod_branch.Branch.open('child')
253
        self.assertEqual('bar', parent.tags.lookup_tag('foo'))
254
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
255
    def test_lightweight_checkout_to_lightweight_checkout(self):
256
        parent = self.make_branch('parent')
257
        checkout = parent.create_checkout('checkout', lightweight=True)
258
        self.assertRaises(errors.AlreadyLightweightCheckout,
259
                          reconfigure.Reconfigure.to_lightweight_checkout,
260
                          checkout.bzrdir)
2796.2.23 by Aaron Bentley
Add support for reconfiguring repositories into branches or trees
261
262
    def test_repo_to_tree(self):
263
        repo = self.make_repository('repo')
264
        reconfiguration = reconfigure.Reconfigure.to_tree(repo.bzrdir)
265
        reconfiguration.apply()
266
        workingtree.WorkingTree.open('repo')
267
2796.2.25 by Aaron Bentley
Avoid destroying shared repositories
268
    def test_shared_repo_to_lightweight_checkout(self):
269
        repo = self.make_repository('repo', shared=True)
2796.2.23 by Aaron Bentley
Add support for reconfiguring repositories into branches or trees
270
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
271
            repo.bzrdir)
272
        self.assertRaises(errors.NoBindLocation, reconfiguration.apply)
273
        branch = self.make_branch('branch')
274
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
275
            repo.bzrdir, 'branch')
276
        reconfiguration.apply()
2796.2.25 by Aaron Bentley
Avoid destroying shared repositories
277
        workingtree.WorkingTree.open('repo')
278
        repository.Repository.open('repo')
279
280
    def test_unshared_repo_to_lightweight_checkout(self):
281
        repo = self.make_repository('repo', shared=False)
282
        branch = self.make_branch('branch')
283
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
284
            repo.bzrdir, 'branch')
285
        reconfiguration.apply()
286
        workingtree.WorkingTree.open('repo')
287
        self.assertRaises(errors.NoRepositoryPresent,
288
                          repository.Repository.open, 'repo')