/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bzrdir.py

  • Committer: Robert Collins
  • Date: 2010-05-05 00:05:29 UTC
  • mto: This revision was merged to the branch mainline in revision 5206.
  • Revision ID: robertc@robertcollins.net-20100505000529-ltmllyms5watqj5u
Make 'pydoc bzrlib.tests.build_tree_shape' useful.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2013, 2016 Canonical Ltd
 
1
# Copyright (C) 2006-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
23
23
import subprocess
24
24
import sys
25
25
 
26
 
from .. import (
27
 
    branch,
28
 
    bzr,
29
 
    config,
30
 
    controldir,
 
26
from bzrlib import (
 
27
    bzrdir,
31
28
    errors,
32
29
    help_topics,
33
 
    lock,
34
30
    repository,
35
 
    revision as _mod_revision,
36
31
    osutils,
37
 
    transport as _mod_transport,
 
32
    remote,
38
33
    urlutils,
39
34
    win32utils,
40
 
    )
41
 
from ..bzr import (
42
 
    branch as bzrbranch,
43
 
    bzrdir,
44
 
    remote,
45
 
    workingtree_3,
46
 
    workingtree_4,
47
 
    )
48
 
import breezy.branch
49
 
import breezy.bzr.branch
50
 
from ..bzr.fullhistory import BzrBranchFormat5
51
 
from ..errors import (
52
 
    NotBranchError,
53
 
    NoColocatedBranchSupport,
54
 
    UnknownFormatError,
55
 
    UnsupportedFormatError,
56
 
    )
57
 
from . import (
 
35
    workingtree,
 
36
    )
 
37
import bzrlib.branch
 
38
from bzrlib.errors import (NotBranchError,
 
39
                           NoColocatedBranchSupport,
 
40
                           UnknownFormatError,
 
41
                           UnsupportedFormatError,
 
42
                           )
 
43
from bzrlib.tests import (
58
44
    TestCase,
59
45
    TestCaseWithMemoryTransport,
60
46
    TestCaseWithTransport,
61
47
    TestSkipped,
62
48
    )
63
 
from . import (
 
49
from bzrlib.tests import(
64
50
    http_server,
65
51
    http_utils,
66
52
    )
67
 
from ..transport import (
 
53
from bzrlib.tests.test_http import TestWithTransport_pycurl
 
54
from bzrlib.transport import (
 
55
    get_transport,
68
56
    memory,
69
 
    pathfilter,
70
57
    )
71
 
from ..transport.http import HttpTransport
72
 
from ..transport.nosmart import NoSmartTransportDecorator
73
 
from ..transport.readonly import ReadonlyTransportDecorator
74
 
from ..bzr import knitrepo, knitpack_repo
 
58
from bzrlib.transport.http._urllib import HttpTransport_urllib
 
59
from bzrlib.transport.nosmart import NoSmartTransportDecorator
 
60
from bzrlib.transport.readonly import ReadonlyTransportDecorator
 
61
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
75
62
 
76
63
 
77
64
class TestDefaultFormat(TestCase):
78
65
 
79
66
    def test_get_set_default_format(self):
80
67
        old_format = bzrdir.BzrDirFormat.get_default_format()
81
 
        # default is BzrDirMetaFormat1
82
 
        self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
83
 
        controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
 
68
        # default is BzrDirFormat6
 
69
        self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
 
70
        bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
84
71
        # creating a bzr dir should now create an instrumented dir.
85
72
        try:
86
73
            result = bzrdir.BzrDir.create('memory:///')
87
 
            self.assertIsInstance(result, SampleBzrDir)
 
74
            self.failUnless(isinstance(result, SampleBzrDir))
88
75
        finally:
89
 
            controldir.ControlDirFormat._set_default_format(old_format)
 
76
            bzrdir.BzrDirFormat._set_default_format(old_format)
90
77
        self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
91
78
 
92
79
 
93
 
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
94
 
    """A deprecated bzr dir format."""
95
 
 
96
 
 
97
80
class TestFormatRegistry(TestCase):
98
81
 
99
82
    def make_format_registry(self):
100
 
        my_format_registry = controldir.ControlDirFormatRegistry()
101
 
        my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
102
 
                                    'Some format.  Slower and unawesome and deprecated.',
103
 
                                    deprecated=True)
104
 
        my_format_registry.register_lazy('lazy', 'breezy.tests.test_bzrdir',
105
 
                                         'DeprecatedBzrDirFormat', 'Format registered lazily',
106
 
                                         deprecated=True)
107
 
        bzr.register_metadir(my_format_registry, 'knit',
108
 
                             'breezy.bzr.knitrepo.RepositoryFormatKnit1',
109
 
                             'Format using knits',
110
 
                             )
 
83
        my_format_registry = bzrdir.BzrDirFormatRegistry()
 
84
        my_format_registry.register('weave', bzrdir.BzrDirFormat6,
 
85
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
 
86
            ' repositories', deprecated=True)
 
87
        my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
 
88
            'BzrDirFormat6', 'Format registered lazily', deprecated=True)
 
89
        my_format_registry.register_metadir('knit',
 
90
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
 
91
            'Format using knits',
 
92
            )
111
93
        my_format_registry.set_default('knit')
112
 
        bzr.register_metadir(my_format_registry,
113
 
                             'branch6',
114
 
                             'breezy.bzr.knitrepo.RepositoryFormatKnit3',
115
 
                             'Experimental successor to knit.  Use at your own risk.',
116
 
                             branch_format='breezy.bzr.branch.BzrBranchFormat6',
117
 
                             experimental=True)
118
 
        bzr.register_metadir(my_format_registry,
119
 
                             'hidden format',
120
 
                             'breezy.bzr.knitrepo.RepositoryFormatKnit3',
121
 
                             'Experimental successor to knit.  Use at your own risk.',
122
 
                             branch_format='breezy.bzr.branch.BzrBranchFormat6', hidden=True)
123
 
        my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
124
 
                                    'Old format.  Slower and does not support things. ', hidden=True)
125
 
        my_format_registry.register_lazy('hiddenlazy', 'breezy.tests.test_bzrdir',
126
 
                                         'DeprecatedBzrDirFormat', 'Format registered lazily',
127
 
                                         deprecated=True, hidden=True)
 
94
        my_format_registry.register_metadir(
 
95
            'branch6',
 
96
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
 
97
            'Experimental successor to knit.  Use at your own risk.',
 
98
            branch_format='bzrlib.branch.BzrBranchFormat6',
 
99
            experimental=True)
 
100
        my_format_registry.register_metadir(
 
101
            'hidden format',
 
102
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
 
103
            'Experimental successor to knit.  Use at your own risk.',
 
104
            branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
 
105
        my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
 
106
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
 
107
            ' repositories', hidden=True)
 
108
        my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
 
109
            'BzrDirFormat6', 'Format registered lazily', deprecated=True,
 
110
            hidden=True)
128
111
        return my_format_registry
129
112
 
130
113
    def test_format_registry(self):
131
114
        my_format_registry = self.make_format_registry()
132
 
        my_bzrdir = my_format_registry.make_controldir('lazy')
133
 
        self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
134
 
        my_bzrdir = my_format_registry.make_controldir('deprecated')
135
 
        self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
136
 
        my_bzrdir = my_format_registry.make_controldir('default')
137
 
        self.assertIsInstance(my_bzrdir.repository_format,
138
 
                              knitrepo.RepositoryFormatKnit1)
139
 
        my_bzrdir = my_format_registry.make_controldir('knit')
140
 
        self.assertIsInstance(my_bzrdir.repository_format,
141
 
                              knitrepo.RepositoryFormatKnit1)
142
 
        my_bzrdir = my_format_registry.make_controldir('branch6')
 
115
        my_bzrdir = my_format_registry.make_bzrdir('lazy')
 
116
        self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
 
117
        my_bzrdir = my_format_registry.make_bzrdir('weave')
 
118
        self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
 
119
        my_bzrdir = my_format_registry.make_bzrdir('default')
 
120
        self.assertIsInstance(my_bzrdir.repository_format,
 
121
            knitrepo.RepositoryFormatKnit1)
 
122
        my_bzrdir = my_format_registry.make_bzrdir('knit')
 
123
        self.assertIsInstance(my_bzrdir.repository_format,
 
124
            knitrepo.RepositoryFormatKnit1)
 
125
        my_bzrdir = my_format_registry.make_bzrdir('branch6')
143
126
        self.assertIsInstance(my_bzrdir.get_branch_format(),
144
 
                              breezy.bzr.branch.BzrBranchFormat6)
 
127
                              bzrlib.branch.BzrBranchFormat6)
145
128
 
146
129
    def test_get_help(self):
147
130
        my_format_registry = self.make_format_registry()
151
134
                         my_format_registry.get_help('knit'))
152
135
        self.assertEqual('Format using knits',
153
136
                         my_format_registry.get_help('default'))
154
 
        self.assertEqual('Some format.  Slower and unawesome and deprecated.',
155
 
                         my_format_registry.get_help('deprecated'))
 
137
        self.assertEqual('Pre-0.8 format.  Slower and does not support'
 
138
                         ' checkouts or shared repositories',
 
139
                         my_format_registry.get_help('weave'))
156
140
 
157
141
    def test_help_topic(self):
158
142
        topics = help_topics.HelpTopicRegistry()
166
150
        experimental, deprecated = rest.split('Deprecated formats')
167
151
        self.assertContainsRe(new, 'formats-help')
168
152
        self.assertContainsRe(new,
169
 
                              ':knit:\n    \\(native\\) \\(default\\) Format using knits\n')
 
153
                ':knit:\n    \(native\) \(default\) Format using knits\n')
170
154
        self.assertContainsRe(experimental,
171
 
                              ':branch6:\n    \\(native\\) Experimental successor to knit')
 
155
                ':branch6:\n    \(native\) Experimental successor to knit')
172
156
        self.assertContainsRe(deprecated,
173
 
                              ':lazy:\n    \\(native\\) Format registered lazily\n')
 
157
                ':lazy:\n    \(native\) Format registered lazily\n')
174
158
        self.assertNotContainsRe(new, 'hidden')
175
159
 
176
160
    def test_set_default_repository(self):
177
 
        default_factory = controldir.format_registry.get('default')
178
 
        old_default = [k for k, v in controldir.format_registry.iteritems()
 
161
        default_factory = bzrdir.format_registry.get('default')
 
162
        old_default = [k for k, v in bzrdir.format_registry.iteritems()
179
163
                       if v == default_factory and k != 'default'][0]
180
 
        controldir.format_registry.set_default_repository(
181
 
            'dirstate-with-subtree')
 
164
        bzrdir.format_registry.set_default_repository('dirstate-with-subtree')
182
165
        try:
183
 
            self.assertIs(controldir.format_registry.get('dirstate-with-subtree'),
184
 
                          controldir.format_registry.get('default'))
 
166
            self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
 
167
                          bzrdir.format_registry.get('default'))
185
168
            self.assertIs(
186
 
                repository.format_registry.get_default().__class__,
 
169
                repository.RepositoryFormat.get_default_format().__class__,
187
170
                knitrepo.RepositoryFormatKnit3)
