/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1534.4.39 by Robert Collins
Basic BzrDir support.
1
# (C) 2005, 2006 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
"""Tests for bzrdir implementations - tests a bzrdir format."""
18
19
import os
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
20
from stat import *
1534.4.39 by Robert Collins
Basic BzrDir support.
21
import sys
22
1508.1.25 by Robert Collins
Update per review comments.
23
import bzrlib.branch
1534.4.39 by Robert Collins
Basic BzrDir support.
24
import bzrlib.bzrdir as bzrdir
25
from bzrlib.branch import Branch, needs_read_lock, needs_write_lock
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
26
from bzrlib.check import check
1534.4.39 by Robert Collins
Basic BzrDir support.
27
from bzrlib.commit import commit
28
import bzrlib.errors as errors
29
from bzrlib.errors import (FileExists,
30
                           NoSuchRevision,
31
                           NoSuchFile,
32
                           UninitializableFormat,
33
                           NotBranchError,
34
                           )
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
35
import bzrlib.repository as repository
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
36
from bzrlib.tests import (
37
                          ChrootedTestCase,
38
                          TestCase,
39
                          TestCaseWithTransport,
40
                          TestSkipped,
41
                          )
1534.4.39 by Robert Collins
Basic BzrDir support.
42
from bzrlib.trace import mutter
43
import bzrlib.transactions as transactions
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
44
import bzrlib.transport as transport
1534.4.39 by Robert Collins
Basic BzrDir support.
45
from bzrlib.transport import get_transport
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
46
import bzrlib.ui as ui
1534.4.39 by Robert Collins
Basic BzrDir support.
47
from bzrlib.upgrade import upgrade
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
48
import bzrlib.workingtree as workingtree
1534.4.39 by Robert Collins
Basic BzrDir support.
49
50
51
class TestCaseWithBzrDir(TestCaseWithTransport):
52
53
    def setUp(self):
54
        super(TestCaseWithBzrDir, self).setUp()
55
        self.bzrdir = None
56
57
    def get_bzrdir(self):
58
        if self.bzrdir is None:
59
            self.bzrdir = self.make_bzrdir(None)
60
        return self.bzrdir
61
62
    def make_bzrdir(self, relpath):
63
        try:
64
            url = self.get_url(relpath)
65
            segments = url.split('/')
66
            if segments and segments[-1] not in ('', '.'):
67
                parent = '/'.join(segments[:-1])
68
                t = get_transport(parent)
69
                try:
70
                    t.mkdir(segments[-1])
71
                except FileExists:
72
                    pass
73
            return self.bzrdir_format.initialize(url)
74
        except UninitializableFormat:
75
            raise TestSkipped("Format %s is not initializable.")
76
77
78
class TestBzrDir(TestCaseWithBzrDir):
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
79
    # Many of these tests test for disk equality rather than checking
80
    # for semantic equivalence. This works well for some tests but
81
    # is not good at handling changes in representation or the addition
82
    # or removal of control data. It would be nice to for instance:
83
    # sprout a new branch, check that the nickname has been reset by hand
84
    # and then set the nickname to match the source branch, at which point
85
    # a semantic equivalence should pass
86
87
    def assertDirectoriesEqual(self, source, target, ignore_list=[]):
88
        """Assert that the content of source and target are identical.
89
90
        paths in ignore list will be completely ignored.
91
        """
92
        files = []
93
        directories = ['.']
94
        while directories:
95
            dir = directories.pop()
96
            for path in source.list_dir(dir):
97
                path = dir + '/' + path
98
                if path in ignore_list:
99
                    continue
100
                stat = source.stat(path)
101
                if S_ISDIR(stat.st_mode):
102
                    self.assertTrue(S_ISDIR(target.stat(path).st_mode))
103
                    directories.append(path)
104
                else:
105
                    self.assertEqualDiff(source.get(path).read(),
106
                                         target.get(path).read(),
107
                                         "text for file %r differs:\n" % path)
108
109
    def test_clone_bzrdir_empty(self):
110
        dir = self.make_bzrdir('source')
111
        target = dir.clone(self.get_url('target'))
112
        self.assertNotEqual(dir.transport.base, target.transport.base)
113
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
114
    
1534.6.8 by Robert Collins
Test the use of clone on empty bzrdir with force_new_repo.
115
    def test_clone_bzrdir_empty_force_new_ignored(self):
1534.6.9 by Robert Collins
sprouting into shared repositories
116
        # the force_new_repo parameter should have no effect on an empty
1534.6.8 by Robert Collins
Test the use of clone on empty bzrdir with force_new_repo.
117
        # bzrdir's clone logic
118
        dir = self.make_bzrdir('source')
119
        target = dir.clone(self.get_url('target'), force_new_repo=True)
120
        self.assertNotEqual(dir.transport.base, target.transport.base)
121
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
122
    
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
123
    def test_clone_bzrdir_repository(self):
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
124
        tree = self.make_branch_and_tree('commit_tree')
125
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
126
        tree.add('foo')
