~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
3338.1.2 by Aaron Bentley
Split out tests even further
200
    def make_unsynced_checkout(self):
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
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)
3338.1.2 by Aaron Bentley
Split out tests even further
206
        return checkout, parent, reconfiguration
207
208
    def test_unsynced_checkout_to_lightweight(self):
209
        checkout, parent, reconfiguration = self.make_unsynced_checkout()
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
210
        self.assertRaises(errors.UnsyncedBranches, reconfiguration.apply)
3338.1.2 by Aaron Bentley
Split out tests even further
211
212
    def test_synced_checkout_to_lightweight(self):
213
        checkout, parent, reconfiguration = self.make_unsynced_checkout()
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
214
        parent.pull(checkout.branch)
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
215
        reconfiguration.apply()
216
        wt = checkout.bzrdir.open_workingtree()
217
        self.assertTrue(parent.repository.has_same_location(
218
            wt.branch.repository))
219
        parent.repository.get_revision('new-commit')
220
        self.assertRaises(errors.NoRepositoryPresent,
221
                          checkout.bzrdir.open_repository)
222
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
223
    def prepare_branch_to_lightweight_checkout(self):
224
        parent = self.make_branch('parent')
225
        child = parent.bzrdir.sprout('child').open_workingtree()
226
        child.commit('test', rev_id='new-commit')
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
227
        parent.pull(child.branch)
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
228
        child.bzrdir.destroy_workingtree()
229
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
230
            child.bzrdir)
231
        return parent, child, reconfiguration
232
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
233
    def test_branch_to_lightweight_checkout(self):
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
234
        parent, child, reconfiguration = \
235
            self.prepare_branch_to_lightweight_checkout()
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
236
        reconfiguration.apply()
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
237
        self.assertTrue(reconfiguration._destroy_branch)
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
238
        wt = child.bzrdir.open_workingtree()
239
        self.assertTrue(parent.repository.has_same_location(
240
            wt.branch.repository))
241
        parent.repository.get_revision('new-commit')
242
        self.assertRaises(errors.NoRepositoryPresent,
243
                          child.bzrdir.open_repository)
244
2796.2.30 by Aaron Bentley
Reconfigure can safely be interrupted while fetching (#179316)
245
    def test_branch_to_lightweight_checkout_failure(self):
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
246
        parent, child, reconfiguration = \
247
            self.prepare_branch_to_lightweight_checkout()
2796.2.30 by Aaron Bentley
Reconfigure can safely be interrupted while fetching (#179316)
248
        old_Repository_fetch = repository.Repository.fetch
249
        repository.Repository.fetch = None
250
        try:
251
            self.assertRaises(TypeError, reconfiguration.apply)
252
        finally:
253
            repository.Repository.fetch = old_Repository_fetch
254
        child = _mod_branch.Branch.open('child')
255
        self.assertContainsRe(child.base, 'child/$')
256
2796.2.31 by Aaron Bentley
Fetch tags to reference branch when converting to checkout
257
    def test_branch_to_lightweight_checkout_fetch_tags(self):
258
        parent, child, reconfiguration = \
259
            self.prepare_branch_to_lightweight_checkout()
260
        child.branch.tags.set_tag('foo', 'bar')
261
        reconfiguration.apply()
262
        child = _mod_branch.Branch.open('child')
263
        self.assertEqual('bar', parent.tags.lookup_tag('foo'))
264
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
265
    def test_lightweight_checkout_to_lightweight_checkout(self):
266
        parent = self.make_branch('parent')
267
        checkout = parent.create_checkout('checkout', lightweight=True)
268
        self.assertRaises(errors.AlreadyLightweightCheckout,
269
                          reconfigure.Reconfigure.to_lightweight_checkout,
270
                          checkout.bzrdir)
2796.2.23 by Aaron Bentley
Add support for reconfiguring repositories into branches or trees
271
272
    def test_repo_to_tree(self):
273
        repo = self.make_repository('repo')
274
        reconfiguration = reconfigure.Reconfigure.to_tree(repo.bzrdir)
275
        reconfiguration.apply()
276
        workingtree.WorkingTree.open('repo')
277
2796.2.25 by Aaron Bentley
Avoid destroying shared repositories
278
    def test_shared_repo_to_lightweight_checkout(self):
279
        repo = self.make_repository('repo', shared=True)
2796.2.23 by Aaron Bentley
Add support for reconfiguring repositories into branches or trees
280
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
281
            repo.bzrdir)
282
        self.assertRaises(errors.NoBindLocation, reconfiguration.apply)
283
        branch = self.make_branch('branch')
284
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
285
            repo.bzrdir, 'branch')
286
        reconfiguration.apply()
2796.2.25 by Aaron Bentley
Avoid destroying shared repositories
287
        workingtree.WorkingTree.open('repo')
288
        repository.Repository.open('repo')
289
290
    def test_unshared_repo_to_lightweight_checkout(self):
291
        repo = self.make_repository('repo', shared=False)
292
        branch = self.make_branch('branch')
293
        reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
294
            repo.bzrdir, 'branch')
295
        reconfiguration.apply()
296
        workingtree.WorkingTree.open('repo')
297
        self.assertRaises(errors.NoRepositoryPresent,
298
                          repository.Repository.open, 'repo')
3311.2.1 by Aaron Bentley
Initial make-sharing functionality
299
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
300
    def test_standalone_to_use_shared(self):