188
171
        finally:
189
 
            controldir.format_registry.set_default_repository(old_default)
 
172
            bzrdir.format_registry.set_default_repository(old_default)
190
173
 
191
174
    def test_aliases(self):
192
 
        a_registry = controldir.ControlDirFormatRegistry()
193
 
        a_registry.register('deprecated', DeprecatedBzrDirFormat,
194
 
                            'Old format.  Slower and does not support stuff',
195
 
                            deprecated=True)
196
 
        a_registry.register_alias('deprecatedalias', 'deprecated')
197
 
        self.assertEqual({'deprecatedalias': 'deprecated'},
198
 
                         a_registry.aliases())
199
 
 
200
 
 
201
 
class SampleBranch(breezy.branch.Branch):
 
175
        a_registry = bzrdir.BzrDirFormatRegistry()
 
176
        a_registry.register('weave', bzrdir.BzrDirFormat6,
 
177
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
 
178
            ' repositories', deprecated=True)
 
179
        a_registry.register('weavealias', bzrdir.BzrDirFormat6,
 
180
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
 
181
            ' repositories', deprecated=True, alias=True)
 
182
        self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
 
183
 
 
184
 
 
185
class SampleBranch(bzrlib.branch.Branch):
202
186
    """A dummy branch for guess what, dummy use."""
203
187
 
204
188
    def __init__(self, dir):
205
 
        self.controldir = dir
206
 
 
207
 
 
208
 
class SampleRepository(breezy.repository.Repository):
 
189
        self.bzrdir = dir
 
190
 
 
191
 
 
192
class SampleRepository(bzrlib.repository.Repository):
209
193
    """A dummy repo."""
210
194
 
211
195
    def __init__(self, dir):
212
 
        self.controldir = dir
 
196
        self.bzrdir = dir
213
197
 
214
198
 
215
199
class SampleBzrDir(bzrdir.BzrDir):
216
200
    """A sample BzrDir implementation to allow testing static methods."""
217
201
 
218
202
    def create_repository(self, shared=False):
219
 
        """See ControlDir.create_repository."""
 
203
        """See BzrDir.create_repository."""
220
204
        return "A repository"
221
205
 
222
206
    def open_repository(self):
223
 
        """See ControlDir.open_repository."""
 
207
        """See BzrDir.open_repository."""
224
208
        return SampleRepository(self)
225
209
 
226
210
    def create_branch(self, name=None):
227
 
        """See ControlDir.create_branch."""
 
211
        """See BzrDir.create_branch."""
228
212
        if name is not None:
229
213
            raise NoColocatedBranchSupport(self)
230
214
        return SampleBranch(self)
231
215
 
232
216
    def create_workingtree(self):
233
 
        """See ControlDir.create_workingtree."""
 
217
        """See BzrDir.create_workingtree."""
234
218
        return "A tree"
235
219
 
236
220
 
243
227
 
244
228
    def get_format_string(self):
245
229
        """See BzrDirFormat.get_format_string()."""
246
 
        return b"Sample .bzr dir format."
 
230
        return "Sample .bzr dir format."
247
231
 
248
232
    def initialize_on_transport(self, t):
249
233
        """Create a bzr dir."""
257
241
    def open(self, transport, _found=None):
258
242
        return "opened branch."
259
243
 
260
 
    @classmethod
261
 
    def from_string(cls, format_string):
262
 
        return cls()
263
 
 
264
 
 
265
 
class BzrDirFormatTest1(bzrdir.BzrDirMetaFormat1):
266
 
 
267
 
    @staticmethod
268
 
    def get_format_string():
269
 
        return b"Test format 1"
270
 
 
271
 
 
272
 
class BzrDirFormatTest2(bzrdir.BzrDirMetaFormat1):
273
 
 
274
 
    @staticmethod
275
 
    def get_format_string():
276
 
        return b"Test format 2"
277
 
 
278
244
 
279
245
class TestBzrDirFormat(TestCaseWithTransport):
280
246
    """Tests for the BzrDirFormat facility."""
282
248
    def test_find_format(self):
283
249
        # is the right format object found for a branch?
284
250
        # create a branch with a few known format objects.
285
 
        bzr.BzrProber.formats.register(BzrDirFormatTest1.get_format_string(),
286
 
                                       BzrDirFormatTest1())
287
 
        self.addCleanup(bzr.BzrProber.formats.remove,
288
 
                        BzrDirFormatTest1.get_format_string())
289
 
        bzr.BzrProber.formats.register(BzrDirFormatTest2.get_format_string(),
290
 
                                       BzrDirFormatTest2())
291
 
        self.addCleanup(bzr.BzrProber.formats.remove,
292
 
                        BzrDirFormatTest2.get_format_string())
293
 
        t = self.get_transport()
 
251
        # this is not quite the same as
 
252
        t = get_transport(self.get_url())
294
253
        self.build_tree(["foo/", "bar/"], transport=t)
295
 
 
296
254
        def check_format(format, url):
297
255
            format.initialize(url)
298
 
            t = _mod_transport.get_transport_from_path(url)
 
256
            t = get_transport(url)
299
257
            found_format = bzrdir.BzrDirFormat.find_format(t)
300
 
            self.assertIsInstance(found_format, format.__class__)
301
 
        check_format(BzrDirFormatTest1(), "foo")
302
 
        check_format(BzrDirFormatTest2(), "bar")
 
258
            self.failUnless(isinstance(found_format, format.__class__))
 
259
        check_format(bzrdir.BzrDirFormat5(), "foo")
 
260
        check_format(bzrdir.BzrDirFormat6(), "bar")
303
261
 
304
262
    def test_find_format_nothing_there(self):
305
263
        self.assertRaises(NotBranchError,
306
264
                          bzrdir.BzrDirFormat.find_format,
307
 
                          _mod_transport.get_transport_from_path('.'))
 
265
                          get_transport('.'))
308
266
 
309
267
    def test_find_format_unknown_format(self):
310
 
        t = self.get_transport()
 
268
        t = get_transport(self.get_url())
311
269
        t.mkdir('.bzr')
312
 
        t.put_bytes('.bzr/branch-format', b'')
 
270
        t.put_bytes('.bzr/branch-format', '')
313
271
        self.assertRaises(UnknownFormatError,
314
272
                          bzrdir.BzrDirFormat.find_format,
315
 
                          _mod_transport.get_transport_from_path('.'))
316
 
 
317
 
    def test_find_format_line_endings(self):
318
 
        t = self.get_transport()
319
 
        t.mkdir('.bzr')
320
 
        t.put_bytes('.bzr/branch-format', b'Corrupt line endings\r\n')
321
 
        self.assertRaises(errors.LineEndingError,
322
 
                          bzrdir.BzrDirFormat.find_format,
323
 
                          _mod_transport.get_transport_from_path('.'))
 
273
                          get_transport('.'))
324
274
 
325
275
    def test_register_unregister_format(self):
326
276
        format = SampleBzrDirFormat()
328
278
        # make a bzrdir
329
279
        format.initialize(url)
330
280
        # register a format for it.
331
 
        bzr.BzrProber.formats.register(format.get_format_string(), format)
 
281
        bzrdir.BzrDirFormat.register_format(format)
332
282
        # which bzrdir.Open will refuse (not supported)
333
283
        self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
334
284
        # which bzrdir.open_containing will refuse (not supported)
335
 
        self.assertRaises(UnsupportedFormatError,
336
 
                          bzrdir.BzrDir.open_containing, url)
 
285
        self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
337
286
        # but open_downlevel will work
338
 
        t = _mod_transport.get_transport_from_url(url)
 
287
        t = get_transport(url)
339
288
        self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
340
289
        # unregister the format
341
 
        bzr.BzrProber.formats.remove(format.get_format_string())
 
290
        bzrdir.BzrDirFormat.unregister_format(format)
342
291
        # now open_downlevel should fail too.
343
 
        self.assertRaises(UnknownFormatError,
344
 
                          bzrdir.BzrDir.open_unsupported, url)
 
292
        self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
345
293
 
346
294
    def test_create_branch_and_repo_uses_default(self):
347
295
        format = SampleBzrDirFormat()
352
300
    def test_create_branch_and_repo_under_shared(self):
353
301
        # creating a branch and repo in a shared repo uses the
354
302
        # shared repository
355
 
        format = controldir.format_registry.make_controldir('knit')
 
303
        format = bzrdir.format_registry.make_bzrdir('knit')
356
304
        self.make_repository('.', shared=True, format=format)
357
305
        branch = bzrdir.BzrDir.create_branch_and_repo(
358
306
            self.get_url('child'), format=format)
359
307
        self.assertRaises(errors.NoRepositoryPresent,
360
 
                          branch.controldir.open_repository)
 
308
                          branch.bzrdir.open_repository)
361
309
 
362
310
    def test_create_branch_and_repo_under_shared_force_new(self):
363
311
        # creating a branch and repo in a shared repo can be forced to
364
312
        # make a new repo
365
 
        format = controldir.format_registry.make_controldir('knit')
 
313
        format = bzrdir.format_registry.make_bzrdir('knit')
366
314
        self.make_repository('.', shared=True, format=format)
367
315
        branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
368
316
                                                      force_new_repo=True,
369
317
                                                      format=format)
370
 
        branch.controldir.open_repository()
 
318
        branch.bzrdir.open_repository()
371
319
 
372
320
    def test_create_standalone_working_tree(self):
373
321
        format = SampleBzrDirFormat()
382
330
 
383
331
    def test_create_standalone_working_tree_under_shared_repo(self):
384
332
        # create standalone working tree always makes a repo.
385
 
        format = controldir.format_registry.make_controldir('knit')
 
333
        format = bzrdir.format_registry.make_bzrdir('knit')
386
334
        self.make_repository('.', shared=True, format=format)
387
335
        # note this is deliberately readonly, as this failure should
388
336
        # occur before any writes.
390
338
                          bzrdir.BzrDir.create_standalone_workingtree,
391
339
                          self.get_readonly_url('child'), format=format)
392
340
        tree = bzrdir.BzrDir.create_standalone_workingtree('child',
393
 
                                                           format=format)
394
 
        tree.controldir.open_repository()
 
341
            format=format)
 
342
        tree.bzrdir.open_repository()
395
343
 
396
344
    def test_create_branch_convenience(self):
397
345
        # outside a repo the default convenience output is a repo+branch_tree
398
 
        format = controldir.format_registry.make_controldir('knit')
 
346
        format = bzrdir.format_registry.make_bzrdir('knit')
399
347
        branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
400
 
        branch.controldir.open_workingtree()
401
 
        branch.controldir.open_repository()
 
348
        branch.bzrdir.open_workingtree()
 
349
        branch.bzrdir.open_repository()
402
350
 
403
351
    def test_create_branch_convenience_possible_transports(self):
404
352
        """Check that the optional 'possible_transports' is recognized"""
405
 
        format = controldir.format_registry.make_controldir('knit')
 