127
        tree.commit('revision 1', rev_id='1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
128
        dir = self.make_bzrdir('source')
129
        repo = dir.create_repository()
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
130
        repo.fetch(tree.branch.repository)
131
        self.assertTrue(repo.has_revision('1'))
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
132
        target = dir.clone(self.get_url('target'))
133
        self.assertNotEqual(dir.transport.base, target.transport.base)
134
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
135
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
136
    def test_clone_bzrdir_repository_under_shared(self):
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
137
        tree = self.make_branch_and_tree('commit_tree')
138
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
139
        tree.add('foo')
140
        tree.commit('revision 1', rev_id='1')
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
141
        dir = self.make_bzrdir('source')
142
        repo = dir.create_repository()
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
143
        repo.fetch(tree.branch.repository)
144
        self.assertTrue(repo.has_revision('1'))
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
145
        try:
146
            self.make_repository('target', shared=True)
147
        except errors.IncompatibleFormat:
148
            return
149
        target = dir.clone(self.get_url('target/child'))
150
        self.assertNotEqual(dir.transport.base, target.transport.base)
151
        self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
1534.6.13 by Robert Collins
Allow push/pull and branch between branches in the same shared repository.
152
153
    def test_clone_bzrdir_repository_branch_both_under_shared(self):
154
        try:
155
            shared_repo = self.make_repository('shared', shared=True)
156
        except errors.IncompatibleFormat:
157
            return
158
        tree = self.make_branch_and_tree('commit_tree')
159
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
160
        tree.add('foo')
161
        tree.commit('revision 1', rev_id='1')
162
        tree.bzrdir.open_branch().set_revision_history([])
163
        tree.set_last_revision(None)
164
        tree.commit('revision 2', rev_id='2')
165
        tree.bzrdir.open_repository().copy_content_into(shared_repo)
166
        dir = self.make_bzrdir('shared/source')
167
        dir.create_branch()
168
        target = dir.clone(self.get_url('shared/target'))
169
        self.assertNotEqual(dir.transport.base, target.transport.base)
170
        self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
171
        self.assertTrue(shared_repo.has_revision('1'))
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
172
        
1534.6.9 by Robert Collins
sprouting into shared repositories
173
    def test_clone_bzrdir_repository_under_shared_force_new_repo(self):
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
174
        tree = self.make_branch_and_tree('commit_tree')
175
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
176
        tree.add('foo')
177
        tree.commit('revision 1', rev_id='1')
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
178
        dir = self.make_bzrdir('source')
179
        repo = dir.create_repository()
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
180
        repo.fetch(tree.branch.repository)
181
        self.assertTrue(repo.has_revision('1'))
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
182
        try:
183
            self.make_repository('target', shared=True)
184
        except errors.IncompatibleFormat:
185
            return
186
        target = dir.clone(self.get_url('target/child'), force_new_repo=True)
187
        self.assertNotEqual(dir.transport.base, target.transport.base)
188
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
189
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
190
    def test_clone_bzrdir_repository_revision(self):
191
        # test for revision limiting, [smoke test, not corner case checks].
192
        # make a repository with some revisions,
193
        # and clone it with a revision limit.
194
        # 
195
        tree = self.make_branch_and_tree('commit_tree')
196
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
197
        tree.add('foo')
198
        tree.commit('revision 1', rev_id='1')
199
        tree.bzrdir.open_branch().set_revision_history([])
200
        tree.set_last_revision(None)
201
        tree.commit('revision 2', rev_id='2')
202
        source = self.make_repository('source')
203
        tree.bzrdir.open_repository().copy_content_into(source)
204
        dir = source.bzrdir
205
        target = dir.clone(self.get_url('target'), revision_id='2')
206
        raise TestSkipped('revision limiting not strict yet')
207
208
    def test_clone_bzrdir_branch_and_repo(self):
209
        tree = self.make_branch_and_tree('commit_tree')
210
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
211
        tree.add('foo')
212
        tree.commit('revision 1')
213
        source = self.make_branch('source')
214
        tree.bzrdir.open_repository().copy_content_into(source.repository)
215
        tree.bzrdir.open_branch().copy_content_into(source)
216
        dir = source.bzrdir
217
        target = dir.clone(self.get_url('target'))
218
        self.assertNotEqual(dir.transport.base, target.transport.base)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
219
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
220
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
221
222
    def test_clone_bzrdir_branch_and_repo_into_shared_repo(self):
223
        # by default cloning into a shared repo uses the shared repo.
224
        tree = self.make_branch_and_tree('commit_tree')
225
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
226
        tree.add('foo')
227
        tree.commit('revision 1')
228
        source = self.make_branch('source')
229
        tree.bzrdir.open_repository().copy_content_into(source.repository)
230
        tree.bzrdir.open_branch().copy_content_into(source)
231
        try:
232
            self.make_repository('target', shared=True)
233
        except errors.IncompatibleFormat:
234
            return
235
        dir = source.bzrdir
236
        target = dir.clone(self.get_url('target/child'))
237
        self.assertNotEqual(dir.transport.base, target.transport.base)
238
        self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
239
        self.assertEqual(source.revision_history(),
240
                         target.open_branch().revision_history())
241
242
    def test_clone_bzrdir_branch_and_repo_into_shared_repo_force_new_repo(self):
243
        # by default cloning into a shared repo uses the shared repo.
244
        tree = self.make_branch_and_tree('commit_tree')
245
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
246
        tree.add('foo')
247
        tree.commit('revision 1')
248
        source = self.make_branch('source')
249
        tree.bzrdir.open_repository().copy_content_into(source.repository)
250
        tree.bzrdir.open_branch().copy_content_into(source)
251
        try:
252
            self.make_repository('target', shared=True)
253
        except errors.IncompatibleFormat:
254
            return
255
        dir = source.bzrdir
256
        target = dir.clone(self.get_url('target/child'), force_new_repo=True)
257
        self.assertNotEqual(dir.transport.base, target.transport.base)
258
        target.open_repository()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
259
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
260
261
    def test_clone_bzrdir_branch_reference(self):
262
        # cloning should preserve the reference status of the branch in a bzrdir
263
        referenced_branch = self.make_branch('referencced')
264
        dir = self.make_bzrdir('source')
265
        try:
1508.1.25 by Robert Collins
Update per review comments.
266
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
267
                referenced_branch)
268
        except errors.IncompatibleFormat:
269
            # this is ok too, not all formats have to support references.
270
            return
271
        target = dir.clone(self.get_url('target'))
272
        self.assertNotEqual(dir.transport.base, target.transport.base)
273
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
274
275
    def test_clone_bzrdir_branch_revision(self):
276
        # test for revision limiting, [smoke test, not corner case checks].
277
        # make a branch with some revisions,
278
        # and clone it with a revision limit.
279
        # 
280
        tree = self.make_branch_and_tree('commit_tree')
281
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
282
        tree.add('foo')
283
        tree.commit('revision 1', rev_id='1')
284
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
285
        source = self.make_branch('source')
286
        tree.bzrdir.open_repository().copy_content_into(source.repository)
287
        tree.bzrdir.open_branch().copy_content_into(source)
288
        dir = source.bzrdir
289
        target = dir.clone(self.get_url('target'), revision_id='1')
290
        self.assertEqual('1', target.open_branch().last_revision())
291
        
292
    def test_clone_bzrdir_tree_branch_repo(self):
293
        tree = self.make_branch_and_tree('sourcce')
294
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
295
        tree.add('foo')
296
        tree.commit('revision 1')