3311.2.1 by Aaron Bentley
Initial make-sharing functionality
301
        self.build_tree(['root/'])
302
        tree = self.make_branch_and_tree('root/tree')
303
        tree.commit('Hello', rev_id='hello-id')
304
        repo = self.make_repository('root', shared=True)
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
305
        reconfiguration = reconfigure.Reconfigure.to_use_shared(tree.bzrdir)
3311.2.1 by Aaron Bentley
Initial make-sharing functionality
306
        reconfiguration.apply()
307
        tree = workingtree.WorkingTree.open('root/tree')
308
        self.assertTrue(repo.has_same_location(tree.branch.repository))
309
        self.assertEqual('Hello', repo.get_revision('hello-id').message)
3311.2.2 by Aaron Bentley
Flesh out to_sharing
310
3311.2.7 by Aaron Bentley
Get head preservation under test
311
    def add_dead_head(self, tree):
312
        revno, revision_id = tree.branch.last_revision_info()
313
        tree.commit('Dead head', rev_id='dead-head-id')
314
        tree.branch.set_last_revision_info(revno, revision_id)
315
        tree.set_last_revision(revision_id)
316
317
    def test_standalone_to_use_shared_preserves_dead_heads(self):
318
        self.build_tree(['root/'])
319
        tree = self.make_branch_and_tree('root/tree')
320
        self.add_dead_head(tree)
321
        tree.commit('Hello', rev_id='hello-id')
322
        repo = self.make_repository('root', shared=True)
323
        reconfiguration = reconfigure.Reconfigure.to_use_shared(tree.bzrdir)
324
        reconfiguration.apply()
325
        tree = workingtree.WorkingTree.open('root/tree')
326
        message = repo.get_revision('dead-head-id').message
327
        self.assertEqual('Dead head', message)
328
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
329
    def make_repository_tree(self):
3311.2.4 by Aaron Bentley
Implement conversion to standalone
330
        self.build_tree(['root/'])
331
        repo = self.make_repository('root', shared=True)
332
        tree = self.make_branch_and_tree('root/tree')
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
333
        reconfigure.Reconfigure.to_use_shared(tree.bzrdir).apply()
3311.2.4 by Aaron Bentley
Implement conversion to standalone
334
        return workingtree.WorkingTree.open('root/tree')
335
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
336
    def test_use_shared_to_use_shared(self):
337
        tree = self.make_repository_tree()
338
        self.assertRaises(errors.AlreadyUsingShared,
339
                          reconfigure.Reconfigure.to_use_shared, tree.bzrdir)
3311.2.4 by Aaron Bentley
Implement conversion to standalone
340
3311.2.6 by Aaron Bentley
rename 'sharing' to 'use-shared'
341
    def test_use_shared_to_standalone(self):
342
        tree = self.make_repository_tree()
3311.2.4 by Aaron Bentley
Implement conversion to standalone
343
        tree.commit('Hello', rev_id='hello-id')
344
        reconfigure.Reconfigure.to_standalone(tree.bzrdir).apply()
345
        tree = workingtree.WorkingTree.open('root/tree')
346
        repo = tree.branch.repository
347
        self.assertEqual(repo.bzrdir.root_transport.base,
348
                         tree.bzrdir.root_transport.base)
349
        self.assertEqual('Hello', repo.get_revision('hello-id').message)
350
3311.2.7 by Aaron Bentley
Get head preservation under test
351
    def test_use_shared_to_standalone_preserves_dead_heads(self):
352
        tree = self.make_repository_tree()
353
        self.add_dead_head(tree)
354
        tree.commit('Hello', rev_id='hello-id')
355
        reconfigure.Reconfigure.to_standalone(tree.bzrdir).apply()
356
        tree = workingtree.WorkingTree.open('root/tree')
357
        repo = tree.branch.repository
358
        self.assertRaises(errors.NoSuchRevision, repo.get_revision,
359
                          'dead-head-id')
360
3311.2.4 by Aaron Bentley
Implement conversion to standalone
361
    def test_standalone_to_standalone(self):
362
        tree = self.make_branch_and_tree('tree')
363
        self.assertRaises(errors.AlreadyStandalone,
364
                          reconfigure.Reconfigure.to_standalone, tree.bzrdir)
3338.1.3 by Aaron Bentley
Merge bzr.dev
365
3338.1.2 by Aaron Bentley
Split out tests even further
366
    def make_unsynced_branch_reconfiguration(self):
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
367
        parent = self.make_branch_and_tree('parent')
368
        parent.commit('commit 1')
369
        child = parent.bzrdir.sprout('child').open_workingtree()
370
        child.commit('commit 2')
3338.1.2 by Aaron Bentley
Split out tests even further
371
        return reconfigure.Reconfigure.to_lightweight_checkout(child.bzrdir)
372
373
    def test_unsynced_branch_to_lightweight_checkout_unforced(self):
374
        reconfiguration = self.make_unsynced_branch_reconfiguration()
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
375
        self.assertRaises(errors.UnsyncedBranches, reconfiguration.apply)
3338.1.2 by Aaron Bentley
Split out tests even further
376
377
    def test_unsynced_branch_to_lightweight_checkout_forced(self):
378
        reconfiguration = self.make_unsynced_branch_reconfiguration()
3338.1.1 by Aaron Bentley
Raise an error when converting a branch to a lightweight checkout loses data
379
        reconfiguration.apply(force=True)