353
        format = bzrdir.format_registry.make_bzrdir('knit')
406
354
        t = self.get_transport()
407
355
        branch = bzrdir.BzrDir.create_branch_convenience(
408
356
            '.', format=format, possible_transports=[t])
409
 
        branch.controldir.open_workingtree()
410
 
        branch.controldir.open_repository()
 
357
        branch.bzrdir.open_workingtree()
 
358
        branch.bzrdir.open_repository()
411
359
 
412
360
    def test_create_branch_convenience_root(self):
413
361
        """Creating a branch at the root of a fs should work."""
414
362
        self.vfs_transport_factory = memory.MemoryServer
415
363
        # outside a repo the default convenience output is a repo+branch_tree
416
 
        format = controldir.format_registry.make_controldir('knit')
 
364
        format = bzrdir.format_registry.make_bzrdir('knit')
417
365
        branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
418
366
                                                         format=format)
419
367
        self.assertRaises(errors.NoWorkingTree,
420
 
                          branch.controldir.open_workingtree)
421
 
        branch.controldir.open_repository()
 
368
                          branch.bzrdir.open_workingtree)
 
369
        branch.bzrdir.open_repository()
422
370
 
423
371
    def test_create_branch_convenience_under_shared_repo(self):
424
372
        # inside a repo the default convenience output is a branch+ follow the
425
373
        # repo tree policy
426
 
        format = controldir.format_registry.make_controldir('knit')
 
374
        format = bzrdir.format_registry.make_bzrdir('knit')
427
375
        self.make_repository('.', shared=True, format=format)
428
376
        branch = bzrdir.BzrDir.create_branch_convenience('child',
429
 
                                                         format=format)
430
 
        branch.controldir.open_workingtree()
 
377
            format=format)
 
378
        branch.bzrdir.open_workingtree()
431
379
        self.assertRaises(errors.NoRepositoryPresent,
432
 
                          branch.controldir.open_repository)
 
380
                          branch.bzrdir.open_repository)
433
381
 
434
382
    def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
435
383
        # inside a repo the default convenience output is a branch+ follow the
436
384
        # repo tree policy but we can override that
437
 
        format = controldir.format_registry.make_controldir('knit')
 
385
        format = bzrdir.format_registry.make_bzrdir('knit')
438
386
        self.make_repository('.', shared=True, format=format)
439
387
        branch = bzrdir.BzrDir.create_branch_convenience('child',
440
 
                                                         force_new_tree=False, format=format)
 
388
            force_new_tree=False, format=format)
441
389
        self.assertRaises(errors.NoWorkingTree,
442
 
                          branch.controldir.open_workingtree)
 
390
                          branch.bzrdir.open_workingtree)
443
391
        self.assertRaises(errors.NoRepositoryPresent,
444
 
                          branch.controldir.open_repository)
 
392
                          branch.bzrdir.open_repository)
445
393
 
446
394
    def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
447
395
        # inside a repo the default convenience output is a branch+ follow the
448
396
        # repo tree policy
449
 
        format = controldir.format_registry.make_controldir('knit')
 
397
        format = bzrdir.format_registry.make_bzrdir('knit')
450
398
        repo = self.make_repository('.', shared=True, format=format)
451
399
        repo.set_make_working_trees(False)
452
400
        branch = bzrdir.BzrDir.create_branch_convenience('child',
453
401
                                                         format=format)
454
402
        self.assertRaises(errors.NoWorkingTree,
455
 
                          branch.controldir.open_workingtree)
 
403
                          branch.bzrdir.open_workingtree)
456
404
        self.assertRaises(errors.NoRepositoryPresent,
457
 
                          branch.controldir.open_repository)
 
405
                          branch.bzrdir.open_repository)
458
406
 
459
407
    def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
460
408
        # inside a repo the default convenience output is a branch+ follow the
461
409
        # repo tree policy but we can override that
462
 
        format = controldir.format_registry.make_controldir('knit')
 
410
        format = bzrdir.format_registry.make_bzrdir('knit')
463
411
        repo = self.make_repository('.', shared=True, format=format)
464
412
        repo.set_make_working_trees(False)
465
413
        branch = bzrdir.BzrDir.create_branch_convenience('child',
466
 
                                                         force_new_tree=True, format=format)
467
 
        branch.controldir.open_workingtree()
 
414
            force_new_tree=True, format=format)
 
415
        branch.bzrdir.open_workingtree()
468
416
        self.assertRaises(errors.NoRepositoryPresent,
469
 
                          branch.controldir.open_repository)
 
417
                          branch.bzrdir.open_repository)
470
418
 
471
419
    def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
472
420
        # inside a repo the default convenience output is overridable to give
473
421
        # repo+branch+tree
474
 
        format = controldir.format_registry.make_controldir('knit')
 
422
        format = bzrdir.format_registry.make_bzrdir('knit')
475
423
        self.make_repository('.', shared=True, format=format)
476
424
        branch = bzrdir.BzrDir.create_branch_convenience('child',
477
 
                                                         force_new_repo=True, format=format)
478
 
        branch.controldir.open_repository()
479
 
        branch.controldir.open_workingtree()
 
425
            force_new_repo=True, format=format)
 
426
        branch.bzrdir.open_repository()
 
427
        branch.bzrdir.open_workingtree()
480
428
 
481
429
 
482
430
class TestRepositoryAcquisitionPolicy(TestCaseWithTransport):
483
431
 
484
432
    def test_acquire_repository_standalone(self):
485
433
        """The default acquisition policy should create a standalone branch."""
486
 
        my_bzrdir = self.make_controldir('.')
 
434
        my_bzrdir = self.make_bzrdir('.')
487
435
        repo_policy = my_bzrdir.determine_repository_policy()
488
436
        repo, is_new = repo_policy.acquire_repository()
489
 
        self.assertEqual(repo.controldir.root_transport.base,
 
437
        self.assertEqual(repo.bzrdir.root_transport.base,
490
438
                         my_bzrdir.root_transport.base)
491
439
        self.assertFalse(repo.is_shared())
492
440
 
493
441
    def test_determine_stacking_policy(self):
494
 
        parent_bzrdir = self.make_controldir('.')
495
 
        child_bzrdir = self.make_controldir('child')
 
442
        parent_bzrdir = self.make_bzrdir('.')
 
443
        child_bzrdir = self.make_bzrdir('child')
496
444
        parent_bzrdir.get_config().set_default_stack_on('http://example.org')
497
445
        repo_policy = child_bzrdir.determine_repository_policy()
498
446
        self.assertEqual('http://example.org', repo_policy._stack_on)
499
447
 
500
448
    def test_determine_stacking_policy_relative(self):
501
 
        parent_bzrdir = self.make_controldir('.')
502
 
        child_bzrdir = self.make_controldir('child')
 
449
        parent_bzrdir = self.make_bzrdir('.')
 
450
        child_bzrdir = self.make_bzrdir('child')
503
451
        parent_bzrdir.get_config().set_default_stack_on('child2')
504
452
        repo_policy = child_bzrdir.determine_repository_policy()
505
453
        self.assertEqual('child2', repo_policy._stack_on)
507
455
                         repo_policy._stack_on_pwd)
508
456
 
509
457
    def prepare_default_stacking(self, child_format='1.6'):
510
 
        parent_bzrdir = self.make_controldir('.')
 
458
        parent_bzrdir = self.make_bzrdir('.')
511
459
        child_branch = self.make_branch('child', format=child_format)
512
460
        parent_bzrdir.get_config().set_default_stack_on(child_branch.base)
513
461
        new_child_transport = parent_bzrdir.transport.clone('child2')
515
463
 
516
464
    def test_clone_on_transport_obeys_stacking_policy(self):
517
465
        child_branch, new_child_transport = self.prepare_default_stacking()
518
 
        new_child = child_branch.controldir.clone_on_transport(
519
 
            new_child_transport)
 
466
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
520
467
        self.assertEqual(child_branch.base,
521
468
                         new_child.open_branch().get_stacked_on_url())
522
469
 
523
470
    def test_default_stacking_with_stackable_branch_unstackable_repo(self):
524
471
        # Make stackable source branch with an unstackable repo format.
525
 
        source_bzrdir = self.make_controldir('source')
526
 
        knitpack_repo.RepositoryFormatKnitPack1().initialize(source_bzrdir)