297
        dir = tree.bzrdir
298
        target = dir.clone(self.get_url('target'))
299
        self.assertNotEqual(dir.transport.base, target.transport.base)
300
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
1508.1.20 by Robert Collins
Create a checkout command.
301
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
1534.7.175 by Aaron Bentley
Ensured revert writes a normal inventory
302
        target.open_workingtree().revert([])
303
304
    def test_revert_inventory(self):
305
        tree = self.make_branch_and_tree('sourcce')
306
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
307
        tree.add('foo')
308
        tree.commit('revision 1')
309
        dir = tree.bzrdir
310
        target = dir.clone(self.get_url('target'))
311
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
312
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
313
        target.open_workingtree().revert([])
314
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
315
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
316
317
    def test_clone_bzrdir_tree_branch_reference(self):
318
        # a tree with a branch reference (aka a checkout) 
319
        # should stay a checkout on clone.
320
        referenced_branch = self.make_branch('referencced')
321
        dir = self.make_bzrdir('source')
322
        try:
1508.1.25 by Robert Collins
Update per review comments.
323
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
324
                referenced_branch)
325
        except errors.IncompatibleFormat:
326
            # this is ok too, not all formats have to support references.
327
            return
328
        dir.create_workingtree()
329
        target = dir.clone(self.get_url('target'))
330
        self.assertNotEqual(dir.transport.base, target.transport.base)
331
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
1508.1.20 by Robert Collins
Create a checkout command.
332
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
333
334
    def test_clone_bzrdir_tree_revision(self):
335
        # test for revision limiting, [smoke test, not corner case checks].
336
        # make a tree with a revision with a last-revision
337
        # and clone it with a revision limit.
338
        # This smoke test just checks the revision-id is right. Tree specific
339
        # tests will check corner cases.
340
        tree = self.make_branch_and_tree('source')
341
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
342
        tree.add('foo')
343
        tree.commit('revision 1', rev_id='1')
344
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
345
        dir = tree.bzrdir
346
        target = dir.clone(self.get_url('target'), revision_id='1')
347
        self.assertEqual('1', target.open_workingtree().last_revision())
348
349
    def test_clone_bzrdir_incomplete_source_with_basis(self):
350
        # ensure that basis really does grab from the basis by having incomplete source
351
        tree = self.make_branch_and_tree('commit_tree')
352
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
353
        tree.add('foo')
354
        tree.commit('revision 1', rev_id='1')
355
        source = self.make_branch_and_tree('source')
356
        # this gives us an incomplete repository
357
        tree.bzrdir.open_repository().copy_content_into(source.branch.repository)
358
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
359
        tree.bzrdir.open_branch().copy_content_into(source.branch)
360
        tree.copy_content_into(source)
361
        self.assertFalse(source.branch.repository.has_revision('2'))
362
        dir = source.bzrdir
363
        target = dir.clone(self.get_url('target'), basis=tree.bzrdir)
364
        self.assertEqual('2', target.open_branch().last_revision())
365
        self.assertEqual('2', target.open_workingtree().last_revision())
366
        self.assertTrue(target.open_branch().repository.has_revision('2'))
367
368
    def test_sprout_bzrdir_empty(self):
369
        dir = self.make_bzrdir('source')
370
        target = dir.sprout(self.get_url('target'))
371
        self.assertNotEqual(dir.transport.base, target.transport.base)
372
        # creates a new repository branch and tree
373
        target.open_repository()
374
        target.open_branch()
375
        target.open_workingtree()
1534.6.9 by Robert Collins
sprouting into shared repositories
376
377
    def test_sprout_bzrdir_empty_under_shared_repo(self):
378
        # sprouting an empty dir into a repo uses the repo
379
        dir = self.make_bzrdir('source')
380
        try:
381
            self.make_repository('target', shared=True)
382
        except errors.IncompatibleFormat:
383
            return
384
        target = dir.sprout(self.get_url('target/child'))
385
        self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
386
        target.open_branch()
387
        target.open_workingtree()
388
389
    def test_sprout_bzrdir_empty_under_shared_repo(self):
390
        # the force_new_repo parameter should force use of a new repo in an empty
391
        # bzrdir's sprout logic
392
        dir = self.make_bzrdir('source')
393
        try:
394
            self.make_repository('target', shared=True)
395
        except errors.IncompatibleFormat:
396
            return
397
        target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
398
        target.open_repository()
399
        target.open_branch()
400
        target.open_workingtree()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
401
    
402
    def test_sprout_bzrdir_repository(self):
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
403
        tree = self.make_branch_and_tree('commit_tree')
404
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
405
        tree.add('foo')