527
 
        source_branch = breezy.bzr.branch.BzrBranchFormat7().initialize(
 
472
        source_bzrdir = self.make_bzrdir('source')
 
473
        pack_repo.RepositoryFormatKnitPack1().initialize(source_bzrdir)
 
474
        source_branch = bzrlib.branch.BzrBranchFormat7().initialize(
528
475
            source_bzrdir)
529
476
        # Make a directory with a default stacking policy
530
 
        parent_bzrdir = self.make_controldir('parent')
 
477
        parent_bzrdir = self.make_bzrdir('parent')
531
478
        stacked_on = self.make_branch('parent/stacked-on', format='pack-0.92')
532
479
        parent_bzrdir.get_config().set_default_stack_on(stacked_on.base)
533
480
        # Clone source into directory
534
481
        target = source_bzrdir.clone(self.get_url('parent/target'))
535
482
 
536
 
    def test_format_initialize_on_transport_ex_stacked_on(self):
537
 
        # trunk is a stackable format.  Note that its in the same server area
538
 
        # which is what launchpad does, but not sufficient to exercise the
539
 
        # general case.
540
 
        trunk = self.make_branch('trunk', format='1.9')
541
 
        t = self.get_transport('stacked')
542
 
        old_fmt = controldir.format_registry.make_controldir('pack-0.92')
543
 
        repo_name = old_fmt.repository_format.network_name()
544
 
        # Should end up with a 1.9 format (stackable)
545
 
        repo, control, require_stacking, repo_policy = \
546
 
            old_fmt.initialize_on_transport_ex(t,
547
 
                                               repo_format_name=repo_name, stacked_on='../trunk',
548
 
                                               stack_on_pwd=t.base)
549
 
        if repo is not None:
550
 
            # Repositories are open write-locked
551
 
            self.assertTrue(repo.is_write_locked())
552
 
            self.addCleanup(repo.unlock)
553
 
        else:
554
 
            repo = control.open_repository()
555
 
        self.assertIsInstance(control, bzrdir.BzrDir)
556
 
        opened = bzrdir.BzrDir.open(t.base)
557
 
        if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
558
 
            self.assertEqual(control._format.network_name(),
559
 
                             old_fmt.network_name())
560
 
            self.assertEqual(control._format.network_name(),
561
 
                             opened._format.network_name())
562
 
        self.assertEqual(control.__class__, opened.__class__)
563
 
        self.assertLength(1, repo._fallback_repositories)
564
 
 
565
483
    def test_sprout_obeys_stacking_policy(self):
566
484
        child_branch, new_child_transport = self.prepare_default_stacking()
567
 
        new_child = child_branch.controldir.sprout(new_child_transport.base)
 
485
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
568
486
        self.assertEqual(child_branch.base,
569
487
                         new_child.open_branch().get_stacked_on_url())
570
488
 
571
489
    def test_clone_ignores_policy_for_unsupported_formats(self):
572
490
        child_branch, new_child_transport = self.prepare_default_stacking(
573
491
            child_format='pack-0.92')
574
 
        new_child = child_branch.controldir.clone_on_transport(
575
 
            new_child_transport)
576
 
        self.assertRaises(branch.UnstackableBranchFormat,
 
492
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
 
493
        self.assertRaises(errors.UnstackableBranchFormat,
577
494
                          new_child.open_branch().get_stacked_on_url)
578
495
 
579
496
    def test_sprout_ignores_policy_for_unsupported_formats(self):
580
497
        child_branch, new_child_transport = self.prepare_default_stacking(
581
498
            child_format='pack-0.92')
582
 
        new_child = child_branch.controldir.sprout(new_child_transport.base)
583
 
        self.assertRaises(branch.UnstackableBranchFormat,
 
499
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
 
500
        self.assertRaises(errors.UnstackableBranchFormat,
584
501
                          new_child.open_branch().get_stacked_on_url)
585
502
 
586
503
    def test_sprout_upgrades_format_if_stacked_specified(self):
587
504
        child_branch, new_child_transport = self.prepare_default_stacking(
588
505
            child_format='pack-0.92')
589
 
        new_child = child_branch.controldir.sprout(new_child_transport.base,
590
 
                                                   stacked=True)
591
 
        self.assertEqual(child_branch.controldir.root_transport.base,
 
506
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
 
507
                                               stacked=True)
 
508
        self.assertEqual(child_branch.bzrdir.root_transport.base,
592
509
                         new_child.open_branch().get_stacked_on_url())
593
510
        repo = new_child.open_repository()
594
511
        self.assertTrue(repo._format.supports_external_lookups)
597
514
    def test_clone_on_transport_upgrades_format_if_stacked_on_specified(self):
598
515
        child_branch, new_child_transport = self.prepare_default_stacking(
599
516
            child_format='pack-0.92')
600
 
        new_child = child_branch.controldir.clone_on_transport(new_child_transport,
601
 
                                                               stacked_on=child_branch.controldir.root_transport.base)
602
 
        self.assertEqual(child_branch.controldir.root_transport.base,
 
517
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport,
 
518
            stacked_on=child_branch.bzrdir.root_transport.base)
 
519
        self.assertEqual(child_branch.bzrdir.root_transport.base,
603
520
                         new_child.open_branch().get_stacked_on_url())
604
521
        repo = new_child.open_repository()
605
522
        self.assertTrue(repo._format.supports_external_lookups)
608
525
    def test_sprout_upgrades_to_rich_root_format_if_needed(self):
609
526
        child_branch, new_child_transport = self.prepare_default_stacking(
610
527
            child_format='rich-root-pack')
611
 
        new_child = child_branch.controldir.sprout(new_child_transport.base,
612
 
                                                   stacked=True)
 
528
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
 
529
                                               stacked=True)
613
530
        repo = new_child.open_repository()
614
531
        self.assertTrue(repo._format.supports_external_lookups)
615
532
        self.assertTrue(repo.supports_rich_root())
630
547
        stack_on = self.make_branch('stack_on', format='1.6')
631
548
        stacked = self.make_branch('stack_on/stacked', format='1.6')
632
549
        policy = bzrdir.UseExistingRepository(stacked.repository,
633
 
                                              '.', stack_on.base)
 
550
            '.', stack_on.base)
634
551
        policy.configure_branch(stacked)
635
552
        self.assertEqual('..', stacked.get_stacked_on_url())
636
553
 
638
555
        stack_on = self.make_branch('stack_on', format='1.6')
639
556
        stacked = self.make_branch('stack_on/stacked', format='1.6')
640
557
        policy = bzrdir.UseExistingRepository(stacked.repository,
641
 
                                              '.', self.get_readonly_url('stack_on'))
 
558
            '.', self.get_readonly_url('stack_on'))
642
559
        policy.configure_branch(stacked)
643
560
        self.assertEqual(self.get_readonly_url('stack_on'),
644
561
                         stacked.get_stacked_on_url())
658
575
            self.transport_readonly_server = http_server.HttpServer
659
576
 
660
577
    def local_branch_path(self, branch):
661
 
        return os.path.realpath(urlutils.local_path_from_url(branch.base))
 
578
         return os.path.realpath(urlutils.local_path_from_url(branch.base))
662
579
 
663
580
    def test_open_containing(self):
664
581
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
666
583
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
667
584
                          self.get_readonly_url('g/p/q'))
668
585
        control = bzrdir.BzrDir.create(self.get_url())
669
 
        branch, relpath = bzrdir.BzrDir.open_containing(
 
586
        branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
 
587
        self.assertEqual('', relpath)
 
588
        branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
 
589
        self.assertEqual('g/p/q', relpath)
 
590
 
 
591
    def test_open_containing_tree_branch_or_repository_empty(self):
 
592
        self.assertRaises(errors.NotBranchError,
 
593
            bzrdir.BzrDir.open_containing_tree_branch_or_repository,
670
594
            self.get_readonly_url(''))
671
 
        self.assertEqual('', relpath)
672
 
        branch, relpath = bzrdir.BzrDir.open_containing(
673
 
            self.get_readonly_url('g/p/q'))
674
 
        self.assertEqual('g/p/q', relpath)
675
 
 
676
 
    def test_open_containing_tree_branch_or_repository_empty(self):
677
 
        self.assertRaises(errors.NotBranchError,
678
 
                          bzrdir.BzrDir.open_containing_tree_branch_or_repository,
679
 
                          self.get_readonly_url(''))
680
595
 
681
596
    def test_open_containing_tree_branch_or_repository_all(self):
682
597
        self.make_branch_and_tree('topdir')
689
604
                         self.local_branch_path(branch))
690
605
        self.assertEqual(
691
606
            osutils.realpath(os.path.join('topdir', '.bzr', 'repository')),
692
 
            repo.controldir.transport.local_abspath('repository'))
 
607
            repo.bzrdir.transport.local_abspath('repository'))
693
608
        self.assertEqual(relpath, 'foo')
694
609
 
695
610
    def test_open_containing_tree_branch_or_repository_no_tree(self):
702
617
                         self.local_branch_path(branch))
703
618
        self.assertEqual(
704
619
            osutils.realpath(os.path.join('branch', '.bzr', 'repository')),
705
 
            repo.controldir.transport.local_abspath('repository'))
 
620
            repo.bzrdir.transport.local_abspath('repository'))
706
621
        self.assertEqual(relpath, 'foo')
707
622
 
708
623
    def test_open_containing_tree_branch_or_repository_repo(self):
714
629
        self.assertEqual(branch, None)
715
630
        self.assertEqual(
716
631
            osutils.realpath(os.path.join('repo', '.bzr', 'repository')),
717
 
            repo.controldir.transport.local_abspath('repository'))
 
632
            repo.bzrdir.transport.local_abspath('repository'))
718
633
        self.assertEqual(relpath, '')
719
634
 
720
635
    def test_open_containing_tree_branch_or_repository_shared_repo(self):
729
644
                         self.local_branch_path(branch))
730
645
        self.assertEqual(
731
646
            osutils.realpath(os.path.join('shared', '.bzr', 'repository')),
732
 
            repo.controldir.transport.local_abspath('repository'))
 
647
            repo.bzrdir.transport.local_abspath('repository'))
733
648
        self.assertEqual(relpath, '')
734
649
 
735
650
    def test_open_containing_tree_branch_or_repository_branch_subdir(self):
744
659
                         self.local_branch_path(branch))
745
660
        self.assertEqual(
746
661
            osutils.realpath(os.path.join('foo', '.bzr', 'repository')),
747
 
            repo.controldir.transport.local_abspath('repository'))
 
662
            repo.bzrdir.transport.local_abspath('repository'))
748
663
        self.assertEqual(relpath, 'bar')
749
664
 
750
665
    def test_open_containing_tree_branch_or_repository_repo_subdir(self):
757
672
        self.assertEqual(branch, None)
758
673
        self.assertEqual(
759
674
            osutils.realpath(os.path.join('bar', '.bzr', 'repository')),
760
 
            repo.controldir.transport.local_abspath('repository'))
 
675
            repo.bzrdir.transport.local_abspath('repository'))
761
676
        self.assertEqual(relpath, 'baz')
762
677
 
763
678
    def test_open_containing_from_transport(self):
764
 
        self.assertRaises(NotBranchError,
765
 
                          bzrdir.BzrDir.open_containing_from_transport,
766
 
                          _mod_transport.get_transport_from_url(self.get_readonly_url('')))
767
 
        self.assertRaises(NotBranchError,
768
 
                          bzrdir.BzrDir.open_containing_from_transport,
769
 
                          _mod_transport.get_transport_from_url(
770
 
                              self.get_readonly_url('g/p/q')))
 
679
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
 
680
                          get_transport(self.get_readonly_url('')))
 
681
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
 
682
                          get_transport(self.get_readonly_url('g/p/q')))
771
683
        control = bzrdir.BzrDir.create(self.get_url())
772
684
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
773
 
            _mod_transport.get_transport_from_url(
774
 
                self.get_readonly_url('')))
 
685
            get_transport(self.get_readonly_url('')))
775
686
        self.assertEqual('', relpath)
776
687
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
777
 
            _mod_transport.get_transport_from_url(
778
 
                self.get_readonly_url('g/p/q')))
 
688
            get_transport(self.get_readonly_url('g/p/q')))
779
689
        self.assertEqual('g/p/q', relpath)
780
690
 
781
691
    def test_open_containing_tree_or_branch(self):
786
696
                         os.path.realpath(tree.basedir))
787
697
        self.assertEqual(os.path.realpath('topdir'),
788
698
                         self.local_branch_path(branch))
789
 
        self.assertIs(tree.controldir, branch.controldir)
 
699
        self.assertIs(tree.bzrdir, branch.bzrdir)
790
700
        self.assertEqual('foo', relpath)
791
701
        # opening from non-local should not return the tree
792
702
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
809
719
                         os.path.realpath(tree.basedir))
810
720
        self.assertEqual(os.path.realpath('topdir'),
811
721
                         self.local_branch_path(branch))
812
 
        self.assertIs(tree.controldir, branch.controldir)
 
722
        self.assertIs(tree.bzrdir, branch.bzrdir)
813
723
        # opening from non-local should not return the tree
814
724
        tree, branch = bzrdir.BzrDir.open_tree_or_branch(
815
725
            self.get_readonly_url('topdir'))
821
731
        self.assertEqual(os.path.realpath('topdir/foo'),
822
732
                         self.local_branch_path(branch))
823
733
 
824
 
    def test_open_tree_or_branch_named(self):
825
 
        tree = self.make_branch_and_tree('topdir')
826
 
        self.assertRaises(
827
 
            NotBranchError,
828
 
            bzrdir.BzrDir.open_tree_or_branch, 'topdir', name='missing')
829
 
        tree.branch.controldir.create_branch('named')
830
 
        tree, branch = bzrdir.BzrDir.open_tree_or_branch('topdir', name='named')
831
 
        self.assertEqual(os.path.realpath('topdir'),
832
 
                         os.path.realpath(tree.basedir))
833
 
        self.assertEqual(os.path.realpath('topdir'),
834
 
                         self.local_branch_path(branch))
835
 
        self.assertEqual(branch.name, 'named')
836
 
        self.assertIs(tree.controldir, branch.controldir)
837
 
 
838
734
    def test_open_from_transport(self):
839
735
        # transport pointing at bzrdir should give a bzrdir with root transport
840
736
        # set to the given transport
841
737
        control = bzrdir.BzrDir.create(self.get_url())
842
 
        t = self.get_transport()
843
 
        opened_bzrdir = bzrdir.BzrDir.open_from_transport(t)
844
 
        self.assertEqual(t.base, opened_bzrdir.root_transport.base)
 
738
        transport = get_transport(self.get_url())
 
739
        opened_bzrdir = bzrdir.BzrDir.open_from_transport(transport)
 
740
        self.assertEqual(transport.base, opened_bzrdir.root_transport.base)
845
741
        self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
846
742
 
847
743
    def test_open_from_transport_no_bzrdir(self):
848
 
        t = self.get_transport()
849
 
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
 
744
        transport = get_transport(self.get_url())
 
745
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
 
746
                          transport)
850
747
 
851
748
    def test_open_from_transport_bzrdir_in_parent(self):
852
749
        control = bzrdir.BzrDir.create(self.get_url())
853
 
        t = self.get_transport()
854
 
        t.mkdir('subdir')
855
 
        t = t.clone('subdir')
856
 
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
 
750
        transport = get_transport(self.get_url())
 
751
        transport.mkdir('subdir')
 
752
        transport = transport.clone('subdir')
 
753
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport,
 
754
                          transport)
857
755
 
858
756
    def test_sprout_recursive(self):
859
 
        tree = self.make_branch_and_tree('tree1')
860
 
        sub_tree = self.make_branch_and_tree('tree1/subtree')
861
 
        sub_tree.set_root_id(b'subtree-root')
 
757
        tree = self.make_branch_and_tree('tree1',
 
758
                                         format='dirstate-with-subtree')
 
759
        sub_tree = self.make_branch_and_tree('tree1/subtree',
 
760
            format='dirstate-with-subtree')
 
761
        sub_tree.set_root_id('subtree-root')
862
762
        tree.add_reference(sub_tree)
863
 
        tree.set_reference_info('subtree', sub_tree.branch.user_url)
864
763
        self.build_tree(['tree1/subtree/file'])
865
764
        sub_tree.add('file')
866
765
        tree.commit('Initial commit')
867
 
        tree2 = tree.controldir.sprout('tree2').open_workingtree()
 
766
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
868
767
        tree2.lock_read()
869
768
        self.addCleanup(tree2.unlock)
870
 
        self.assertPathExists('tree2/subtree/file')
871
 
        self.assertEqual('tree-reference', tree2.kind('subtree'))
 
769
        self.failUnlessExists('tree2/subtree/file')
 
770
        self.assertEqual('tree-reference', tree2.kind('subtree-root'))
872
771
 
873
772
    def test_cloning_metadir(self):
874
773
        """Ensure that cloning metadir is suitable"""
875
 
        bzrdir = self.make_controldir('bzrdir')
 
774
        bzrdir = self.make_bzrdir('bzrdir')
876
775
        bzrdir.cloning_metadir()
877
776
        branch = self.make_branch('branch', format='knit')
878
 
        format = branch.controldir.cloning_metadir()
 
777
        format = branch.bzrdir.cloning_metadir()
879
778
        self.assertIsInstance(format.workingtree_format,
880
 
                              workingtree_4.WorkingTreeFormat6)
 
779
            workingtree.WorkingTreeFormat3)
881
780
 
882
781
    def test_sprout_recursive_treeless(self):
883
782
        tree = self.make_branch_and_tree('tree1',
884
 
                                         format='development-subtree')
 
783
            format='dirstate-with-subtree')
885
784
        sub_tree = self.make_branch_and_tree('tree1/subtree',
886
 
                                             format='development-subtree')
 
785
            format='dirstate-with-subtree')
887
786
        tree.add_reference(sub_tree)
888
 
        tree.set_reference_info('subtree', sub_tree.branch.user_url)
889
787
        self.build_tree(['tree1/subtree/file'])
890
788
        sub_tree.add('file')
891
789
        tree.commit('Initial commit')
892
 
        # The following line force the orhaning to reveal bug #634470
893
 
        tree.branch.get_config_stack().set('transform.orphan_policy', 'move')
894
 
        tree.controldir.destroy_workingtree()
895
 
        # FIXME: subtree/.bzr is left here which allows the test to pass (or
896
 
        # fail :-( ) -- vila 20100909
 
790
        tree.bzrdir.destroy_workingtree()
897
791
        repo = self.make_repository('repo', shared=True,
898
 
                                    format='development-subtree')
 
792
            format='dirstate-with-subtree')
899
793
        repo.set_make_working_trees(False)
900
 
        # FIXME: we just deleted the workingtree and now we want to use it ????
901
 
        # At a minimum, we should use tree.branch below (but this fails too
902
 
        # currently) or stop calling this test 'treeless'. Specifically, I've
903
 
        # turn the line below into an assertRaises when 'subtree/.bzr' is
904
 
        # orphaned and sprout tries to access the branch there (which is left
905
 
        # by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
906
 
        # [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
907
 
        # #634470.  -- vila 20100909
908
 
        tree.controldir.sprout('repo/tree2')
909
 
        self.assertPathExists('repo/tree2/subtree')
910
 
        self.assertPathDoesNotExist('repo/tree2/subtree/file')
 
794
        tree.bzrdir.sprout('repo/tree2')
 
795
        self.failUnlessExists('repo/tree2/subtree')
 
796
        self.failIfExists('repo/tree2/subtree/file')
911
797
 
912
798
    def make_foo_bar_baz(self):
913
 
        foo = bzrdir.BzrDir.create_branch_convenience('foo').controldir
914
 
        bar = self.make_branch('foo/bar').controldir
915
 
        baz = self.make_branch('baz').controldir
 
799
        foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
 
800
        bar = self.make_branch('foo/bar').bzrdir
 
801
        baz = self.make_branch('baz').bzrdir
916
802
        return foo, bar, baz
917
803
 
918
 
    def test_find_controldirs(self):
919
 
        foo, bar, baz = self.make_foo_bar_baz()
920
 
        t = self.get_transport()
921
 
        self.assertEqualBzrdirs(
922
 
            [baz, foo, bar], bzrdir.BzrDir.find_controldirs(t))
923
 
 
924
 
    def make_fake_permission_denied_transport(self, transport, paths):
925
 
        """Create a transport that raises PermissionDenied for some paths."""
926
 
        def filter(path):
927
 
            if path in paths:
928
 
                raise errors.PermissionDenied(path)
929
 
            return path
930
 
        path_filter_server = pathfilter.PathFilteringServer(transport, filter)
931
 
        path_filter_server.start_server()
932
 
        self.addCleanup(path_filter_server.stop_server)
933
 
        path_filter_transport = pathfilter.PathFilteringTransport(
934
 
            path_filter_server, '.')
935
 
        return (path_filter_server, path_filter_transport)
936
 
 
937
 
    def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
938
 
        """Check that each branch url ends with the given suffix."""
939
 
        for actual_bzrdir in actual_bzrdirs:
940
 
            self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
941
 
 
942
 
    def test_find_controldirs_permission_denied(self):
943
 
        foo, bar, baz = self.make_foo_bar_baz()
944
 
        t = self.get_transport()
945
 
        path_filter_server, path_filter_transport = \
946
 
            self.make_fake_permission_denied_transport(t, ['foo'])
947
 
        # local transport
948
 
        self.assertBranchUrlsEndWith('/baz/',
949
 
                                     bzrdir.BzrDir.find_controldirs(path_filter_transport))
950
 
        # smart server
951
 
        smart_transport = self.make_smart_server('.',
952
 
                                                 backing_server=path_filter_server)
953
 
        self.assertBranchUrlsEndWith('/baz/',
954
 
                                     bzrdir.BzrDir.find_controldirs(smart_transport))
955
 
 
956
 
    def test_find_controldirs_list_current(self):
 
804
    def test_find_bzrdirs(self):
 
805
        foo, bar, baz = self.make_foo_bar_baz()
 
806
        transport = get_transport(self.get_url())
 
807
        self.assertEqualBzrdirs([baz, foo, bar],
 
808
                                bzrdir.BzrDir.find_bzrdirs(transport))
 
809
 
 
810
    def test_find_bzrdirs_list_current(self):
957
811
        def list_current(transport):
958
812
            return [s for s in transport.list_dir('') if s != 'baz']
959
813
 
960
814
        foo, bar, baz = self.make_foo_bar_baz()
961
 
        t = self.get_transport()
962
 
        self.assertEqualBzrdirs(
963
 
            [foo, bar],
964
 
            bzrdir.BzrDir.find_controldirs(t, list_current=list_current))
965
 
 
966
 
    def test_find_controldirs_evaluate(self):
 
815
        transport = get_transport(self.get_url())
 
816
        self.assertEqualBzrdirs([foo, bar],
 
817
                                bzrdir.BzrDir.find_bzrdirs(transport,
 
818
                                    list_current=list_current))
 
819
 
 
820
 
 
821
    def test_find_bzrdirs_evaluate(self):
967
822
        def evaluate(bzrdir):
968
823
            try:
969
824
                repo = bzrdir.open_repository()
970
 
            except errors.NoRepositoryPresent:
 
825
            except NoRepositoryPresent:
971
826
                return True, bzrdir.root_transport.base
972
827
            else:
973
828
                return False, bzrdir.root_transport.base
974
829
 
975
830
        foo, bar, baz = self.make_foo_bar_baz()
976
 
        t = self.get_transport()
 
831
        transport = get_transport(self.get_url())
977
832
        self.assertEqual([baz.root_transport.base, foo.root_transport.base],
978
 
                         list(bzrdir.BzrDir.find_controldirs(t, evaluate=evaluate)))
 
833
                         list(bzrdir.BzrDir.find_bzrdirs(transport,
 
834
                                                         evaluate=evaluate)))
979
835
 
980
836
    def assertEqualBzrdirs(self, first, second):
981
837
        first = list(first)
987
843
    def test_find_branches(self):
988
844
        root = self.make_repository('', shared=True)
989
845
        foo, bar, baz = self.make_foo_bar_baz()
990
 
        qux = self.make_controldir('foo/qux')
991
 
        t = self.get_transport()
992
 
        branches = bzrdir.BzrDir.find_branches(t)
 
846
        qux = self.make_bzrdir('foo/qux')
 
847
        transport = get_transport(self.get_url())
 
848
        branches = bzrdir.BzrDir.find_branches(transport)
993
849
        self.assertEqual(baz.root_transport.base, branches[0].base)