406
        tree.commit('revision 1', rev_id='1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
407
        dir = self.make_bzrdir('source')
408
        repo = dir.create_repository()
1534.1.33 by Robert Collins
Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations.
409
        repo.fetch(tree.branch.repository)
410
        self.assertTrue(repo.has_revision('1'))
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
411
        target = dir.sprout(self.get_url('target'))
412
        self.assertNotEqual(dir.transport.base, target.transport.base)
413
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
414
1534.6.13 by Robert Collins
Allow push/pull and branch between branches in the same shared repository.
415
    def test_sprout_bzrdir_with_repository_to_shared(self):
1534.6.9 by Robert Collins
sprouting into shared repositories
416
        tree = self.make_branch_and_tree('commit_tree')
417
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
418
        tree.add('foo')
419
        tree.commit('revision 1', rev_id='1')
420
        tree.bzrdir.open_branch().set_revision_history([])
421
        tree.set_last_revision(None)
422
        tree.commit('revision 2', rev_id='2')
423
        source = self.make_repository('source')
424
        tree.bzrdir.open_repository().copy_content_into(source)
425
        dir = source.bzrdir
426
        try:
427
            shared_repo = self.make_repository('target', shared=True)
428
        except errors.IncompatibleFormat:
429
            return
430
        target = dir.sprout(self.get_url('target/child'))
431
        self.assertNotEqual(dir.transport.base, target.transport.base)
432
        self.assertTrue(shared_repo.has_revision('1'))
433
1534.6.13 by Robert Collins
Allow push/pull and branch between branches in the same shared repository.
434
    def test_sprout_bzrdir_repository_branch_both_under_shared(self):
435
        try:
436
            shared_repo = self.make_repository('shared', shared=True)
437
        except errors.IncompatibleFormat:
438
            return
439
        tree = self.make_branch_and_tree('commit_tree')
440
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
441
        tree.add('foo')
442
        tree.commit('revision 1', rev_id='1')
443
        tree.bzrdir.open_branch().set_revision_history([])
444
        tree.set_last_revision(None)
445
        tree.commit('revision 2', rev_id='2')
446
        tree.bzrdir.open_repository().copy_content_into(shared_repo)
447
        dir = self.make_bzrdir('shared/source')
448
        dir.create_branch()
449
        target = dir.sprout(self.get_url('shared/target'))
450
        self.assertNotEqual(dir.transport.base, target.transport.base)
451
        self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
452
        self.assertTrue(shared_repo.has_revision('1'))
453
1534.6.9 by Robert Collins
sprouting into shared repositories
454
    def test_sprout_bzrdir_repository_under_shared_force_new_repo(self):
455
        tree = self.make_branch_and_tree('commit_tree')
456
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
457
        tree.add('foo')
458
        tree.commit('revision 1', rev_id='1')
459
        tree.bzrdir.open_branch().set_revision_history([])
460
        tree.set_last_revision(None)
461
        tree.commit('revision 2', rev_id='2')
462
        source = self.make_repository('source')
463
        tree.bzrdir.open_repository().copy_content_into(source)
464
        dir = source.bzrdir
465
        try:
466
            shared_repo = self.make_repository('target', shared=True)
467
        except errors.IncompatibleFormat:
468
            return
469
        target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
470
        self.assertNotEqual(dir.transport.base, target.transport.base)
471
        self.assertFalse(shared_repo.has_revision('1'))
472
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
473
    def test_sprout_bzrdir_repository_revision(self):
474
        # test for revision limiting, [smoke test, not corner case checks].
475
        # make a repository with some revisions,
476
        # and sprout it with a revision limit.
477
        # 
478
        tree = self.make_branch_and_tree('commit_tree')
479
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
480
        tree.add('foo')
481
        tree.commit('revision 1', rev_id='1')
482
        tree.bzrdir.open_branch().set_revision_history([])
483
        tree.set_last_revision(None)
484
        tree.commit('revision 2', rev_id='2')
485
        source = self.make_repository('source')
486
        tree.bzrdir.open_repository().copy_content_into(source)
487
        dir = source.bzrdir
488
        target = dir.sprout(self.get_url('target'), revision_id='2')
489
        raise TestSkipped('revision limiting not strict yet')
490
491
    def test_sprout_bzrdir_branch_and_repo(self):
492
        tree = self.make_branch_and_tree('commit_tree')
493
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
494
        tree.add('foo')
495
        tree.commit('revision 1')
496
        source = self.make_branch('source')
497
        tree.bzrdir.open_repository().copy_content_into(source.repository)
498
        tree.bzrdir.open_branch().copy_content_into(source)
499
        dir = source.bzrdir
500
        target = dir.sprout(self.get_url('target'))
501
        self.assertNotEqual(dir.transport.base, target.transport.base)
502
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
503
1534.6.9 by Robert Collins
sprouting into shared repositories
504
    def test_sprout_bzrdir_branch_and_repo_shared(self):
505
        # sprouting a branch with a repo into a shared repo uses the shared
506
        # repo
507
        tree = self.make_branch_and_tree('commit_tree')
508
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
509
        tree.add('foo')
510
        tree.commit('revision 1', rev_id='1')
511
        source = self.make_branch('source')
512
        tree.bzrdir.open_repository().copy_content_into(source.repository)
513
        tree.bzrdir.open_branch().copy_content_into(source)
514
        dir = source.bzrdir
515
        try:
516
            shared_repo = self.make_repository('target', shared=True)
517
        except errors.IncompatibleFormat:
518
            return
519
        target = dir.sprout(self.get_url('target/child'))
520
        self.assertTrue(shared_repo.has_revision('1'))
521
522
    def test_sprout_bzrdir_branch_and_repo_shared_force_new_repo(self):
523
        # sprouting a branch with a repo into a shared repo uses the shared
524
        # repo
525
        tree = self.make_branch_and_tree('commit_tree')
526
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
527
        tree.add('foo')
528
        tree.commit('revision 1', rev_id='1')
529
        source = self.make_branch('source')
530
        tree.bzrdir.open_repository().copy_content_into(source.repository)
531
        tree.bzrdir.open_branch().copy_content_into(source)
532
        dir = source.bzrdir
533
        try:
534
            shared_repo = self.make_repository('target', shared=True)
535
        except errors.IncompatibleFormat:
536
            return
537
        target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
538
        self.assertNotEqual(dir.transport.base, target.transport.base)
539
        self.assertFalse(shared_repo.has_revision('1'))
540
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
541
    def test_sprout_bzrdir_branch_reference(self):
542
        # sprouting should create a repository if needed and a sprouted branch.
543
        referenced_branch = self.make_branch('referencced')
544
        dir = self.make_bzrdir('source')
545
        try:
1508.1.25 by Robert Collins
Update per review comments.
546
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
547
                referenced_branch)
548
        except errors.IncompatibleFormat:
549
            # this is ok too, not all formats have to support references.
550
            return
551
        self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
552
        target = dir.sprout(self.get_url('target'))
553
        self.assertNotEqual(dir.transport.base, target.transport.base)
554
        # we want target to have a branch that is in-place.
555
        self.assertEqual(target, target.open_branch().bzrdir)
556
        # and as we dont support repositories being detached yet, a repo in 
557
        # place
558
        target.open_repository()
559
1534.6.9 by Robert Collins
sprouting into shared repositories
560
    def test_sprout_bzrdir_branch_reference_shared(self):
561
        # sprouting should create a repository if needed and a sprouted branch.
562
        referenced_tree = self.make_branch_and_tree('referenced')
563
        referenced_tree.commit('1', rev_id='1', allow_pointless=True)
564
        dir = self.make_bzrdir('source')
565
        try:
566
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
567
                referenced_tree.branch)
568
        except errors.IncompatibleFormat:
569
            # this is ok too, not all formats have to support references.
570
            return
571
        self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
572
        try:
573
            shared_repo = self.make_repository('target', shared=True)