994
850
        self.assertEqual(foo.root_transport.base, branches[1].base)
995
851
        self.assertEqual(bar.root_transport.base, branches[2].base)
996
852
 
997
853
        # ensure this works without a top-level repo
998
 
        branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
 
854
        branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
999
855
        self.assertEqual(foo.root_transport.base, branches[0].base)
1000
856
        self.assertEqual(bar.root_transport.base, branches[1].base)
1001
857
 
1002
858
 
1003
 
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
1004
 
 
1005
 
    def test_find_controldirs_missing_repo(self):
1006
 
        t = self.get_transport()
1007
 
        arepo = self.make_repository('arepo', shared=True)
1008
 
        abranch_url = arepo.user_url + '/abranch'
1009
 
        abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
1010
 
        t.delete_tree('arepo/.bzr')
1011
 
        self.assertRaises(errors.NoRepositoryPresent,
1012
 
                          branch.Branch.open, abranch_url)
1013
 
        self.make_branch('baz')
1014
 
        for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
1015
 
            self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
1016
 
 
1017
 
 
1018
859
class TestMeta1DirFormat(TestCaseWithTransport):
1019
860
    """Tests specific to the meta1 dir format."""
1020
861
 
1024
865
        branch_base = t.clone('branch').base
1025
866
        self.assertEqual(branch_base, dir.get_branch_transport(None).base)
1026
867
        self.assertEqual(branch_base,
1027
 
                         dir.get_branch_transport(BzrBranchFormat5()).base)
 
868
                         dir.get_branch_transport(bzrlib.branch.BzrBranchFormat5()).base)
1028
869
        repository_base = t.clone('repository').base
1029
 
        self.assertEqual(
1030
 
            repository_base, dir.get_repository_transport(None).base)
1031
 
        repository_format = repository.format_registry.get_default()
 
870
        self.assertEqual(repository_base, dir.get_repository_transport(None).base)
1032
871
        self.assertEqual(repository_base,
1033
 
                         dir.get_repository_transport(repository_format).base)
 
872
                         dir.get_repository_transport(weaverepo.RepositoryFormat7()).base)
1034
873
        checkout_base = t.clone('checkout').base
1035
 
        self.assertEqual(
1036
 
            checkout_base, dir.get_workingtree_transport(None).base)
 
874
        self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
1037
875
        self.assertEqual(checkout_base,
1038
 
                         dir.get_workingtree_transport(workingtree_3.WorkingTreeFormat3()).base)
 
876
                         dir.get_workingtree_transport(workingtree.WorkingTreeFormat3()).base)
1039
877
 
1040
878
    def test_meta1dir_uses_lockdir(self):
1041
879
        """Meta1 format uses a LockDir to guard the whole directory, not a file."""
1049
887
        Metadirs should compare equal iff they have the same repo, branch and
1050
888
        tree formats.
1051
889
        """
1052
 
        mydir = controldir.format_registry.make_controldir('knit')
 
890
        mydir = bzrdir.format_registry.make_bzrdir('knit')
1053
891
        self.assertEqual(mydir, mydir)
1054
892
        self.assertFalse(mydir != mydir)
1055
 
        otherdir = controldir.format_registry.make_controldir('knit')
 
893
        otherdir = bzrdir.format_registry.make_bzrdir('knit')
1056
894
        self.assertEqual(otherdir, mydir)
1057
895
        self.assertFalse(otherdir != mydir)
1058
 
        otherdir2 = controldir.format_registry.make_controldir(
1059
 
            'development-subtree')
 
896
        otherdir2 = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
1060
897
        self.assertNotEqual(otherdir2, mydir)
1061
898
        self.assertFalse(otherdir2 == mydir)
1062
899
 
1063
 
    def test_with_features(self):
1064
 
        tree = self.make_branch_and_tree('tree', format='2a')
1065
 
        tree.controldir.update_feature_flags({b"bar": b"required"})
1066
 
        self.assertRaises(bzrdir.MissingFeature, bzrdir.BzrDir.open, 'tree')
1067
 
        bzrdir.BzrDirMetaFormat1.register_feature(b'bar')
1068
 
        self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, b'bar')
1069
 
        dir = bzrdir.BzrDir.open('tree')
1070
 
        self.assertEqual(b"required", dir._format.features.get(b"bar"))
1071
 
        tree.controldir.update_feature_flags({
1072
 
            b"bar": None,
1073
 
            b"nonexistant": None})
1074
 
        dir = bzrdir.BzrDir.open('tree')
1075
 
        self.assertEqual({}, dir._format.features)
1076
 
 
1077
900
    def test_needs_conversion_different_working_tree(self):
1078
901
        # meta1dirs need an conversion if any element is not the default.
1079
 
        new_format = controldir.format_registry.make_controldir('dirstate')
 
902
        new_format = bzrdir.format_registry.make_bzrdir('dirstate')
1080
903
        tree = self.make_branch_and_tree('tree', format='knit')
1081
 
        self.assertTrue(tree.controldir.needs_format_conversion(
 
904
        self.assertTrue(tree.bzrdir.needs_format_conversion(
1082
905
            new_format))
1083
906
 
1084
907
    def test_initialize_on_format_uses_smart_transport(self):
1085
908
        self.setup_smart_server_with_call_log()
1086
 
        new_format = controldir.format_registry.make_controldir('dirstate')
 
909
        new_format = bzrdir.format_registry.make_bzrdir('dirstate')
1087
910
        transport = self.get_transport('target')
1088
911
        transport.ensure_base()
1089
912
        self.reset_smart_call_log()
1098
921
        self.assertEqual(2, rpc_count)
1099
922
 
1100
923
 
 
924
class TestFormat5(TestCaseWithTransport):
 
925
    """Tests specific to the version 5 bzrdir format."""
 
926
 
 
927
    def test_same_lockfiles_between_tree_repo_branch(self):
 
928
        # this checks that only a single lockfiles instance is created
 
929
        # for format 5 objects
 
930
        dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
 
931
        def check_dir_components_use_same_lock(dir):
 
932
            ctrl_1 = dir.open_repository().control_files
 
933
            ctrl_2 = dir.open_branch().control_files
 
934
            ctrl_3 = dir.open_workingtree()._control_files
 
935
            self.assertTrue(ctrl_1 is ctrl_2)
 
936
            self.assertTrue(ctrl_2 is ctrl_3)
 
937
        check_dir_components_use_same_lock(dir)
 
938
        # and if we open it normally.
 
939
        dir = bzrdir.BzrDir.open(self.get_url())
 
940
        check_dir_components_use_same_lock(dir)
 
941
 
 
942
    def test_can_convert(self):
 
943
        # format 5 dirs are convertable
 
944
        dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
 
945
        self.assertTrue(dir.can_convert_format())
 
946
 
 
947
    def test_needs_conversion(self):
 
948
        # format 5 dirs need a conversion if they are not the default,
 
949
        # and they aren't
 
950
        dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
 
951
        # don't need to convert it to itself
 
952
        self.assertFalse(dir.needs_format_conversion(bzrdir.BzrDirFormat5()))
 
953
        # do need to convert it to the current default
 
954
        self.assertTrue(dir.needs_format_conversion(
 
955
            bzrdir.BzrDirFormat.get_default_format()))
 
956
 
 
957
 
 
958
class TestFormat6(TestCaseWithTransport):
 
959
    """Tests specific to the version 6 bzrdir format."""
 
960
 
 
961
    def test_same_lockfiles_between_tree_repo_branch(self):
 
962
        # this checks that only a single lockfiles instance is created
 
963
        # for format 6 objects
 
964
        dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
 
965
        def check_dir_components_use_same_lock(dir):
 
966
            ctrl_1 = dir.open_repository().control_files
 
967
            ctrl_2 = dir.open_branch().control_files
 
968
            ctrl_3 = dir.open_workingtree()._control_files
 
969
            self.assertTrue(ctrl_1 is ctrl_2)
 
970
            self.assertTrue(ctrl_2 is ctrl_3)
 
971
        check_dir_components_use_same_lock(dir)
 
972
        # and if we open it normally.
 
973
        dir = bzrdir.BzrDir.open(self.get_url())
 
974
        check_dir_components_use_same_lock(dir)
 
975
 
 
976
    def test_can_convert(self):
 
977
        # format 6 dirs are convertable
 
978
        dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
 
979
        self.assertTrue(dir.can_convert_format())
 
980
 
 
981
    def test_needs_conversion(self):
 
982
        # format 6 dirs need an conversion if they are not the default.
 
983
        dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
 
984
        self.assertTrue(dir.needs_format_conversion(
 
985
            bzrdir.BzrDirFormat.get_default_format()))
 
986
 
 
987
 
 
988
class NotBzrDir(bzrlib.bzrdir.BzrDir):
 
989
    """A non .bzr based control directory."""
 
990
 
 
991
    def __init__(self, transport, format):
 
992
        self._format = format
 
993
        self.root_transport = transport
 
994
        self.transport = transport.clone('.not')
 
995
 
 
996
 
 
997
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
 
998
    """A test class representing any non-.bzr based disk format."""
 
999
 
 
1000
    def initialize_on_transport(self, transport):
 
1001
        """Initialize a new .not dir in the base directory of a Transport."""
 
1002
        transport.mkdir('.not')
 
1003
        return self.open(transport)
 
1004
 
 
1005
    def open(self, transport):
 
1006
        """Open this directory."""
 
1007
        return NotBzrDir(transport, self)
 
1008
 
 
1009
    @classmethod
 
1010
    def _known_formats(self):
 
1011
        return set([NotBzrDirFormat()])
 
1012
 
 
1013
    @classmethod
 
1014
    def probe_transport(self, transport):
 
1015
        """Our format is present if the transport ends in '.not/'."""
 
1016
        if transport.has('.not'):
 
1017
            return NotBzrDirFormat()
 
1018
 
 
1019
 
 
1020
class TestNotBzrDir(TestCaseWithTransport):
 
1021
    """Tests for using the bzrdir api with a non .bzr based disk format.
 
1022
 
 
1023
    If/when one of these is in the core, we can let the implementation tests
 
1024
    verify this works.
 
1025
    """
 
1026
 
 
1027
    def test_create_and_find_format(self):
 
1028
        # create a .notbzr dir
 
1029
        format = NotBzrDirFormat()
 
1030
        dir = format.initialize(self.get_url())
 
1031
        self.assertIsInstance(dir, NotBzrDir)
 
1032
        # now probe for it.
 
1033
        bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
 
1034
        try:
 
1035
            found = bzrlib.bzrdir.BzrDirFormat.find_format(
 
1036
                get_transport(self.get_url()))
 
1037
            self.assertIsInstance(found, NotBzrDirFormat)
 
1038
        finally:
 
1039
            bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
 
1040
 
 
1041
    def test_included_in_known_formats(self):
 
1042
        bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
 
1043
        try:
 
1044
            formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
 
1045
            for format in formats:
 
1046
                if isinstance(format, NotBzrDirFormat):
 
1047
                    return
 
1048
            self.fail("No NotBzrDirFormat in %s" % formats)
 
1049
        finally:
 
1050
            bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
 
1051
 
 
1052
 
1101
1053
class NonLocalTests(TestCaseWithTransport):
1102
1054
    """Tests for bzrdir static behaviour on non local paths."""
1103
1055
 
1107
1059
 
1108
1060
    def test_create_branch_convenience(self):
1109
1061
        # outside a repo the default convenience output is a repo+branch_tree
1110
 
        format = controldir.format_registry.make_controldir('knit')
 
1062
        format = bzrdir.format_registry.make_bzrdir('knit')
1111
1063
        branch = bzrdir.BzrDir.create_branch_convenience(
1112
1064
            self.get_url('foo'), format=format)
1113
1065
        self.assertRaises(errors.NoWorkingTree,
1114
 
                          branch.controldir.open_workingtree)
1115
 
        branch.controldir.open_repository()
 
1066
                          branch.bzrdir.open_workingtree)
 
1067
        branch.bzrdir.open_repository()
1116
1068
 
1117
1069
    def test_create_branch_convenience_force_tree_not_local_fails(self):
1118
1070
        # outside a repo the default convenience output is a repo+branch_tree
1119
 
        format = controldir.format_registry.make_controldir('knit')
 
1071
        format = bzrdir.format_registry.make_bzrdir('knit')
1120
1072
        self.assertRaises(errors.NotLocalUrl,
1121
 
                          bzrdir.BzrDir.create_branch_convenience,
1122
 
                          self.get_url('foo'),
1123
 
                          force_new_tree=True,
1124
 
                          format=format)
1125
 
        t = self.get_transport()
 
1073
            bzrdir.BzrDir.create_branch_convenience,
 
1074
            self.get_url('foo'),
 
1075
            force_new_tree=True,
 
1076
            format=format)
 
1077
        t = get_transport(self.get_url('.'))
1126
1078
        self.assertFalse(t.has('foo'))
1127
1079
 
1128
1080
    def test_clone(self):
1129
1081
        # clone into a nonlocal path works
1130
 
        format = controldir.format_registry.make_controldir('knit')
 
1082
        format = bzrdir.format_registry.make_bzrdir('knit')
1131
1083
        branch = bzrdir.BzrDir.create_branch_convenience('local',
1132
1084
                                                         format=format)
1133
 
        branch.controldir.open_workingtree()
1134
 
        result = branch.controldir.clone(self.get_url('remote'))
 
1085
        branch.bzrdir.open_workingtree()
 
1086
        result = branch.bzrdir.clone(self.get_url('remote'))
1135
1087
        self.assertRaises(errors.NoWorkingTree,
1136
1088
                          result.open_workingtree)
1137
1089
        result.open_branch()
1144
1096
        my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
1145
1097
        checkout_format = my_bzrdir.checkout_metadir()
1146
1098
        self.assertIsInstance(checkout_format.workingtree_format,
1147
 
                              workingtree_4.WorkingTreeFormat4)
1148
 
 
1149
 
 
1150
 
class TestHTTPRedirectionsBase(object):
 
1099
                              workingtree.WorkingTreeFormat3)
 
1100
 
 
1101
 
 
1102
class TestHTTPRedirections(object):
1151
1103
    """Test redirection between two http servers.
1152
1104
 
1153
1105
    This MUST be used by daughter classes that also inherit from