574
        except errors.IncompatibleFormat:
575
            return
576
        target = dir.sprout(self.get_url('target/child'))
577
        self.assertNotEqual(dir.transport.base, target.transport.base)
578
        # we want target to have a branch that is in-place.
579
        self.assertEqual(target, target.open_branch().bzrdir)
580
        # and we want no repository as the target is shared
581
        self.assertRaises(errors.NoRepositoryPresent, 
582
                          target.open_repository)
583
        # and we want revision '1' in the shared repo
584
        self.assertTrue(shared_repo.has_revision('1'))
585
586
    def test_sprout_bzrdir_branch_reference_shared_force_new_repo(self):
587
        # sprouting should create a repository if needed and a sprouted branch.
588
        referenced_tree = self.make_branch_and_tree('referenced')
589
        referenced_tree.commit('1', rev_id='1', allow_pointless=True)
590
        dir = self.make_bzrdir('source')
591
        try:
592
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
593
                referenced_tree.branch)
594
        except errors.IncompatibleFormat:
595
            # this is ok too, not all formats have to support references.
596
            return
597
        self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
598
        try:
599
            shared_repo = self.make_repository('target', shared=True)
600
        except errors.IncompatibleFormat:
601
            return
602
        target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
603
        self.assertNotEqual(dir.transport.base, target.transport.base)
604
        # we want target to have a branch that is in-place.
605
        self.assertEqual(target, target.open_branch().bzrdir)
606
        # and we want revision '1' in the new repo
607
        self.assertTrue(target.open_repository().has_revision('1'))
608
        # but not the shared one
609
        self.assertFalse(shared_repo.has_revision('1'))
610
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
611
    def test_sprout_bzrdir_branch_revision(self):
612
        # test for revision limiting, [smoke test, not corner case checks].
613
        # make a repository with some revisions,
614
        # and sprout it with a revision limit.
615
        # 
616
        tree = self.make_branch_and_tree('commit_tree')
617
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
618
        tree.add('foo')
619
        tree.commit('revision 1', rev_id='1')
620
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
621
        source = self.make_branch('source')
622
        tree.bzrdir.open_repository().copy_content_into(source.repository)
623
        tree.bzrdir.open_branch().copy_content_into(source)
624
        dir = source.bzrdir
625
        target = dir.sprout(self.get_url('target'), revision_id='1')
626
        self.assertEqual('1', target.open_branch().last_revision())
627
        
628
    def test_sprout_bzrdir_tree_branch_repo(self):
629
        tree = self.make_branch_and_tree('sourcce')
630
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
631
        tree.add('foo')
632
        tree.commit('revision 1')
633
        dir = tree.bzrdir
634
        target = dir.sprout(self.get_url('target'))
635
        self.assertNotEqual(dir.transport.base, target.transport.base)
636
        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
1508.1.20 by Robert Collins
Create a checkout command.
637
                                    ['./.bzr/stat-cache', './.bzr/checkout/stat-cache'])
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
638
639
    def test_sprout_bzrdir_tree_branch_reference(self):
640
        # sprouting should create a repository if needed and a sprouted branch.
641
        # the tree state should be copied.
642
        referenced_branch = self.make_branch('referencced')
643
        dir = self.make_bzrdir('source')
644
        try:
1508.1.25 by Robert Collins
Update per review comments.
645
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
646
                referenced_branch)
647
        except errors.IncompatibleFormat:
648
            # this is ok too, not all formats have to support references.
649
            return
650
        self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
651
        dir.create_workingtree()
652
        target = dir.sprout(self.get_url('target'))
653
        self.assertNotEqual(dir.transport.base, target.transport.base)
654
        # we want target to have a branch that is in-place.
655
        self.assertEqual(target, target.open_branch().bzrdir)
656
        # and as we dont support repositories being detached yet, a repo in 
657
        # place
658
        target.open_repository()
659
        # we trust that the working tree sprouting works via the other tests.
660
        target.open_workingtree()
661
662
    def test_sprout_bzrdir_tree_branch_reference_revision(self):
663
        # sprouting should create a repository if needed and a sprouted branch.
664
        # the tree state should be copied but the revision changed,
665
        # and the likewise the new branch should be truncated too
666
        referenced_branch = self.make_branch('referencced')
667
        dir = self.make_bzrdir('source')
668
        try:
1508.1.25 by Robert Collins
Update per review comments.
669
            reference = bzrlib.branch.BranchReferenceFormat().initialize(dir,
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
670
                referenced_branch)
671
        except errors.IncompatibleFormat:
672
            # this is ok too, not all formats have to support references.
673
            return
674
        self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
675
        tree = dir.create_workingtree()
676
        self.build_tree(['foo'], transport=dir.root_transport)
677
        tree.add('foo')
678
        tree.commit('revision 1', rev_id='1')
679
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
680
        target = dir.sprout(self.get_url('target'), revision_id='1')
681
        self.assertNotEqual(dir.transport.base, target.transport.base)
682
        # we want target to have a branch that is in-place.
683
        self.assertEqual(target, target.open_branch().bzrdir)
684
        # and as we dont support repositories being detached yet, a repo in 
685
        # place
686
        target.open_repository()
687
        # we trust that the working tree sprouting works via the other tests.
688
        self.assertEqual('1', target.open_workingtree().last_revision())
689
        self.assertEqual('1', target.open_branch().last_revision())
690
691
    def test_sprout_bzrdir_tree_revision(self):
692
        # test for revision limiting, [smoke test, not corner case checks].
693
        # make a tree with a revision with a last-revision
694
        # and sprout it with a revision limit.
695
        # This smoke test just checks the revision-id is right. Tree specific
696
        # tests will check corner cases.
697
        tree = self.make_branch_and_tree('source')
698
        self.build_tree(['foo'], transport=tree.bzrdir.root_transport)
699
        tree.add('foo')
700
        tree.commit('revision 1', rev_id='1')
701
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
702
        dir = tree.bzrdir
703
        target = dir.sprout(self.get_url('target'), revision_id='1')
704
        self.assertEqual('1', target.open_workingtree().last_revision())
705
706
    def test_sprout_bzrdir_incomplete_source_with_basis(self):
707
        # ensure that basis really does grab from the basis by having incomplete source