1159
1111
    """
1160
1112
 
1161
1113
    def create_transport_readonly_server(self):
1162
 
        # We don't set the http protocol version, relying on the default
1163
1114
        return http_utils.HTTPServerRedirecting()
1164
1115
 
1165
1116
    def create_transport_secondary_server(self):
1166
 
        # We don't set the http protocol version, relying on the default
1167
1117
        return http_utils.HTTPServerRedirecting()
1168
1118
 
1169
1119
    def setUp(self):
1170
 
        super(TestHTTPRedirectionsBase, self).setUp()
 
1120
        super(TestHTTPRedirections, self).setUp()
1171
1121
        # The redirections will point to the new server
1172
1122
        self.new_server = self.get_readonly_server()
1173
1123
        # The requests to the old server will be redirected
1201
1151
        self.assertIsInstance(bdir.root_transport, type(start))
1202
1152
 
1203
1153
 
1204
 
class TestHTTPRedirections(TestHTTPRedirectionsBase,
1205
 
                           http_utils.TestCaseWithTwoWebservers):
 
1154
class TestHTTPRedirections_urllib(TestHTTPRedirections,
 
1155
                                  http_utils.TestCaseWithTwoWebservers):
1206
1156
    """Tests redirections for urllib implementation"""
1207
1157
 
1208
 
    _transport = HttpTransport
1209
 
 
1210
 
    def _qualified_url(self, host, port):
1211
 
        result = 'http://%s:%s' % (host, port)
1212
 
        self.permit_url(result)
1213
 
        return result
1214
 
 
1215
 
 
1216
 
class TestHTTPRedirections_nosmart(TestHTTPRedirectionsBase,
1217
 
                                   http_utils.TestCaseWithTwoWebservers):
 
1158
    _transport = HttpTransport_urllib
 
1159
 
 
1160
    def _qualified_url(self, host, port):
 
1161
        result = 'http+urllib://%s:%s' % (host, port)
 
1162
        self.permit_url(result)
 
1163
        return result
 
1164
 
 
1165
 
 
1166
 
 
1167
class TestHTTPRedirections_pycurl(TestWithTransport_pycurl,
 
1168
                                  TestHTTPRedirections,
 
1169
                                  http_utils.TestCaseWithTwoWebservers):
 
1170
    """Tests redirections for pycurl implementation"""
 
1171
 
 
1172
    def _qualified_url(self, host, port):
 
1173
        result = 'http+pycurl://%s:%s' % (host, port)
 
1174
        self.permit_url(result)
 
1175
        return result
 
1176
 
 
1177
 
 
1178
class TestHTTPRedirections_nosmart(TestHTTPRedirections,
 
1179
                                  http_utils.TestCaseWithTwoWebservers):
1218
1180
    """Tests redirections for the nosmart decorator"""
1219
1181
 
1220
1182
    _transport = NoSmartTransportDecorator
1225
1187
        return result
1226
1188
 
1227
1189
 
1228
 
class TestHTTPRedirections_readonly(TestHTTPRedirectionsBase,
 
1190
class TestHTTPRedirections_readonly(TestHTTPRedirections,
1229
1191
                                    http_utils.TestCaseWithTwoWebservers):
1230
1192
    """Tests redirections for readonly decoratror"""
1231
1193
 
1245
1207
 
1246
1208
    def get_ls(self):
1247
1209
        f = subprocess.Popen(self.ls, stdout=subprocess.PIPE,
1248
 
                             stderr=subprocess.PIPE)
 
1210
            stderr=subprocess.PIPE)
1249
1211
        out, err = f.communicate()
1250
1212
        self.assertEqual(0, f.returncode, 'Calling %s failed: %s'
1251
1213
                         % (self.ls, err))
1252
1214
        return out.splitlines()
1253
1215
 
1254
1216
    def test_dot_bzr_hidden(self):
 
1217
        if sys.platform == 'win32' and not win32utils.has_win32file:
 
1218
            raise TestSkipped('unable to make file hidden without pywin32 library')
1255
1219
        b = bzrdir.BzrDir.create('.')
1256
1220
        self.build_tree(['a'])
1257
 
        self.assertEqual([b'a'], self.get_ls())
 
1221
        self.assertEquals(['a'], self.get_ls())
1258
1222
 
1259
1223
    def test_dot_bzr_hidden_with_url(self):
 
1224
        if sys.platform == 'win32' and not win32utils.has_win32file:
 
1225
            raise TestSkipped('unable to make file hidden without pywin32 library')
1260
1226
        b = bzrdir.BzrDir.create(urlutils.local_path_to_url('.'))
1261
1227
        self.build_tree(['a'])
1262
 
        self.assertEqual([b'a'], self.get_ls())
 
1228
        self.assertEquals(['a'], self.get_ls())
1263
1229
 
1264
1230
 
1265
1231
class _TestBzrDirFormat(bzrdir.BzrDirMetaFormat1):
1278
1244
 
1279
1245
    def __init__(self, *args, **kwargs):
1280
1246
        super(_TestBzrDir, self).__init__(*args, **kwargs)
1281
 
        self.test_branch = _TestBranch(self.transport)
 
1247
        self.test_branch = _TestBranch()
1282
1248
        self.test_branch.repository = self.create_repository()
1283
1249
 
1284
 
    def open_branch(self, unsupported=False, possible_transports=None):
 
1250
    def open_branch(self, unsupported=False):
1285
1251
        return self.test_branch
1286
1252
 
1287
1253
    def cloning_metadir(self, require_stacking=False):
1288
1254
        return _TestBzrDirFormat()
1289
1255
 
1290
1256
 
1291
 
class _TestBranchFormat(breezy.branch.BranchFormat):
 
1257
class _TestBranchFormat(bzrlib.branch.BranchFormat):
1292
1258
    """Test Branch format for TestBzrDirSprout."""
1293
1259
 
1294
1260
 
1295
 
class _TestBranch(breezy.branch.Branch):
 
1261
class _TestBranch(bzrlib.branch.Branch):
1296
1262
    """Test Branch implementation for TestBzrDirSprout."""
1297
1263
 
1298
 
    def __init__(self, transport, *args, **kwargs):
 
1264
    def __init__(self, *args, **kwargs):
1299
1265
        self._format = _TestBranchFormat()
1300
 
        self._transport = transport
1301
 
        self.base = transport.base
1302
1266
        super(_TestBranch, self).__init__(*args, **kwargs)
1303
1267
        self.calls = []
1304
1268
        self._parent = None
1305
1269
 
1306
1270
    def sprout(self, *args, **kwargs):
1307
1271
        self.calls.append('sprout')
1308
 
        return _TestBranch(self._transport)
 
1272
        return _TestBranch()
1309
1273
 
1310
1274
    def copy_content_into(self, destination, revision_id=None):
1311
1275
        self.calls.append('copy_content_into')
1312
1276
 
1313
 
    def last_revision(self):
1314
 
        return _mod_revision.NULL_REVISION
1315
 
 
1316
1277
    def get_parent(self):
1317
1278
        return self._parent
1318
1279
 
1319
 
    def _get_config(self):
1320
 
        return config.TransportConfig(self._transport, 'branch.conf')
1321
 
 
1322
 
    def _get_config_store(self):
1323
 
        return config.BranchStore(self)
1324
 
 
1325
1280
    def set_parent(self, parent):
1326
1281
        self._parent = parent
1327
1282
 
1328
 
    def lock_read(self):
1329
 
        return lock.LogicalLockResult(self.unlock)
1330
 
 
1331
 
    def unlock(self):
1332
 
        return
1333
 
 
1334
1283
 
1335
1284
class TestBzrDirSprout(TestCaseWithMemoryTransport):
1336
1285
 
1364
1313
 
1365
1314
    def test_sprout_parent(self):
1366
1315
        grandparent_tree = self.make_branch('grandparent')
1367
 
        parent = grandparent_tree.controldir.sprout('parent').open_branch()
1368
 
        branch_tree = parent.controldir.sprout('branch').open_branch()
 
1316
        parent = grandparent_tree.bzrdir.sprout('parent').open_branch()
 
1317
        branch_tree = parent.bzrdir.sprout('branch').open_branch()
1369
1318
        self.assertContainsRe(branch_tree.get_parent(), '/parent/$')
1370
1319
 
1371
1320
 
1381
1330
 
1382
1331
    def test_pre_open_actual_exceptions_raised(self):
1383
1332
        count = [0]
1384
 
 
1385
1333
        def fail_once(transport):
1386
1334
            count[0] += 1
1387
1335
            if count[0] == 1:
1393
1341
        self.assertEqual('fail', err._preformatted_string)
1394
1342
 
1395
1343
    def test_post_repo_init(self):
1396
 
        from ..controldir import RepoInitHookParams
 
1344
        from bzrlib.bzrdir import RepoInitHookParams
1397
1345
        calls = []
1398
1346
        bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1399
 
                                               calls.append, None)
 
1347
            calls.append, None)
1400
1348
        self.make_repository('foo')
1401
1349
        self.assertLength(1, calls)
1402
1350
        params = calls[0]
1403
1351
        self.assertIsInstance(params, RepoInitHookParams)
1404
 
        self.assertTrue(hasattr(params, 'controldir'))
 
1352
        self.assertTrue(hasattr(params, 'bzrdir'))
1405
1353
        self.assertTrue(hasattr(params, 'repository'))
1406
 
 
1407
 
    def test_post_repo_init_hook_repr(self):
1408
 
        param_reprs = []
1409
 
        bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1410
 
                                               lambda params: param_reprs.append(repr(params)), None)
1411
 
        self.make_repository('foo')
1412
 
        self.assertLength(1, param_reprs)
1413
 
        param_repr = param_reprs[0]
1414
 
        self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1415
 
 
1416
 
 
1417
 
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1418
 
    # FIXME: This may need to be unified with test_osutils.TestBackupNames or
1419
 
    # moved to per_bzrdir or per_transport for better coverage ?
1420
 
    # -- vila 20100909
1421
 
 
1422
 
    def setUp(self):
1423
 
        super(TestGenerateBackupName, self).setUp()
1424
 
        self._transport = self.get_transport()
1425
 
        bzrdir.BzrDir.create(self.get_url(),
1426
 
                             possible_transports=[self._transport])
1427
 
        self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1428
 
 
1429
 
    def test_new(self):
1430
 
        self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1431
 
 
1432
 
    def test_exiting(self):
1433
 
        self._transport.put_bytes("a.~1~", b"some content")
1434
 
        self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))
1435
 
 
1436
 
 
1437
 
class TestMeta1DirColoFormat(TestCaseWithTransport):
1438
 
    """Tests specific to the meta1 dir with colocated branches format."""
1439
 
 
1440
 
    def test_supports_colo(self):
1441
 
        format = bzrdir.BzrDirMetaFormat1Colo()
1442
 
        self.assertTrue(format.colocated_branches)
1443
 
 
1444
 
    def test_upgrade_from_2a(self):
1445
 
        tree = self.make_branch_and_tree('.', format='2a')
1446
 
        format = bzrdir.BzrDirMetaFormat1Colo()
1447
 
        self.assertTrue(tree.controldir.needs_format_conversion(format))
1448
 
        converter = tree.controldir._format.get_converter(format)
1449
 
        result = converter.convert(tree.controldir, None)
1450
 
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1451
 
        self.assertFalse(result.needs_format_conversion(format))
1452
 
 
1453
 
    def test_downgrade_to_2a(self):
1454
 
        tree = self.make_branch_and_tree('.', format='development-colo')
1455
 
        format = bzrdir.BzrDirMetaFormat1()
1456
 
        self.assertTrue(tree.controldir.needs_format_conversion(format))
1457
 
        converter = tree.controldir._format.get_converter(format)
1458
 
        result = converter.convert(tree.controldir, None)
1459
 
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1460
 
        self.assertFalse(result.needs_format_conversion(format))
1461
 
 
1462
 
    def test_downgrade_to_2a_too_many_branches(self):
1463
 
        tree = self.make_branch_and_tree('.', format='development-colo')
1464
 
        tree.controldir.create_branch(name="another-colocated-branch")
1465
 
        converter = tree.controldir._format.get_converter(
1466
 
            bzrdir.BzrDirMetaFormat1())
1467
 
        result = converter.convert(tree.controldir, bzrdir.BzrDirMetaFormat1())
1468
 
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1469
 
 
1470
 
    def test_nested(self):
1471
 
        tree = self.make_branch_and_tree('.', format='development-colo')
1472
 
        tree.controldir.create_branch(name='foo')
1473
 
        tree.controldir.create_branch(name='fool/bla')
1474
 
        self.assertRaises(
1475
 
            errors.ParentBranchExists, tree.controldir.create_branch,
1476
 
            name='foo/bar')
1477
 
 
1478
 
    def test_parent(self):
1479
 
        tree = self.make_branch_and_tree('.', format='development-colo')
1480
 
        tree.controldir.create_branch(name='fool/bla')
1481
 
        tree.controldir.create_branch(name='foo/bar')
1482
 
        self.assertRaises(
1483
 
            errors.AlreadyBranchError, tree.controldir.create_branch,
1484
 
            name='foo')
1485
 
 
1486
 
    def test_supports_relative_reference(self):
1487
 
        tree = self.make_branch_and_tree('.', format='development-colo')
1488
 
        target1 = tree.controldir.create_branch(name='target1')
1489
 
        target2 = tree.controldir.create_branch(name='target2')
1490
 
        source = tree.controldir.set_branch_reference(target1, name='source')
1491
 
        self.assertEqual(
1492
 
            target1.user_url, tree.controldir.open_branch('source').user_url)
1493
 
        source.controldir.get_branch_transport(None, 'source').put_bytes(
1494
 
            'location', b'file:,branch=target2')
1495
 
        self.assertEqual(
1496
 
            target2.user_url, tree.controldir.open_branch('source').user_url)
1497
 
 
1498
 
 
1499
 
class SampleBzrFormat(bzrdir.BzrFormat):
1500
 
 
1501
 
    @classmethod
1502
 
    def get_format_string(cls):
1503
 
        return b"First line\n"
1504
 
 
1505
 
 
1506
 
class TestBzrFormat(TestCase):
1507
 
    """Tests for BzrFormat."""
1508
 
 
1509
 
    def test_as_string(self):
1510
 
        format = SampleBzrFormat()
1511
 
        format.features = {b"foo": b"required"}
1512
 
        self.assertEqual(format.as_string(),
1513
 
                         b"First line\n"
1514
 
                         b"required foo\n")
1515
 
        format.features[b"another"] = b"optional"
1516
 
        self.assertEqual(format.as_string(),
1517
 
                         b"First line\n"
1518
 
                         b"optional another\n"
1519
 
                         b"required foo\n")
1520
 
 
1521
 
    def test_network_name(self):
1522
 
        # The network string should include the feature info
1523
 
        format = SampleBzrFormat()
1524
 
        format.features = {b"foo": b"required"}
1525
 
        self.assertEqual(
1526
 
            b"First line\nrequired foo\n",
1527
 
            format.network_name())
1528
 
 
1529
 
    def test_from_string_no_features(self):
1530
 
        # No features
1531
 
        format = SampleBzrFormat.from_string(
1532
 
            b"First line\n")
1533
 
        self.assertEqual({}, format.features)
1534
 
 
1535
 
    def test_from_string_with_feature(self):
1536
 
        # Proper feature
1537
 
        format = SampleBzrFormat.from_string(
1538
 
            b"First line\nrequired foo\n")
1539
 
        self.assertEqual(b"required", format.features.get(b"foo"))
1540
 
 
1541
 
    def test_from_string_format_string_mismatch(self):
1542
 
        # The first line has to match the format string
1543
 
        self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1544
 
                          b"Second line\nrequired foo\n")
1545
 
 
1546
 
    def test_from_string_missing_space(self):
1547
 
        # At least one space is required in the feature lines
1548
 
        self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1549
 
                          b"First line\nfoo\n")
1550
 
 
1551
 
    def test_from_string_with_spaces(self):
1552
 
        # Feature with spaces (in case we add stuff like this in the future)
1553
 
        format = SampleBzrFormat.from_string(
1554
 
            b"First line\nrequired foo with spaces\n")
1555
 
        self.assertEqual(b"required", format.features.get(b"foo with spaces"))
1556
 
 
1557
 
    def test_eq(self):
1558
 
        format1 = SampleBzrFormat()
1559
 
        format1.features = {b"nested-trees": b"optional"}
1560
 
        format2 = SampleBzrFormat()
1561
 
        format2.features = {b"nested-trees": b"optional"}
1562
 
        self.assertEqual(format1, format1)
1563
 
        self.assertEqual(format1, format2)
1564
 
        format3 = SampleBzrFormat()
1565
 
        self.assertNotEqual(format1, format3)
1566
 
 
1567
 
    def test_check_support_status_optional(self):
1568
 
        # Optional, so silently ignore
1569
 
        format = SampleBzrFormat()
1570
 
        format.features = {b"nested-trees": b"optional"}
1571
 
        format.check_support_status(True)
1572
 
        self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1573
 
        SampleBzrFormat.register_feature(b"nested-trees")
1574
 
        format.check_support_status(True)
1575
 
 
1576
 
    def test_check_support_status_required(self):
1577
 
        # Optional, so trigger an exception
1578
 
        format = SampleBzrFormat()
1579
 
        format.features = {b"nested-trees": b"required"}
1580
 
        self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1581
 
                          True)
1582
 
        self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1583
 
        SampleBzrFormat.register_feature(b"nested-trees")
1584
 
        format.check_support_status(True)
1585
 
 
1586
 
    def test_check_support_status_unknown(self):
1587
 
        # treat unknown necessity as required
1588
 
        format = SampleBzrFormat()
1589
 
        format.features = {b"nested-trees": b"unknown"}
1590
 
        self.assertRaises(bzrdir.MissingFeature, format.check_support_status,
1591
 
                          True)
1592
 
        self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1593
 
        SampleBzrFormat.register_feature(b"nested-trees")
1594
 
        format.check_support_status(True)
1595
 
 
1596
 
    def test_feature_already_registered(self):
1597
 
        # a feature can only be registered once
1598
 
        self.addCleanup(SampleBzrFormat.unregister_feature, b"nested-trees")
1599
 
        SampleBzrFormat.register_feature(b"nested-trees")
1600
 
        self.assertRaises(bzrdir.FeatureAlreadyRegistered,
1601
 
                          SampleBzrFormat.register_feature, b"nested-trees")
1602
 
 
1603
 
    def test_feature_with_space(self):
1604
 
        # spaces are not allowed in feature names
1605
 
        self.assertRaises(ValueError, SampleBzrFormat.register_feature,
1606
 
                          b"nested trees")