708
        tree = self.make_branch_and_tree('commit_tree')
709
        self.build_tree(['foo'], transport=tree.bzrdir.root_transport)
710
        tree.add('foo')
711
        tree.commit('revision 1', rev_id='1')
712
        source = self.make_branch_and_tree('source')
713
        # this gives us an incomplete repository
714
        tree.bzrdir.open_repository().copy_content_into(source.branch.repository)
715
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
716
        tree.bzrdir.open_branch().copy_content_into(source.branch)
717
        tree.copy_content_into(source)
718
        self.assertFalse(source.branch.repository.has_revision('2'))
719
        dir = source.bzrdir
720
        target = dir.sprout(self.get_url('target'), basis=tree.bzrdir)
721
        self.assertEqual('2', target.open_branch().last_revision())
722
        self.assertEqual('2', target.open_workingtree().last_revision())
723
        self.assertTrue(target.open_branch().repository.has_revision('2'))
1534.4.39 by Robert Collins
Basic BzrDir support.
724
725
    def test_format_initialize_find_open(self):
726
        # loopback test to check the current format initializes to itself.
727
        if not self.bzrdir_format.is_supported():
728
            # unsupported formats are not loopback testable
729
            # because the default open will not open them and
730
            # they may not be initializable.
731
            return
732
        # supported formats must be able to init and open
733
        t = get_transport(self.get_url())
734
        readonly_t = get_transport(self.get_readonly_url())
735
        made_control = self.bzrdir_format.initialize(t.base)
736
        self.failUnless(isinstance(made_control, bzrdir.BzrDir))
737
        self.assertEqual(self.bzrdir_format,
738
                         bzrdir.BzrDirFormat.find_format(readonly_t))
739
        direct_opened_dir = self.bzrdir_format.open(readonly_t)
740
        opened_dir = bzrdir.BzrDir.open(t.base)
741
        self.assertEqual(made_control._format,
742
                         opened_dir._format)
743
        self.assertEqual(direct_opened_dir._format,
744
                         opened_dir._format)
745
        self.failUnless(isinstance(opened_dir, bzrdir.BzrDir))
746
747
    def test_open_not_bzrdir(self):
748
        # test the formats specific behaviour for no-content or similar dirs.
749
        self.assertRaises(NotBranchError,
750
                          self.bzrdir_format.open,
751
                          get_transport(self.get_readonly_url()))
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
752
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
753
    def test_create_branch(self):
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
754
        # a bzrdir can construct a branch and repository for itself.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
755
        if not self.bzrdir_format.is_supported():
756
            # unsupported formats are not loopback testable
757
            # because the default open will not open them and
758
            # they may not be initializable.
759
            return
760
        t = get_transport(self.get_url())
761
        made_control = self.bzrdir_format.initialize(t.base)
762
        made_repo = made_control.create_repository()
763
        made_branch = made_control.create_branch()
1508.1.25 by Robert Collins
Update per review comments.
764
        self.failUnless(isinstance(made_branch, bzrlib.branch.Branch))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
765
        self.assertEqual(made_control, made_branch.bzrdir)
766
        
767
    def test_open_branch(self):
768
        if not self.bzrdir_format.is_supported():
769
            # unsupported formats are not loopback testable
770
            # because the default open will not open them and
771
            # they may not be initializable.
772
            return
773
        t = get_transport(self.get_url())
774
        made_control = self.bzrdir_format.initialize(t.base)
775
        made_repo = made_control.create_repository()
776
        made_branch = made_control.create_branch()
777
        opened_branch = made_control.open_branch()
778
        self.assertEqual(made_control, opened_branch.bzrdir)
779
        self.failUnless(isinstance(opened_branch, made_branch.__class__))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
780
        self.failUnless(isinstance(opened_branch._format, made_branch._format.__class__))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
781
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
782
    def test_create_repository(self):
783
        # a bzrdir can construct a repository for itself.
784
        if not self.bzrdir_format.is_supported():
785
            # unsupported formats are not loopback testable
786
            # because the default open will not open them and
787
            # they may not be initializable.
788
            return
789
        t = get_transport(self.get_url())
790
        made_control = self.bzrdir_format.initialize(t.base)
791
        made_repo = made_control.create_repository()
792
        self.failUnless(isinstance(made_repo, repository.Repository))
793
        self.assertEqual(made_control, made_repo.bzrdir)
794
        
795
    def test_open_repository(self):
796
        if not self.bzrdir_format.is_supported():
797
            # unsupported formats are not loopback testable
798
            # because the default open will not open them and
799
            # they may not be initializable.
800
            return
801
        t = get_transport(self.get_url())
802
        made_control = self.bzrdir_format.initialize(t.base)
803
        made_repo = made_control.create_repository()
804
        opened_repo = made_control.open_repository()
805
        self.assertEqual(made_control, opened_repo.bzrdir)
806
        self.failUnless(isinstance(opened_repo, made_repo.__class__))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
807
        self.failUnless(isinstance(opened_repo._format, made_repo._format.__class__))
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
808
809
    def test_create_workingtree(self):
810
        # a bzrdir can construct a working tree for itself.
811
        if not self.bzrdir_format.is_supported():
812
            # unsupported formats are not loopback testable
813
            # because the default open will not open them and
814
            # they may not be initializable.
815
            return
816
        # this has to be tested with local access as we still support creating 
817
        # format 6 bzrdirs
818
        t = get_transport('.')
819
        made_control = self.bzrdir_format.initialize(t.base)
820
        made_repo = made_control.create_repository()
821
        made_branch = made_control.create_branch()
822
        made_tree = made_control.create_workingtree()
823
        self.failUnless(isinstance(made_tree, workingtree.WorkingTree))
824
        self.assertEqual(made_control, made_tree.bzrdir)
825
        
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
826
    def test_create_workingtree_revision(self):
827
        # a bzrdir can construct a working tree for itself @ a specific revision.
828
        source = self.make_branch_and_tree('source')
829
        source.commit('a', rev_id='a', allow_pointless=True)
830
        source.commit('b', rev_id='b', allow_pointless=True)
831
        self.build_tree(['new/'])
832
        made_control = self.bzrdir_format.initialize('new')
833
        source.branch.repository.clone(made_control)
834
        source.branch.clone(made_control)
835
        made_tree = made_control.create_workingtree(revision_id='a')
836
        self.assertEqual('a', made_tree.last_revision())
837
        
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
838
    def test_open_workingtree(self):
839
        if not self.bzrdir_format.is_supported():
840
            # unsupported formats are not loopback testable
841
            # because the default open will not open them and
842
            # they may not be initializable.
843
            return
844
        # this has to be tested with local access as we still support creating 
845
        # format 6 bzrdirs
846
        t = get_transport('.')
847
        made_control = self.bzrdir_format.initialize(t.base)
848
        made_repo = made_control.create_repository()
849
        made_branch = made_control.create_branch()
850
        made_tree = made_control.create_workingtree()
851
        opened_tree = made_control.open_workingtree()
852
        self.assertEqual(made_control, opened_tree.bzrdir)
853
        self.failUnless(isinstance(opened_tree, made_tree.__class__))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
854
        self.failUnless(isinstance(opened_tree._format, made_tree._format.__class__))
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
855
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
856
    def test_get_branch_transport(self):
857
        dir = self.make_bzrdir('.')
858
        # without a format, get_branch_transport gives use a transport
859
        # which -may- point to an existing dir.
860
        self.assertTrue(isinstance(dir.get_branch_transport(None),
861
                                   transport.Transport))
862
        # with a given format, either the bzr dir supports identifiable
863
        # branches, or it supports anonymous  branch formats, but not both.
1508.1.25 by Robert Collins
Update per review comments.
864
        anonymous_format = bzrlib.branch.BzrBranchFormat4()
865
        identifiable_format = bzrlib.branch.BzrBranchFormat5()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
866
        try:
867
            found_transport = dir.get_branch_transport(anonymous_format)
868
            self.assertRaises(errors.IncompatibleFormat,
869
                              dir.get_branch_transport,
870
                              identifiable_format)
871
        except errors.IncompatibleFormat:
872
            found_transport = dir.get_branch_transport(identifiable_format)
873
        self.assertTrue(isinstance(found_transport, transport.Transport))
874
        # and the dir which has been initialized for us must be statable.
875
        found_transport.stat('.')
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
876
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
877
    def test_get_repository_transport(self):
878
        dir = self.make_bzrdir('.')
879
        # without a format, get_repository_transport gives use a transport
880
        # which -may- point to an existing dir.
881
        self.assertTrue(isinstance(dir.get_repository_transport(None),
882
                                   transport.Transport))
883
        # with a given format, either the bzr dir supports identifiable
884
        # repositoryes, or it supports anonymous  repository formats, but not both.
885
        anonymous_format = repository.RepositoryFormat6()
886
        identifiable_format = repository.RepositoryFormat7()
887
        try:
888
            found_transport = dir.get_repository_transport(anonymous_format)
889
            self.assertRaises(errors.IncompatibleFormat,
890
                              dir.get_repository_transport,
891
                              identifiable_format)
892
        except errors.IncompatibleFormat:
893
            found_transport = dir.get_repository_transport(identifiable_format)
894
        self.assertTrue(isinstance(found_transport, transport.Transport))
895
        # and the dir which has been initialized for us must be statable.
896
        found_transport.stat('.')
897
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
898
    def test_get_workingtree_transport(self):
899
        dir = self.make_bzrdir('.')
900
        # without a format, get_workingtree_transport gives use a transport
901
        # which -may- point to an existing dir.
902
        self.assertTrue(isinstance(dir.get_workingtree_transport(None),
903
                                   transport.Transport))
904
        # with a given format, either the bzr dir supports identifiable
905
        # trees, or it supports anonymous tree formats, but not both.
906
        anonymous_format = workingtree.WorkingTreeFormat2()
907
        identifiable_format = workingtree.WorkingTreeFormat3()
908
        try:
909
            found_transport = dir.get_workingtree_transport(anonymous_format)
910
            self.assertRaises(errors.IncompatibleFormat,
911
                              dir.get_workingtree_transport,
912
                              identifiable_format)
913
        except errors.IncompatibleFormat:
914
            found_transport = dir.get_workingtree_transport(identifiable_format)
915
        self.assertTrue(isinstance(found_transport, transport.Transport))
916
        # and the dir which has been initialized for us must be statable.
917
        found_transport.stat('.')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
918
919
    def test_root_transport(self):
920
        dir = self.make_bzrdir('.')
921
        self.assertEqual(dir.root_transport.base,
922
                         get_transport(self.get_url('.')).base)
923
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
924
    def test_find_repository_no_repo_under_standalone_branch(self):
925
        # finding a repo stops at standalone branches even if there is a
926
        # higher repository available.
927
        try:
928
            repo = self.make_repository('.', shared=True)
929
        except errors.IncompatibleFormat:
930
            # need a shared repository to test this.
931
            return
932
        url = self.get_url('intermediate')
933
        get_transport(self.get_url()).mkdir('intermediate')
934
        get_transport(self.get_url()).mkdir('intermediate/child')
935
        made_control = self.bzrdir_format.initialize(url)
936
        made_control.create_repository()
937
        innermost_control = self.bzrdir_format.initialize(
938
            self.get_url('intermediate/child'))
939
        try:
940
            child_repo = innermost_control.open_repository()
941
            # if there is a repository, then the format cannot ever hit this 
942
            # code path.
943
            return
944
        except errors.NoRepositoryPresent:
945
            pass
946
        self.assertRaises(errors.NoRepositoryPresent,
947
                          innermost_control.find_repository)
948
949
    def test_find_repository_containing_shared_repository(self):
950
        # find repo inside a shared repo with an empty control dir
951
        # returns the shared repo.
952
        try:
953
            repo = self.make_repository('.', shared=True)
954
        except errors.IncompatibleFormat:
955
            # need a shared repository to test this.
956
            return
957
        url = self.get_url('childbzrdir')
958
        get_transport(self.get_url()).mkdir('childbzrdir')
959
        made_control = self.bzrdir_format.initialize(url)
960
        try:
961
            child_repo = made_control.open_repository()
962
            # if there is a repository, then the format cannot ever hit this 
963
            # code path.
964
            return
965
        except errors.NoRepositoryPresent:
966
            pass
967
        found_repo = made_control.find_repository()
968
        self.assertEqual(repo.bzrdir.root_transport.base,
969
                         found_repo.bzrdir.root_transport.base)
970
        
971
    def test_find_repository_standalone_with_containing_shared_repository(self):
972
        # find repo inside a standalone repo inside a shared repo finds the standalone repo
973
        try:
974
            containing_repo = self.make_repository('.', shared=True)
975
        except errors.IncompatibleFormat:
976
            # need a shared repository to test this.
977
            return
978
        child_repo = self.make_repository('childrepo')
979
        opened_control = bzrdir.BzrDir.open(self.get_url('childrepo'))
980
        found_repo = opened_control.find_repository()
981
        self.assertEqual(child_repo.bzrdir.root_transport.base,
982
                         found_repo.bzrdir.root_transport.base)
983
984
    def test_find_repository_shared_within_shared_repository(self):
985
        # find repo at a shared repo inside a shared repo finds the inner repo
986
        try:
987
            containing_repo = self.make_repository('.', shared=True)
988
        except errors.IncompatibleFormat:
989
            # need a shared repository to test this.
990
            return
991
        url = self.get_url('childrepo')
992
        get_transport(self.get_url()).mkdir('childrepo')
993
        child_control = self.bzrdir_format.initialize(url)
994
        child_repo = child_control.create_repository(shared=True)
995
        opened_control = bzrdir.BzrDir.open(self.get_url('childrepo'))
996
        found_repo = opened_control.find_repository()
997
        self.assertEqual(child_repo.bzrdir.root_transport.base,
998
                         found_repo.bzrdir.root_transport.base)
999
        self.assertNotEqual(child_repo.bzrdir.root_transport.base,
1000
                            containing_repo.bzrdir.root_transport.base)
1001
1002
    def test_find_repository_with_nested_dirs_works(self):
1003
        # find repo inside a bzrdir inside a bzrdir inside a shared repo 
1004
        # finds the outer shared repo.
1005
        try:
1006
            repo = self.make_repository('.', shared=True)
1007
        except errors.IncompatibleFormat:
1008
            # need a shared repository to test this.
1009
            return
1010
        url = self.get_url('intermediate')
1011
        get_transport(self.get_url()).mkdir('intermediate')
1012
        get_transport(self.get_url()).mkdir('intermediate/child')
1013
        made_control = self.bzrdir_format.initialize(url)
1014
        try:
1015
            child_repo = made_control.open_repository()
1016
            # if there is a repository, then the format cannot ever hit this 
1017
            # code path.
1018
            return
1019
        except errors.NoRepositoryPresent:
1020
            pass
1021
        innermost_control = self.bzrdir_format.initialize(
1022
            self.get_url('intermediate/child'))
1023
        try:
1024
            child_repo = innermost_control.open_repository()
1025
            # if there is a repository, then the format cannot ever hit this 
1026
            # code path.
1027
            return
1028
        except errors.NoRepositoryPresent:
1029
            pass
1030
        found_repo = innermost_control.find_repository()
1031
        self.assertEqual(repo.bzrdir.root_transport.base,
1032
                         found_repo.bzrdir.root_transport.base)
1033
        
1534.5.16 by Robert Collins
Review feedback.
1034
    def test_can_and_needs_format_conversion(self):
1534.5.8 by Robert Collins
Ensure that bzrdir implementations offer the can_update_format and needs_format_update api.
1035
        # check that we can ask an instance if its upgradable
1036
        dir = self.make_bzrdir('.')
1534.5.16 by Robert Collins
Review feedback.
1037
        if dir.can_convert_format():
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1038
            # if its default updatable there must be an updater 
1039
            # (we change the default to match the lastest known format
1040
            # as downgrades may not be available
1041
            old_format = bzrdir.BzrDirFormat.get_default_format()
1042
            bzrdir.BzrDirFormat.set_default_format(dir._format)
1043
            try:
1044
                self.assertTrue(isinstance(dir._format.get_converter(),
1045
                                           bzrdir.Converter))
1046
            finally:
1047
                bzrdir.BzrDirFormat.set_default_format(old_format)
1534.5.16 by Robert Collins
Review feedback.
1048
        dir.needs_format_conversion(None)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
1049
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
1050
    def test_upgrade_new_instance(self):
1051
        """Does an available updater work ?."""
1052
        dir = self.make_bzrdir('.')
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1053
        # for now, check is not ready for partial bzrdirs.
1054
        dir.create_repository()
1055
        dir.create_branch()
1056
        dir.create_workingtree()
1534.5.16 by Robert Collins
Review feedback.
1057
        if dir.can_convert_format():
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1058
            # if its default updatable there must be an updater 
1059
            # (we change the default to match the lastest known format
1060
            # as downgrades may not be available
1061
            old_format = bzrdir.BzrDirFormat.get_default_format()
1062
            bzrdir.BzrDirFormat.set_default_format(dir._format)
1063
            try:
1064
                dir._format.get_converter(None).convert(dir,
1065
                    ui.ui_factory.progress_bar())
1066
            finally:
1067
                bzrdir.BzrDirFormat.set_default_format(old_format)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
1068
            # and it should pass 'check' now.
1069
            check(bzrdir.BzrDir.open(self.get_url('.')).open_branch(), False)
1070
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
1071
1072
class ChrootedBzrDirTests(ChrootedTestCase):
1073
1074
    def test_find_repository_no_repository(self):
1075
        # loopback test to check the current format fails to find a 
1076
        # share repository correctly.
1077
        if not self.bzrdir_format.is_supported():
1078
            # unsupported formats are not loopback testable
1079
            # because the default open will not open them and
1080
            # they may not be initializable.
1081
            return
1082
        # supported formats must be able to init and open
1083
        url = self.get_url('subdir')
1084
        get_transport(self.get_url()).mkdir('subdir')
1085
        made_control = self.bzrdir_format.initialize(url)
1086
        try:
1087
            repo = made_control.open_repository()
1088
            # if there is a repository, then the format cannot ever hit this 
1089
            # code path.
1090
            return
1091
        except errors.NoRepositoryPresent:
1092
            pass
1093
        opened_control = bzrdir.BzrDir.open(self.get_readonly_url('subdir'))
1094
        self.assertRaises(errors.NoRepositoryPresent,
1095
                          opened_control.find_repository)
1096