~bzr-pqm/bzr/bzr.dev

6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
1
# Copyright (C) 2006-2013, 2016 Canonical Ltd
3650.3.10 by Aaron Bentley
Ensure that sprout chooses a rich-root format as needed
2
#
1534.4.39 by Robert Collins
Basic BzrDir support.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
7
#
1534.4.39 by Robert Collins
Basic BzrDir support.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
12
#
1534.4.39 by Robert Collins
Basic BzrDir support.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.39 by Robert Collins
Basic BzrDir support.
16
17
"""Tests for the BzrDir facility and any format specific tests.
18
4523.1.4 by Martin Pool
Rename remaining *_implementations tests
19
For interface contract tests, see tests/per_bzr_dir.
1534.4.39 by Robert Collins
Basic BzrDir support.
20
"""
21
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
22
import os
3023.1.3 by Alexander Belchenko
John's review
23
import subprocess
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
24
import sys
1534.4.39 by Robert Collins
Basic BzrDir support.
25
2204.4.1 by Aaron Bentley
Add 'formats' help topic
26
from bzrlib import (
5215.4.1 by Marius Kruger
BzrDir.find_branches should not fall over when encountering branches with missing repos
27
    branch,
2100.3.35 by Aaron Bentley
equality operations on bzrdir
28
    bzrdir,
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
29
    config,
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
30
    controldir,
2100.3.35 by Aaron Bentley
equality operations on bzrdir
31
    errors,
2204.4.1 by Aaron Bentley
Add 'formats' help topic
32
    help_topics,
5535.3.9 by Andrew Bennetts
Fix test failures.
33
    lock,
2100.3.35 by Aaron Bentley
equality operations on bzrdir
34
    repository,
5535.4.15 by Andrew Bennetts
Fix a test failure.
35
    revision as _mod_revision,
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
36
    osutils,
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
37
    remote,
5609.9.1 by Martin
Blindly change all users of get_transport to address the function via the transport module
38
    transport as _mod_transport,
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
39
    urlutils,
3023.1.2 by Alexander Belchenko
Martin's review.
40
    win32utils,
5816.5.4 by Jelmer Vernooij
Merge bzr.dev.
41
    workingtree_3,
5816.5.6 by Jelmer Vernooij
Fix default working tree format.
42
    workingtree_4,
2204.4.1 by Aaron Bentley
Add 'formats' help topic
43
    )
1508.1.25 by Robert Collins
Update per review comments.
44
import bzrlib.branch
6517.1.6 by Jelmer Vernooij
Fix remaining tests.
45
from bzrlib.branchfmt.fullhistory import BzrBranchFormat5
5582.10.50 by Jelmer Vernooij
Move more weave-specific tests to bzrlib.plugins.weave_fmt.
46
from bzrlib.errors import (
47
    NotBranchError,
48
    NoColocatedBranchSupport,
49
    UnknownFormatError,
50
    UnsupportedFormatError,
51
    )
2164.2.16 by Vincent Ladeuil
Add tests.
52
from bzrlib.tests import (
53
    TestCase,
3583.1.2 by Andrew Bennetts
Add test for fix.
54
    TestCaseWithMemoryTransport,
2164.2.16 by Vincent Ladeuil
Add tests.
55
    TestCaseWithTransport,
3023.1.2 by Alexander Belchenko
Martin's review.
56
    TestSkipped,
2164.2.16 by Vincent Ladeuil
Add tests.
57
    )
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
58
from bzrlib.tests import(
59
    http_server,
60
    http_utils,
2164.2.16 by Vincent Ladeuil
Add tests.
61
    )
62
from bzrlib.tests.test_http import TestWithTransport_pycurl
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
63
from bzrlib.transport import (
64
    memory,
5215.3.2 by Marius Kruger
* Move TestCaseWithMemoryTransport.make_smart_server => TestCaseWithTransport
65
    pathfilter,
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
66
    )
2164.2.16 by Vincent Ladeuil
Add tests.
67
from bzrlib.transport.http._urllib import HttpTransport_urllib
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
68
from bzrlib.transport.nosmart import NoSmartTransportDecorator
69
from bzrlib.transport.readonly import ReadonlyTransportDecorator
5757.1.6 by Jelmer Vernooij
Fix another import.
70
from bzrlib.repofmt import knitrepo, knitpack_repo
1534.4.39 by Robert Collins
Basic BzrDir support.
71
72
73
class TestDefaultFormat(TestCase):
74
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
75
    def test_get_set_default_format(self):
1534.4.39 by Robert Collins
Basic BzrDir support.
76
        old_format = bzrdir.BzrDirFormat.get_default_format()
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
77
        # default is BzrDirMetaFormat1
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
78
        self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
5363.2.7 by Jelmer Vernooij
Fix tests.
79
        controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
1534.4.39 by Robert Collins
Basic BzrDir support.
80
        # creating a bzr dir should now create an instrumented dir.
81
        try:
1685.1.42 by John Arbash Meinel
A couple more fixes to make sure memory:/// works correctly.
82
            result = bzrdir.BzrDir.create('memory:///')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
83
            self.assertIsInstance(result, SampleBzrDir)
1534.4.39 by Robert Collins
Basic BzrDir support.
84
        finally:
5363.2.7 by Jelmer Vernooij
Fix tests.
85
            controldir.ControlDirFormat._set_default_format(old_format)
1534.4.39 by Robert Collins
Basic BzrDir support.
86
        self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
87
88
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
89
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
90
    """A deprecated bzr dir format."""
91
92
2204.4.1 by Aaron Bentley
Add 'formats' help topic
93
class TestFormatRegistry(TestCase):
94
95
    def make_format_registry(self):
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
96
        my_format_registry = controldir.ControlDirFormatRegistry()
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
97
        my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
98
            'Some format.  Slower and unawesome and deprecated.',
99
            deprecated=True)
100
        my_format_registry.register_lazy('lazy', 'bzrlib.tests.test_bzrdir',
101
            'DeprecatedBzrDirFormat', 'Format registered lazily',
102
            deprecated=True)
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
103
        bzrdir.register_metadir(my_format_registry, 'knit',
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
104
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
105
            'Format using knits',
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
106
            )
2204.4.1 by Aaron Bentley
Add 'formats' help topic
107
        my_format_registry.set_default('knit')
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
108
        bzrdir.register_metadir(my_format_registry,
2230.3.53 by Aaron Bentley
Merge bzr.dev
109
            'branch6',
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
110
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
2230.3.53 by Aaron Bentley
Merge bzr.dev
111
            'Experimental successor to knit.  Use at your own risk.',
2939.2.3 by Ian Clatworthy
add tests for experimental formats including help content checking
112
            branch_format='bzrlib.branch.BzrBranchFormat6',
113
            experimental=True)
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
114
        bzrdir.register_metadir(my_format_registry,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
115
            'hidden format',
116
            'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
117
            'Experimental successor to knit.  Use at your own risk.',
118
            branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
119
        my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
120
            'Old format.  Slower and does not support things. ', hidden=True)
121
        my_format_registry.register_lazy('hiddenlazy', 'bzrlib.tests.test_bzrdir',
122
            'DeprecatedBzrDirFormat', 'Format registered lazily',
123
            deprecated=True, hidden=True)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
124
        return my_format_registry
125
126
    def test_format_registry(self):
127
        my_format_registry = self.make_format_registry()
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
128
        my_bzrdir = my_format_registry.make_bzrdir('lazy')
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
129
        self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
130
        my_bzrdir = my_format_registry.make_bzrdir('deprecated')
131
        self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
132
        my_bzrdir = my_format_registry.make_bzrdir('default')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
133
        self.assertIsInstance(my_bzrdir.repository_format,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
134
            knitrepo.RepositoryFormatKnit1)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
135
        my_bzrdir = my_format_registry.make_bzrdir('knit')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
136
        self.assertIsInstance(my_bzrdir.repository_format,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
137
            knitrepo.RepositoryFormatKnit1)
2230.3.1 by Aaron Bentley
Get branch6 creation working
138
        my_bzrdir = my_format_registry.make_bzrdir('branch6')
2230.3.55 by Aaron Bentley
Updates from review
139
        self.assertIsInstance(my_bzrdir.get_branch_format(),
2230.3.1 by Aaron Bentley
Get branch6 creation working
140
                              bzrlib.branch.BzrBranchFormat6)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
141
142
    def test_get_help(self):
143
        my_format_registry = self.make_format_registry()
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
144
        self.assertEqual('Format registered lazily',
145
                         my_format_registry.get_help('lazy'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
146
        self.assertEqual('Format using knits',
2204.4.1 by Aaron Bentley
Add 'formats' help topic
147
                         my_format_registry.get_help('knit'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
148
        self.assertEqual('Format using knits',
2204.4.1 by Aaron Bentley
Add 'formats' help topic
149
                         my_format_registry.get_help('default'))
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
150
        self.assertEqual('Some format.  Slower and unawesome and deprecated.',
151
                         my_format_registry.get_help('deprecated'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
152
2204.4.1 by Aaron Bentley
Add 'formats' help topic
153
    def test_help_topic(self):
154
        topics = help_topics.HelpTopicRegistry()
3892.1.3 by Ian Clatworthy
tweak test suite to support the split up formats topic
155
        registry = self.make_format_registry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
156
        topics.register('current-formats', registry.help_topic,
3892.1.3 by Ian Clatworthy
tweak test suite to support the split up formats topic
157
                        'Current formats')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
158
        topics.register('other-formats', registry.help_topic,
3892.1.3 by Ian Clatworthy
tweak test suite to support the split up formats topic
159
                        'Other formats')
160
        new = topics.get_detail('current-formats')
161
        rest = topics.get_detail('other-formats')
2939.2.3 by Ian Clatworthy
add tests for experimental formats including help content checking
162
        experimental, deprecated = rest.split('Deprecated formats')
4927.2.10 by Ian Clatworthy
fix test failures
163
        self.assertContainsRe(new, 'formats-help')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
164
        self.assertContainsRe(new,
2666.1.8 by Ian Clatworthy
Fix storage formats help test
165
                ':knit:\n    \(native\) \(default\) Format using knits\n')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
166
        self.assertContainsRe(experimental,
2939.2.3 by Ian Clatworthy
add tests for experimental formats including help content checking
167
                ':branch6:\n    \(native\) Experimental successor to knit')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
168
        self.assertContainsRe(deprecated,
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
169
                ':lazy:\n    \(native\) Format registered lazily\n')
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
170
        self.assertNotContainsRe(new, 'hidden')
2204.4.1 by Aaron Bentley
Add 'formats' help topic
171
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
172
    def test_set_default_repository(self):
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
173
        default_factory = controldir.format_registry.get('default')
174
        old_default = [k for k, v in controldir.format_registry.iteritems()
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
175
                       if v == default_factory and k != 'default'][0]
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
176
        controldir.format_registry.set_default_repository('dirstate-with-subtree')
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
177
        try:
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
178
            self.assertIs(controldir.format_registry.get('dirstate-with-subtree'),
179
                          controldir.format_registry.get('default'))
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
180
            self.assertIs(
5651.3.9 by Jelmer Vernooij
Avoid using deprecated functions.
181
                repository.format_registry.get_default().__class__,
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
182
                knitrepo.RepositoryFormatKnit3)
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
183
        finally:
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
184
            controldir.format_registry.set_default_repository(old_default)
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
185
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
186
    def test_aliases(self):
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
187
        a_registry = controldir.ControlDirFormatRegistry()
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
188
        a_registry.register('deprecated', DeprecatedBzrDirFormat,
189
            'Old format.  Slower and does not support stuff',
190
            deprecated=True)
191
        a_registry.register('deprecatedalias', DeprecatedBzrDirFormat,
192
            'Old format.  Slower and does not support stuff',
193
            deprecated=True, alias=True)
194
        self.assertEqual(frozenset(['deprecatedalias']), a_registry.aliases())
3928.3.4 by John Arbash Meinel
SampleBzrDir now needs to return a real repo from open_repository
195
2220.2.25 by Martin Pool
doc
196
1508.1.25 by Robert Collins
Update per review comments.
197
class SampleBranch(bzrlib.branch.Branch):
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
198
    """A dummy branch for guess what, dummy use."""
199
200
    def __init__(self, dir):
201
        self.bzrdir = dir
202
203
3928.3.4 by John Arbash Meinel
SampleBzrDir now needs to return a real repo from open_repository
204
class SampleRepository(bzrlib.repository.Repository):
205
    """A dummy repo."""
206
207
    def __init__(self, dir):
208
        self.bzrdir = dir
209
210
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
211
class SampleBzrDir(bzrdir.BzrDir):
212
    """A sample BzrDir implementation to allow testing static methods."""
213
1841.2.1 by Jelmer Vernooij
Fix handling of `shared' parameter in BzrDir.create_repository().
214
    def create_repository(self, shared=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
215
        """See ControlDir.create_repository."""
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
216
        return "A repository"
217
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
218
    def open_repository(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
219
        """See ControlDir.open_repository."""
3928.3.4 by John Arbash Meinel
SampleBzrDir now needs to return a real repo from open_repository
220
        return SampleRepository(self)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
221
5051.3.3 by Jelmer Vernooij
Add tests for colo branches.
222
    def create_branch(self, name=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
223
        """See ControlDir.create_branch."""
5051.3.3 by Jelmer Vernooij
Add tests for colo branches.
224
        if name is not None:
225
            raise NoColocatedBranchSupport(self)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
226
        return SampleBranch(self)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
227
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
228
    def create_workingtree(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
229
        """See ControlDir.create_workingtree."""
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
230
        return "A tree"
231
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
232
1534.4.39 by Robert Collins
Basic BzrDir support.
233
class SampleBzrDirFormat(bzrdir.BzrDirFormat):
234
    """A sample format
235
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
236
    this format is initializable, unsupported to aid in testing the
1534.4.39 by Robert Collins
Basic BzrDir support.
237
    open and open_downlevel routines.
238
    """
239
240
    def get_format_string(self):
241
        """See BzrDirFormat.get_format_string()."""
242
        return "Sample .bzr dir format."
243
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
244
    def initialize_on_transport(self, t):
1534.4.39 by Robert Collins
Basic BzrDir support.
245
        """Create a bzr dir."""
246
        t.mkdir('.bzr')
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
247
        t.put_bytes('.bzr/branch-format', self.get_format_string())
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
248
        return SampleBzrDir(t, self)
1534.4.39 by Robert Collins
Basic BzrDir support.
249
250
    def is_supported(self):
251
        return False
252
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
253
    def open(self, transport, _found=None):
1534.4.39 by Robert Collins
Basic BzrDir support.
254
        return "opened branch."
255
6213.1.7 by Jelmer Vernooij
Features doesn't use format string.
256
    @classmethod
257
    def from_string(cls, format_string):
258
        return cls()
259
1534.4.39 by Robert Collins
Basic BzrDir support.
260
5669.1.2 by Jelmer Vernooij
Review comments from Vincent.
261
class BzrDirFormatTest1(bzrdir.BzrDirMetaFormat1):
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
262
263
    @staticmethod
264
    def get_format_string():
265
        return "Test format 1"
266
267
5669.1.2 by Jelmer Vernooij
Review comments from Vincent.
268
class BzrDirFormatTest2(bzrdir.BzrDirMetaFormat1):
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
269
270
    @staticmethod
271
    def get_format_string():
272
        return "Test format 2"
273
274
1534.4.39 by Robert Collins
Basic BzrDir support.
275
class TestBzrDirFormat(TestCaseWithTransport):
276
    """Tests for the BzrDirFormat facility."""
277
278
    def test_find_format(self):
279
        # is the right format object found for a branch?
280
        # create a branch with a few known format objects.
5712.3.18 by Jelmer Vernooij
Some more test fixes.
281
        bzrdir.BzrProber.formats.register(BzrDirFormatTest1.get_format_string(),
282
            BzrDirFormatTest1())
283
        self.addCleanup(bzrdir.BzrProber.formats.remove,
284
            BzrDirFormatTest1.get_format_string())
285
        bzrdir.BzrProber.formats.register(BzrDirFormatTest2.get_format_string(),
286
            BzrDirFormatTest2())
287
        self.addCleanup(bzrdir.BzrProber.formats.remove,
288
            BzrDirFormatTest2.get_format_string())
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
289
        t = self.get_transport()
1534.4.39 by Robert Collins
Basic BzrDir support.
290
        self.build_tree(["foo/", "bar/"], transport=t)
291
        def check_format(format, url):
292
            format.initialize(url)
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
293
            t = _mod_transport.get_transport_from_path(url)
1534.4.39 by Robert Collins
Basic BzrDir support.
294
            found_format = bzrdir.BzrDirFormat.find_format(t)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
295
            self.assertIsInstance(found_format, format.__class__)
5669.1.2 by Jelmer Vernooij
Review comments from Vincent.
296
        check_format(BzrDirFormatTest1(), "foo")
297
        check_format(BzrDirFormatTest2(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
298
1534.4.39 by Robert Collins
Basic BzrDir support.
299
    def test_find_format_nothing_there(self):
300
        self.assertRaises(NotBranchError,
301
                          bzrdir.BzrDirFormat.find_format,
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
302
                          _mod_transport.get_transport_from_path('.'))
1534.4.39 by Robert Collins
Basic BzrDir support.
303
304
    def test_find_format_unknown_format(self):
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
305
        t = self.get_transport()
1534.4.39 by Robert Collins
Basic BzrDir support.
306
        t.mkdir('.bzr')
1955.3.13 by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings.
307
        t.put_bytes('.bzr/branch-format', '')
1534.4.39 by Robert Collins
Basic BzrDir support.
308
        self.assertRaises(UnknownFormatError,
309
                          bzrdir.BzrDirFormat.find_format,
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
310
                          _mod_transport.get_transport_from_path('.'))
1534.4.39 by Robert Collins
Basic BzrDir support.
311
312
    def test_register_unregister_format(self):
313
        format = SampleBzrDirFormat()
314
        url = self.get_url()
315
        # make a bzrdir
316
        format.initialize(url)
317
        # register a format for it.
5712.3.18 by Jelmer Vernooij
Some more test fixes.
318
        bzrdir.BzrProber.formats.register(format.get_format_string(), format)
1534.4.39 by Robert Collins
Basic BzrDir support.
319
        # which bzrdir.Open will refuse (not supported)
320
        self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open, url)
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
321
        # which bzrdir.open_containing will refuse (not supported)
322
        self.assertRaises(UnsupportedFormatError, bzrdir.BzrDir.open_containing, url)
1534.4.39 by Robert Collins
Basic BzrDir support.
323
        # but open_downlevel will work
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
324
        t = _mod_transport.get_transport_from_url(url)
1534.4.39 by Robert Collins
Basic BzrDir support.
325
        self.assertEqual(format.open(t), bzrdir.BzrDir.open_unsupported(url))
326
        # unregister the format
5712.3.18 by Jelmer Vernooij
Some more test fixes.
327
        bzrdir.BzrProber.formats.remove(format.get_format_string())
1534.4.39 by Robert Collins
Basic BzrDir support.
328
        # now open_downlevel should fail too.
329
        self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
330
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
331
    def test_create_branch_and_repo_uses_default(self):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
332
        format = SampleBzrDirFormat()
2476.3.10 by Vincent Ladeuil
Add a test for create_branch_convenience. Mark some places to test for multiple connections.
333
        branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url(),
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
334
                                                      format=format)
335
        self.assertTrue(isinstance(branch, SampleBranch))
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
336
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
337
    def test_create_branch_and_repo_under_shared(self):
338
        # creating a branch and repo in a shared repo uses the
339
        # shared repository
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
340
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
341
        self.make_repository('.', shared=True, format=format)
342
        branch = bzrdir.BzrDir.create_branch_and_repo(
343
            self.get_url('child'), format=format)
344
        self.assertRaises(errors.NoRepositoryPresent,
345
                          branch.bzrdir.open_repository)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
346
347
    def test_create_branch_and_repo_under_shared_force_new(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
348
        # creating a branch and repo in a shared repo can be forced to
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
349
        # make a new repo
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
350
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
351
        self.make_repository('.', shared=True, format=format)
352
        branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url('child'),
353
                                                      force_new_repo=True,
354
                                                      format=format)
355
        branch.bzrdir.open_repository()
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
356
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
357
    def test_create_standalone_working_tree(self):
358
        format = SampleBzrDirFormat()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
359
        # note this is deliberately readonly, as this failure should
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
360
        # occur before any writes.
361
        self.assertRaises(errors.NotLocalUrl,
362
                          bzrdir.BzrDir.create_standalone_workingtree,
363
                          self.get_readonly_url(), format=format)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
364
        tree = bzrdir.BzrDir.create_standalone_workingtree('.',
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
365
                                                           format=format)
366
        self.assertEqual('A tree', tree)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
367
1534.6.10 by Robert Collins
Finish use of repositories support.
368
    def test_create_standalone_working_tree_under_shared_repo(self):
369
        # create standalone working tree always makes a repo.
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
370
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
371
        self.make_repository('.', shared=True, format=format)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
372
        # note this is deliberately readonly, as this failure should
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
373
        # occur before any writes.
374
        self.assertRaises(errors.NotLocalUrl,
375
                          bzrdir.BzrDir.create_standalone_workingtree,
376
                          self.get_readonly_url('child'), format=format)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
377
        tree = bzrdir.BzrDir.create_standalone_workingtree('child',
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
378
            format=format)
379
        tree.bzrdir.open_repository()
1534.6.10 by Robert Collins
Finish use of repositories support.
380
381
    def test_create_branch_convenience(self):
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
382
        # outside a repo the default convenience output is a repo+branch_tree
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
383
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
384
        branch = bzrdir.BzrDir.create_branch_convenience('.', format=format)
385
        branch.bzrdir.open_workingtree()
386
        branch.bzrdir.open_repository()
1534.6.10 by Robert Collins
Finish use of repositories support.
387
2476.3.10 by Vincent Ladeuil
Add a test for create_branch_convenience. Mark some places to test for multiple connections.
388
    def test_create_branch_convenience_possible_transports(self):
389
        """Check that the optional 'possible_transports' is recognized"""
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
390
        format = controldir.format_registry.make_bzrdir('knit')
2476.3.10 by Vincent Ladeuil
Add a test for create_branch_convenience. Mark some places to test for multiple connections.
391
        t = self.get_transport()
392
        branch = bzrdir.BzrDir.create_branch_convenience(
393
            '.', format=format, possible_transports=[t])
394
        branch.bzrdir.open_workingtree()
395
        branch.bzrdir.open_repository()
396
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
397
    def test_create_branch_convenience_root(self):
398
        """Creating a branch at the root of a fs should work."""
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
399
        self.vfs_transport_factory = memory.MemoryServer
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
400
        # outside a repo the default convenience output is a repo+branch_tree
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
401
        format = controldir.format_registry.make_bzrdir('knit')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
402
        branch = bzrdir.BzrDir.create_branch_convenience(self.get_url(),
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
403
                                                         format=format)
404
        self.assertRaises(errors.NoWorkingTree,
405
                          branch.bzrdir.open_workingtree)
406
        branch.bzrdir.open_repository()
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
407
1534.6.10 by Robert Collins
Finish use of repositories support.
408
    def test_create_branch_convenience_under_shared_repo(self):
409
        # inside a repo the default convenience output is a branch+ follow the
410
        # repo tree policy
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
411
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
412
        self.make_repository('.', shared=True, format=format)
413
        branch = bzrdir.BzrDir.create_branch_convenience('child',
414
            format=format)
415
        branch.bzrdir.open_workingtree()
416
        self.assertRaises(errors.NoRepositoryPresent,
417
                          branch.bzrdir.open_repository)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
418
1534.6.10 by Robert Collins
Finish use of repositories support.
419
    def test_create_branch_convenience_under_shared_repo_force_no_tree(self):
420
        # inside a repo the default convenience output is a branch+ follow the
421
        # repo tree policy but we can override that
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
422
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
423
        self.make_repository('.', shared=True, format=format)
424
        branch = bzrdir.BzrDir.create_branch_convenience('child',
425
            force_new_tree=False, format=format)
426
        self.assertRaises(errors.NoWorkingTree,
427
                          branch.bzrdir.open_workingtree)
428
        self.assertRaises(errors.NoRepositoryPresent,
429
                          branch.bzrdir.open_repository)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
430
1534.6.10 by Robert Collins
Finish use of repositories support.
431
    def test_create_branch_convenience_under_shared_repo_no_tree_policy(self):
432
        # inside a repo the default convenience output is a branch+ follow the
433
        # repo tree policy
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
434
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
435
        repo = self.make_repository('.', shared=True, format=format)
436
        repo.set_make_working_trees(False)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
437
        branch = bzrdir.BzrDir.create_branch_convenience('child',
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
438
                                                         format=format)
439
        self.assertRaises(errors.NoWorkingTree,
440
                          branch.bzrdir.open_workingtree)
441
        self.assertRaises(errors.NoRepositoryPresent,
442
                          branch.bzrdir.open_repository)
1534.6.10 by Robert Collins
Finish use of repositories support.
443
444
    def test_create_branch_convenience_under_shared_repo_no_tree_policy_force_tree(self):
445
        # inside a repo the default convenience output is a branch+ follow the
446
        # repo tree policy but we can override that
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
447
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
448
        repo = self.make_repository('.', shared=True, format=format)
449
        repo.set_make_working_trees(False)
450
        branch = bzrdir.BzrDir.create_branch_convenience('child',
451
            force_new_tree=True, format=format)
452
        branch.bzrdir.open_workingtree()
453
        self.assertRaises(errors.NoRepositoryPresent,
454
                          branch.bzrdir.open_repository)
1534.6.10 by Robert Collins
Finish use of repositories support.
455
456
    def test_create_branch_convenience_under_shared_repo_force_new_repo(self):
457
        # inside a repo the default convenience output is overridable to give
458
        # repo+branch+tree
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
459
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
460
        self.make_repository('.', shared=True, format=format)
461
        branch = bzrdir.BzrDir.create_branch_convenience('child',
462
            force_new_repo=True, format=format)
463
        branch.bzrdir.open_repository()
464
        branch.bzrdir.open_workingtree()
1534.6.10 by Robert Collins
Finish use of repositories support.
465
3242.2.14 by Aaron Bentley
Update from review comments
466
467
class TestRepositoryAcquisitionPolicy(TestCaseWithTransport):
468
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
469
    def test_acquire_repository_standalone(self):
3242.2.14 by Aaron Bentley
Update from review comments
470
        """The default acquisition policy should create a standalone branch."""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
471
        my_bzrdir = self.make_bzrdir('.')
472
        repo_policy = my_bzrdir.determine_repository_policy()
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
473
        repo, is_new = repo_policy.acquire_repository()
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
474
        self.assertEqual(repo.bzrdir.root_transport.base,
475
                         my_bzrdir.root_transport.base)
3242.2.14 by Aaron Bentley
Update from review comments
476
        self.assertFalse(repo.is_shared())
477
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
478
    def test_determine_stacking_policy(self):
479
        parent_bzrdir = self.make_bzrdir('.')
480
        child_bzrdir = self.make_bzrdir('child')
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
481
        parent_bzrdir.get_config().set_default_stack_on('http://example.org')
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
482
        repo_policy = child_bzrdir.determine_repository_policy()
483
        self.assertEqual('http://example.org', repo_policy._stack_on)
484
3242.3.27 by Aaron Bentley
Interpret default stacking paths relative to config bzrdir
485
    def test_determine_stacking_policy_relative(self):
486
        parent_bzrdir = self.make_bzrdir('.')
487
        child_bzrdir = self.make_bzrdir('child')
488
        parent_bzrdir.get_config().set_default_stack_on('child2')
489
        repo_policy = child_bzrdir.determine_repository_policy()
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
490
        self.assertEqual('child2', repo_policy._stack_on)
491
        self.assertEqual(parent_bzrdir.root_transport.base,
492
                         repo_policy._stack_on_pwd)
3242.3.27 by Aaron Bentley
Interpret default stacking paths relative to config bzrdir
493
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
494
    def prepare_default_stacking(self, child_format='1.6'):
3242.3.5 by Aaron Bentley
Implement stacking for clone_on_transport
495
        parent_bzrdir = self.make_bzrdir('.')
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
496
        child_branch = self.make_branch('child', format=child_format)
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
497
        parent_bzrdir.get_config().set_default_stack_on(child_branch.base)
3242.3.5 by Aaron Bentley
Implement stacking for clone_on_transport
498
        new_child_transport = parent_bzrdir.transport.clone('child2')
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
499
        return child_branch, new_child_transport
500
501
    def test_clone_on_transport_obeys_stacking_policy(self):
502
        child_branch, new_child_transport = self.prepare_default_stacking()
3242.3.5 by Aaron Bentley
Implement stacking for clone_on_transport
503
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
3242.5.1 by Jonathan Lange
Allow stacked-on branch locations to be stored as relative URLs.
504
        self.assertEqual(child_branch.base,
3537.3.5 by Martin Pool
merge trunk including stacking policy
505
                         new_child.open_branch().get_stacked_on_url())
3242.3.5 by Aaron Bentley
Implement stacking for clone_on_transport
506
4126.1.1 by Andrew Bennetts
Fix bug when pushing stackable branch in unstackable repo to default-stacking target.
507
    def test_default_stacking_with_stackable_branch_unstackable_repo(self):
508
        # Make stackable source branch with an unstackable repo format.
509
        source_bzrdir = self.make_bzrdir('source')
5757.1.6 by Jelmer Vernooij
Fix another import.
510
        knitpack_repo.RepositoryFormatKnitPack1().initialize(source_bzrdir)
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
511
        source_branch = bzrlib.branch.BzrBranchFormat7().initialize(
512
            source_bzrdir)
4126.1.1 by Andrew Bennetts
Fix bug when pushing stackable branch in unstackable repo to default-stacking target.
513
        # Make a directory with a default stacking policy
514
        parent_bzrdir = self.make_bzrdir('parent')
515
        stacked_on = self.make_branch('parent/stacked-on', format='pack-0.92')
516
        parent_bzrdir.get_config().set_default_stack_on(stacked_on.base)
517
        # Clone source into directory
518
        target = source_bzrdir.clone(self.get_url('parent/target'))
519
6164.2.8 by Jelmer Vernooij
Move ex_stacked_on
520
    def test_format_initialize_on_transport_ex_stacked_on(self):
521
        # trunk is a stackable format.  Note that its in the same server area
522
        # which is what launchpad does, but not sufficient to exercise the
523
        # general case.
524
        trunk = self.make_branch('trunk', format='1.9')
525
        t = self.get_transport('stacked')
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
526
        old_fmt = controldir.format_registry.make_bzrdir('pack-0.92')
6164.2.8 by Jelmer Vernooij
Move ex_stacked_on
527
        repo_name = old_fmt.repository_format.network_name()
528
        # Should end up with a 1.9 format (stackable)
529
        repo, control, require_stacking, repo_policy = \
530
            old_fmt.initialize_on_transport_ex(t,
531
                    repo_format_name=repo_name, stacked_on='../trunk',
532
                    stack_on_pwd=t.base)
533
        if repo is not None:
534
            # Repositories are open write-locked
535
            self.assertTrue(repo.is_write_locked())
536
            self.addCleanup(repo.unlock)
537
        else:
538
            repo = control.open_repository()
539
        self.assertIsInstance(control, bzrdir.BzrDir)
540
        opened = bzrdir.BzrDir.open(t.base)
541
        if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
542
            self.assertEqual(control._format.network_name(),
543
                old_fmt.network_name())
544
            self.assertEqual(control._format.network_name(),
545
                opened._format.network_name())
546
        self.assertEqual(control.__class__, opened.__class__)
547
        self.assertLength(1, repo._fallback_repositories)
548
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
549
    def test_sprout_obeys_stacking_policy(self):
550
        child_branch, new_child_transport = self.prepare_default_stacking()
551
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
552
        self.assertEqual(child_branch.base,
3537.3.5 by Martin Pool
merge trunk including stacking policy
553
                         new_child.open_branch().get_stacked_on_url())
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
554
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
555
    def test_clone_ignores_policy_for_unsupported_formats(self):
556
        child_branch, new_child_transport = self.prepare_default_stacking(
557
            child_format='pack-0.92')
558
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
559
        self.assertRaises(errors.UnstackableBranchFormat,
560
                          new_child.open_branch().get_stacked_on_url)
561
562
    def test_sprout_ignores_policy_for_unsupported_formats(self):
563
        child_branch, new_child_transport = self.prepare_default_stacking(
564
            child_format='pack-0.92')
565
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
566
        self.assertRaises(errors.UnstackableBranchFormat,
567
                          new_child.open_branch().get_stacked_on_url)
568
569
    def test_sprout_upgrades_format_if_stacked_specified(self):
570
        child_branch, new_child_transport = self.prepare_default_stacking(
571
            child_format='pack-0.92')
572
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
573
                                               stacked=True)
574
        self.assertEqual(child_branch.bzrdir.root_transport.base,
575
                         new_child.open_branch().get_stacked_on_url())
3650.3.10 by Aaron Bentley
Ensure that sprout chooses a rich-root format as needed
576
        repo = new_child.open_repository()
577
        self.assertTrue(repo._format.supports_external_lookups)
578
        self.assertFalse(repo.supports_rich_root())
579
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
580
    def test_clone_on_transport_upgrades_format_if_stacked_on_specified(self):
581
        child_branch, new_child_transport = self.prepare_default_stacking(
582
            child_format='pack-0.92')
583
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport,
584
            stacked_on=child_branch.bzrdir.root_transport.base)
585
        self.assertEqual(child_branch.bzrdir.root_transport.base,
586
                         new_child.open_branch().get_stacked_on_url())
587
        repo = new_child.open_repository()
588
        self.assertTrue(repo._format.supports_external_lookups)
589
        self.assertFalse(repo.supports_rich_root())
590
3650.3.10 by Aaron Bentley
Ensure that sprout chooses a rich-root format as needed
591
    def test_sprout_upgrades_to_rich_root_format_if_needed(self):
592
        child_branch, new_child_transport = self.prepare_default_stacking(
593
            child_format='rich-root-pack')
3665.2.3 by John Arbash Meinel
Fix a test that was expected to fail.
594
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
595
                                               stacked=True)
3650.3.10 by Aaron Bentley
Ensure that sprout chooses a rich-root format as needed
596
        repo = new_child.open_repository()
597
        self.assertTrue(repo._format.supports_external_lookups)
598
        self.assertTrue(repo.supports_rich_root())
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
599
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
600
    def test_add_fallback_repo_handles_absolute_urls(self):
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
601
        stack_on = self.make_branch('stack_on', format='1.6')
602
        repo = self.make_repository('repo', format='1.6')
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
603
        policy = bzrdir.UseExistingRepository(repo, stack_on.base)
604
        policy._add_fallback(repo)
605
606
    def test_add_fallback_repo_handles_relative_urls(self):
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
607
        stack_on = self.make_branch('stack_on', format='1.6')
608
        repo = self.make_repository('repo', format='1.6')
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
609
        policy = bzrdir.UseExistingRepository(repo, '.', stack_on.base)
610
        policy._add_fallback(repo)
611
612
    def test_configure_relative_branch_stacking_url(self):
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
613
        stack_on = self.make_branch('stack_on', format='1.6')
614
        stacked = self.make_branch('stack_on/stacked', format='1.6')
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
615
        policy = bzrdir.UseExistingRepository(stacked.repository,
616
            '.', stack_on.base)
617
        policy.configure_branch(stacked)
3537.3.5 by Martin Pool
merge trunk including stacking policy
618
        self.assertEqual('..', stacked.get_stacked_on_url())
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
619
620
    def test_relative_branch_stacking_to_absolute(self):
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
621
        stack_on = self.make_branch('stack_on', format='1.6')
622
        stacked = self.make_branch('stack_on/stacked', format='1.6')
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
623
        policy = bzrdir.UseExistingRepository(stacked.repository,
624
            '.', self.get_readonly_url('stack_on'))
625
        policy.configure_branch(stacked)
626
        self.assertEqual(self.get_readonly_url('stack_on'),
3537.3.5 by Martin Pool
merge trunk including stacking policy
627
                         stacked.get_stacked_on_url())
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
628
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
629
1534.4.39 by Robert Collins
Basic BzrDir support.
630
class ChrootedTests(TestCaseWithTransport):
631
    """A support class that provides readonly urls outside the local namespace.
632
633
    This is done by checking if self.transport_server is a MemoryServer. if it
634
    is then we are chrooted already, if it is not then an HttpServer is used
635
    for readonly urls.
636
    """
637
638
    def setUp(self):
639
        super(ChrootedTests, self).setUp()
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
640
        if not self.vfs_transport_factory == memory.MemoryServer:
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
641
            self.transport_readonly_server = http_server.HttpServer
1534.4.39 by Robert Collins
Basic BzrDir support.
642
3015.3.45 by Daniel Watkins
Extract common method.
643
    def local_branch_path(self, branch):
644
         return os.path.realpath(urlutils.local_path_from_url(branch.base))
645
1534.4.39 by Robert Collins
Basic BzrDir support.
646
    def test_open_containing(self):
647
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
648
                          self.get_readonly_url(''))
649
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
650
                          self.get_readonly_url('g/p/q'))
651
        control = bzrdir.BzrDir.create(self.get_url())
652
        branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url(''))
653
        self.assertEqual('', relpath)
654
        branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
655
        self.assertEqual('g/p/q', relpath)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
656
3015.3.46 by Daniel Watkins
Made tests more granular.
657
    def test_open_containing_tree_branch_or_repository_empty(self):
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
658
        self.assertRaises(errors.NotBranchError,
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
659
            bzrdir.BzrDir.open_containing_tree_branch_or_repository,
660
            self.get_readonly_url(''))
661
3015.3.46 by Daniel Watkins
Made tests more granular.
662
    def test_open_containing_tree_branch_or_repository_all(self):
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
663
        self.make_branch_and_tree('topdir')
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
664
        tree, branch, repo, relpath = \
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
665
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
666
                'topdir/foo')
667
        self.assertEqual(os.path.realpath('topdir'),
668
                         os.path.realpath(tree.basedir))
669
        self.assertEqual(os.path.realpath('topdir'),
3015.3.45 by Daniel Watkins
Extract common method.
670
                         self.local_branch_path(branch))
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
671
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
672
            osutils.realpath(os.path.join('topdir', '.bzr', 'repository')),
673
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
674
        self.assertEqual(relpath, 'foo')
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
675
3015.3.46 by Daniel Watkins
Made tests more granular.
676
    def test_open_containing_tree_branch_or_repository_no_tree(self):
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
677
        self.make_branch('branch')
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
678
        tree, branch, repo, relpath = \
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
679
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
680
                'branch/foo')
681
        self.assertEqual(tree, None)
682
        self.assertEqual(os.path.realpath('branch'),
3015.3.45 by Daniel Watkins
Extract common method.
683
                         self.local_branch_path(branch))
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
684
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
685
            osutils.realpath(os.path.join('branch', '.bzr', 'repository')),
686
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
687
        self.assertEqual(relpath, 'foo')
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
688
3015.3.46 by Daniel Watkins
Made tests more granular.
689
    def test_open_containing_tree_branch_or_repository_repo(self):
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
690
        self.make_repository('repo')
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
691
        tree, branch, repo, relpath = \
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
692
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
693
                'repo')
694
        self.assertEqual(tree, None)
695
        self.assertEqual(branch, None)
696
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
697
            osutils.realpath(os.path.join('repo', '.bzr', 'repository')),
698
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
699
        self.assertEqual(relpath, '')
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
700
3015.3.46 by Daniel Watkins
Made tests more granular.
701
    def test_open_containing_tree_branch_or_repository_shared_repo(self):
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
702
        self.make_repository('shared', shared=True)
703
        bzrdir.BzrDir.create_branch_convenience('shared/branch',
704
                                                force_new_tree=False)
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
705
        tree, branch, repo, relpath = \
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
706
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
707
                'shared/branch')
708
        self.assertEqual(tree, None)
709
        self.assertEqual(os.path.realpath('shared/branch'),
3015.3.45 by Daniel Watkins
Extract common method.
710
                         self.local_branch_path(branch))
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
711
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
712
            osutils.realpath(os.path.join('shared', '.bzr', 'repository')),
713
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
714
        self.assertEqual(relpath, '')
3015.3.38 by Daniel Watkins
Added bzrlib.tests.test_bzrdir.test_open_containing_tree_branch_or_repository.
715
3015.3.48 by Daniel Watkins
Further granulated tests.
716
    def test_open_containing_tree_branch_or_repository_branch_subdir(self):
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
717
        self.make_branch_and_tree('foo')
3015.3.52 by Daniel Watkins
Replaced use of os functions with use of test suite functions.
718
        self.build_tree(['foo/bar/'])
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
719
        tree, branch, repo, relpath = \
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
720
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
721
                'foo/bar')
722
        self.assertEqual(os.path.realpath('foo'),
723
                         os.path.realpath(tree.basedir))
724
        self.assertEqual(os.path.realpath('foo'),
3015.3.45 by Daniel Watkins
Extract common method.
725
                         self.local_branch_path(branch))
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
726
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
727
            osutils.realpath(os.path.join('foo', '.bzr', 'repository')),
728
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
729
        self.assertEqual(relpath, 'bar')
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
730
3015.3.48 by Daniel Watkins
Further granulated tests.
731
    def test_open_containing_tree_branch_or_repository_repo_subdir(self):
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
732
        self.make_repository('bar')
3015.3.52 by Daniel Watkins
Replaced use of os functions with use of test suite functions.
733
        self.build_tree(['bar/baz/'])
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
734
        tree, branch, repo, relpath = \
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
735
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
736
                'bar/baz')
737
        self.assertEqual(tree, None)
738
        self.assertEqual(branch, None)
739
        self.assertEqual(
3616.2.12 by Mark Hammond
use osutils.realpath instead of os.path.realpath so we get fwd slashes.
740
            osutils.realpath(os.path.join('bar', '.bzr', 'repository')),
741
            repo.bzrdir.transport.local_abspath('repository'))
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
742
        self.assertEqual(relpath, 'baz')
3015.3.42 by Daniel Watkins
Added test to ensure that BzrDir.open_containing_tree_branch_or_repository will open containing versioned directories of unversioned subdirectories.
743
1534.6.11 by Robert Collins
Review feedback.
744
    def test_open_containing_from_transport(self):
5609.9.1 by Martin
Blindly change all users of get_transport to address the function via the transport module
745
        self.assertRaises(NotBranchError,
746
            bzrdir.BzrDir.open_containing_from_transport,
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
747
            _mod_transport.get_transport_from_url(self.get_readonly_url('')))
5609.9.1 by Martin
Blindly change all users of get_transport to address the function via the transport module
748
        self.assertRaises(NotBranchError,
749
            bzrdir.BzrDir.open_containing_from_transport,
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
750
            _mod_transport.get_transport_from_url(
751
                self.get_readonly_url('g/p/q')))
1534.6.3 by Robert Collins
find_repository sufficiently robust.
752
        control = bzrdir.BzrDir.create(self.get_url())
1534.6.11 by Robert Collins
Review feedback.
753
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
754
            _mod_transport.get_transport_from_url(
755
                self.get_readonly_url('')))
1534.6.3 by Robert Collins
find_repository sufficiently robust.
756
        self.assertEqual('', relpath)
1534.6.11 by Robert Collins
Review feedback.
757
        branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
758
            _mod_transport.get_transport_from_url(
759
                self.get_readonly_url('g/p/q')))
1534.6.3 by Robert Collins
find_repository sufficiently robust.
760
        self.assertEqual('g/p/q', relpath)
761
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
762
    def test_open_containing_tree_or_branch(self):
763
        self.make_branch_and_tree('topdir')
764
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
765
            'topdir/foo')
2215.3.7 by Aaron Bentley
Remove (new) trailing whitespace
766
        self.assertEqual(os.path.realpath('topdir'),
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
767
                         os.path.realpath(tree.basedir))
2215.3.7 by Aaron Bentley
Remove (new) trailing whitespace
768
        self.assertEqual(os.path.realpath('topdir'),
3015.3.45 by Daniel Watkins
Extract common method.
769
                         self.local_branch_path(branch))
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
770
        self.assertIs(tree.bzrdir, branch.bzrdir)
771
        self.assertEqual('foo', relpath)
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
772
        # opening from non-local should not return the tree
773
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
774
            self.get_readonly_url('topdir/foo'))
775
        self.assertEqual(None, tree)
776
        self.assertEqual('foo', relpath)
777
        # without a tree:
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
778
        self.make_branch('topdir/foo')
779
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
780
            'topdir/foo')
781
        self.assertIs(tree, None)
2215.3.7 by Aaron Bentley
Remove (new) trailing whitespace
782
        self.assertEqual(os.path.realpath('topdir/foo'),
3015.3.45 by Daniel Watkins
Extract common method.
783
                         self.local_branch_path(branch))
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
784
        self.assertEqual('', relpath)
785
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
786
    def test_open_tree_or_branch(self):
787
        self.make_branch_and_tree('topdir')
788
        tree, branch = bzrdir.BzrDir.open_tree_or_branch('topdir')
789
        self.assertEqual(os.path.realpath('topdir'),
790
                         os.path.realpath(tree.basedir))
791
        self.assertEqual(os.path.realpath('topdir'),
3015.3.45 by Daniel Watkins
Extract common method.
792
                         self.local_branch_path(branch))
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
793
        self.assertIs(tree.bzrdir, branch.bzrdir)
794
        # opening from non-local should not return the tree
3123.5.15 by Aaron Bentley
Fix open_tree_or_branch tests
795
        tree, branch = bzrdir.BzrDir.open_tree_or_branch(
796
            self.get_readonly_url('topdir'))
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
797
        self.assertEqual(None, tree)
798
        # without a tree:
799
        self.make_branch('topdir/foo')
3123.5.15 by Aaron Bentley
Fix open_tree_or_branch tests
800
        tree, branch = bzrdir.BzrDir.open_tree_or_branch('topdir/foo')
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
801
        self.assertIs(tree, None)
802
        self.assertEqual(os.path.realpath('topdir/foo'),
3015.3.45 by Daniel Watkins
Extract common method.
803
                         self.local_branch_path(branch))
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
804
1910.11.5 by Andrew Bennetts
Add tests for BzrDir.open_from_transport.
805
    def test_open_from_transport(self):
806
        # transport pointing at bzrdir should give a bzrdir with root transport
807
        # set to the given transport
808
        control = bzrdir.BzrDir.create(self.get_url())
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
809
        t = self.get_transport()
810
        opened_bzrdir = bzrdir.BzrDir.open_from_transport(t)
811
        self.assertEqual(t.base, opened_bzrdir.root_transport.base)
1910.11.5 by Andrew Bennetts
Add tests for BzrDir.open_from_transport.
812
        self.assertIsInstance(opened_bzrdir, bzrdir.BzrDir)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
813
1910.11.5 by Andrew Bennetts
Add tests for BzrDir.open_from_transport.
814
    def test_open_from_transport_no_bzrdir(self):
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
815
        t = self.get_transport()
816
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
1910.11.5 by Andrew Bennetts
Add tests for BzrDir.open_from_transport.
817
818
    def test_open_from_transport_bzrdir_in_parent(self):
819
        control = bzrdir.BzrDir.create(self.get_url())
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
820
        t = self.get_transport()
821
        t.mkdir('subdir')
822
        t = t.clone('subdir')
823
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_from_transport, t)
1910.11.5 by Andrew Bennetts
Add tests for BzrDir.open_from_transport.
824
2100.3.28 by Aaron Bentley
Make sprout recursive
825
    def test_sprout_recursive(self):
4100.2.4 by Aaron Bentley
More support for not autodetecting tree refs
826
        tree = self.make_branch_and_tree('tree1',
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
827
                                         format='development-subtree')
2100.3.28 by Aaron Bentley
Make sprout recursive
828
        sub_tree = self.make_branch_and_tree('tree1/subtree',
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
829
            format='development-subtree')
4100.2.4 by Aaron Bentley
More support for not autodetecting tree refs
830
        sub_tree.set_root_id('subtree-root')
2100.3.28 by Aaron Bentley
Make sprout recursive
831
        tree.add_reference(sub_tree)
832
        self.build_tree(['tree1/subtree/file'])
833
        sub_tree.add('file')
834
        tree.commit('Initial commit')
4100.2.4 by Aaron Bentley
More support for not autodetecting tree refs
835
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
836
        tree2.lock_read()
837
        self.addCleanup(tree2.unlock)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
838
        self.assertPathExists('tree2/subtree/file')
4100.2.4 by Aaron Bentley
More support for not autodetecting tree refs
839
        self.assertEqual('tree-reference', tree2.kind('subtree-root'))
2100.3.28 by Aaron Bentley
Make sprout recursive
840
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
841
    def test_cloning_metadir(self):
842
        """Ensure that cloning metadir is suitable"""
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
843
        bzrdir = self.make_bzrdir('bzrdir')
844
        bzrdir.cloning_metadir()
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
845
        branch = self.make_branch('branch', format='knit')
846
        format = branch.bzrdir.cloning_metadir()
847
        self.assertIsInstance(format.workingtree_format,
5816.5.6 by Jelmer Vernooij
Fix default working tree format.
848
            workingtree_4.WorkingTreeFormat6)
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
849
850
    def test_sprout_recursive_treeless(self):
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
851
        tree = self.make_branch_and_tree('tree1',
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
852
            format='development-subtree')
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
853
        sub_tree = self.make_branch_and_tree('tree1/subtree',
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
854
            format='development-subtree')
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
855
        tree.add_reference(sub_tree)
856
        self.build_tree(['tree1/subtree/file'])
857
        sub_tree.add('file')
858
        tree.commit('Initial commit')
5409.1.20 by Vincent Ladeuil
Revert to 'conflict' being the default orphaning policy and fix fallouts.
859
        # The following line force the orhaning to reveal bug #634470
6449.3.2 by Jelmer Vernooij
Use config stack in tests, too.
860
        tree.branch.get_config_stack().set(
5409.1.24 by Vincent Ladeuil
Rename bzrlib.transform.orphan_policy to bzr.transform.orphan_policy.
861
            'bzr.transform.orphan_policy', 'move')
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
862
        tree.bzrdir.destroy_workingtree()
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
863
        # FIXME: subtree/.bzr is left here which allows the test to pass (or
864
        # fail :-( ) -- vila 20100909
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
865
        repo = self.make_repository('repo', shared=True,
6437.14.2 by Jelmer Vernooij
Run subtree tests with development-subtree rather than deprecated dirstate-with-subtree.
866
            format='development-subtree')
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
867
        repo.set_make_working_trees(False)
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
868
        # FIXME: we just deleted the workingtree and now we want to use it ????
869
        # At a minimum, we should use tree.branch below (but this fails too
870
        # currently) or stop calling this test 'treeless'. Specifically, I've
871
        # turn the line below into an assertRaises when 'subtree/.bzr' is
872
        # orphaned and sprout tries to access the branch there (which is left
873
        # by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
5409.7.2 by Vincent Ladeuil
Add NEWS entry, a missing test and some cleanup.
874
        # [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
875
        # #634470.  -- vila 20100909
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
876
        self.assertRaises(errors.NotBranchError,
877
                          tree.bzrdir.sprout, 'repo/tree2')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
878
#        self.assertPathExists('repo/tree2/subtree')
879
#        self.assertPathDoesNotExist('repo/tree2/subtree/file')
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
880
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
881
    def make_foo_bar_baz(self):
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
882
        foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
883
        bar = self.make_branch('foo/bar').bzrdir
884
        baz = self.make_branch('baz').bzrdir
885
        return foo, bar, baz
886
887
    def test_find_bzrdirs(self):
888
        foo, bar, baz = self.make_foo_bar_baz()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
889
        t = self.get_transport()
890
        self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
891
5215.3.4 by Marius Kruger
extract make_fake_permission_denied_transport and standardise the assert urls a little
892
    def make_fake_permission_denied_transport(self, transport, paths):
5215.3.9 by Marius Kruger
* Tried to improve code docs and NEWS as per review
893
        """Create a transport that raises PermissionDenied for some paths."""
5215.3.2 by Marius Kruger
* Move TestCaseWithMemoryTransport.make_smart_server => TestCaseWithTransport
894
        def filter(path):
5215.3.4 by Marius Kruger
extract make_fake_permission_denied_transport and standardise the assert urls a little
895
            if path in paths:
5215.3.2 by Marius Kruger
* Move TestCaseWithMemoryTransport.make_smart_server => TestCaseWithTransport
896
                raise errors.PermissionDenied(path)
897
            return path
898
        path_filter_server = pathfilter.PathFilteringServer(transport, filter)
899
        path_filter_server.start_server()
5215.3.9 by Marius Kruger
* Tried to improve code docs and NEWS as per review
900
        self.addCleanup(path_filter_server.stop_server)
5215.3.2 by Marius Kruger
* Move TestCaseWithMemoryTransport.make_smart_server => TestCaseWithTransport
901
        path_filter_transport = pathfilter.PathFilteringTransport(
902
            path_filter_server, '.')
5215.3.4 by Marius Kruger
extract make_fake_permission_denied_transport and standardise the assert urls a little
903
        return (path_filter_server, path_filter_transport)
904
5215.3.10 by Robert Collins
Merge trunk, adjusting NEWS and fixing up the permission denied test to be clearer and more focused.
905
    def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
906
        """Check that each branch url ends with the given suffix."""
907
        for actual_bzrdir in actual_bzrdirs:
5215.3.5 by Marius Kruger
factor out _assert_branch_urls
908
            self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
5215.3.4 by Marius Kruger
extract make_fake_permission_denied_transport and standardise the assert urls a little
909
910
    def test_find_bzrdirs_permission_denied(self):
911
        foo, bar, baz = self.make_foo_bar_baz()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
912
        t = self.get_transport()
5215.3.10 by Robert Collins
Merge trunk, adjusting NEWS and fixing up the permission denied test to be clearer and more focused.
913
        path_filter_server, path_filter_transport = \
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
914
            self.make_fake_permission_denied_transport(t, ['foo'])
5215.3.5 by Marius Kruger
factor out _assert_branch_urls
915
        # local transport
5215.3.10 by Robert Collins
Merge trunk, adjusting NEWS and fixing up the permission denied test to be clearer and more focused.
916
        self.assertBranchUrlsEndWith('/baz/',
5215.3.9 by Marius Kruger
* Tried to improve code docs and NEWS as per review
917
            bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
5215.3.2 by Marius Kruger
* Move TestCaseWithMemoryTransport.make_smart_server => TestCaseWithTransport
918
        # smart server
919
        smart_transport = self.make_smart_server('.',
920
            backing_server=path_filter_server)
5215.3.10 by Robert Collins
Merge trunk, adjusting NEWS and fixing up the permission denied test to be clearer and more focused.
921
        self.assertBranchUrlsEndWith('/baz/',
5215.3.9 by Marius Kruger
* Tried to improve code docs and NEWS as per review
922
            bzrdir.BzrDir.find_bzrdirs(smart_transport))
5215.4.1 by Marius Kruger
BzrDir.find_branches should not fall over when encountering branches with missing repos
923
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
924
    def test_find_bzrdirs_list_current(self):
925
        def list_current(transport):
926
            return [s for s in transport.list_dir('') if s != 'baz']
927
928
        foo, bar, baz = self.make_foo_bar_baz()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
929
        t = self.get_transport()
930
        self.assertEqualBzrdirs(
931
            [foo, bar],
932
            bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
933
934
    def test_find_bzrdirs_evaluate(self):
935
        def evaluate(bzrdir):
936
            try:
937
                repo = bzrdir.open_repository()
6083.1.1 by Jelmer Vernooij
Use get_transport_from_{url,path} in more places.
938
            except errors.NoRepositoryPresent:
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
939
                return True, bzrdir.root_transport.base
940
            else:
941
                return False, bzrdir.root_transport.base
942
943
        foo, bar, baz = self.make_foo_bar_baz()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
944
        t = self.get_transport()
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
945
        self.assertEqual([baz.root_transport.base, foo.root_transport.base],
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
946
                         list(bzrdir.BzrDir.find_bzrdirs(t, evaluate=evaluate)))
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
947
948
    def assertEqualBzrdirs(self, first, second):
949
        first = list(first)
950
        second = list(second)
951
        self.assertEqual(len(first), len(second))
952
        for x, y in zip(first, second):
953
            self.assertEqual(x.root_transport.base, y.root_transport.base)
954
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
955
    def test_find_branches(self):
956
        root = self.make_repository('', shared=True)
957
        foo, bar, baz = self.make_foo_bar_baz()
958
        qux = self.make_bzrdir('foo/qux')
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
959
        t = self.get_transport()
960
        branches = bzrdir.BzrDir.find_branches(t)
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
961
        self.assertEqual(baz.root_transport.base, branches[0].base)
962
        self.assertEqual(foo.root_transport.base, branches[1].base)
963
        self.assertEqual(bar.root_transport.base, branches[2].base)
964
965
        # ensure this works without a top-level repo
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
966
        branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
967
        self.assertEqual(foo.root_transport.base, branches[0].base)
968
        self.assertEqual(bar.root_transport.base, branches[1].base)
969
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
970
5215.4.4 by Robert Collins
Merge prerequisite branch and tweak test to be more compact and faster.
971
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
972
973
    def test_find_bzrdirs_missing_repo(self):
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
974
        t = self.get_transport()
5215.4.4 by Robert Collins
Merge prerequisite branch and tweak test to be more compact and faster.
975
        arepo = self.make_repository('arepo', shared=True)
976
        abranch_url = arepo.user_url + '/abranch'
977
        abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
978
        t.delete_tree('arepo/.bzr')
5215.4.4 by Robert Collins
Merge prerequisite branch and tweak test to be more compact and faster.
979
        self.assertRaises(errors.NoRepositoryPresent,
980
            branch.Branch.open, abranch_url)
981
        self.make_branch('baz')
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
982
        for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
5215.4.4 by Robert Collins
Merge prerequisite branch and tweak test to be more compact and faster.
983
            self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
984
985
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
986
class TestMeta1DirFormat(TestCaseWithTransport):
987
    """Tests specific to the meta1 dir format."""
988
989
    def test_right_base_dirs(self):
990
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
991
        t = dir.transport
992
        branch_base = t.clone('branch').base
993
        self.assertEqual(branch_base, dir.get_branch_transport(None).base)
994
        self.assertEqual(branch_base,
6517.1.6 by Jelmer Vernooij
Fix remaining tests.
995
                         dir.get_branch_transport(BzrBranchFormat5()).base)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
996
        repository_base = t.clone('repository').base
997
        self.assertEqual(repository_base, dir.get_repository_transport(None).base)
5669.1.2 by Jelmer Vernooij
Review comments from Vincent.
998
        repository_format = repository.format_registry.get_default()
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
999
        self.assertEqual(repository_base,
5669.1.1 by Jelmer Vernooij
Remove some dependencies on weave formats from bt.test_bzrdir.
1000
                         dir.get_repository_transport(repository_format).base)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1001
        checkout_base = t.clone('checkout').base
1002
        self.assertEqual(checkout_base, dir.get_workingtree_transport(None).base)
1003
        self.assertEqual(checkout_base,
5816.5.4 by Jelmer Vernooij
Merge bzr.dev.
1004
                         dir.get_workingtree_transport(workingtree_3.WorkingTreeFormat3()).base)
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
1005
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1006
    def test_meta1dir_uses_lockdir(self):
1007
        """Meta1 format uses a LockDir to guard the whole directory, not a file."""
1008
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
1009
        t = dir.transport
1010
        self.assertIsDirectory('branch-lock', t)
1011
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1012
    def test_comparison(self):
1013
        """Equality and inequality behave properly.
1014
1015
        Metadirs should compare equal iff they have the same repo, branch and
1016
        tree formats.
1017
        """
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1018
        mydir = controldir.format_registry.make_bzrdir('knit')
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1019
        self.assertEqual(mydir, mydir)
1020
        self.assertFalse(mydir != mydir)
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1021
        otherdir = controldir.format_registry.make_bzrdir('knit')
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1022
        self.assertEqual(otherdir, mydir)
1023
        self.assertFalse(otherdir != mydir)
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1024
        otherdir2 = controldir.format_registry.make_bzrdir('development-subtree')
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1025
        self.assertNotEqual(otherdir2, mydir)
1026
        self.assertFalse(otherdir2 == mydir)
1027
6213.1.8 by Jelmer Vernooij
Support loading directories with featurs.
1028
    def test_with_features(self):
1029
        tree = self.make_branch_and_tree('tree', format='2a')
6213.1.56 by Jelmer Vernooij
Add BzrDir.update_feature_flags.
1030
        tree.bzrdir.update_feature_flags({"bar": "required"})
6213.1.29 by Jelmer Vernooij
Update docs, fix tests.
1031
        self.assertRaises(errors.MissingFeature, bzrdir.BzrDir.open, 'tree')
1032
        bzrdir.BzrDirMetaFormat1.register_feature('bar')
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1033
        self.addCleanup(bzrdir.BzrDirMetaFormat1.unregister_feature, 'bar')
6213.1.8 by Jelmer Vernooij
Support loading directories with featurs.
1034
        dir = bzrdir.BzrDir.open('tree')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1035
        self.assertEqual("required", dir._format.features.get("bar"))
6213.1.56 by Jelmer Vernooij
Add BzrDir.update_feature_flags.
1036
        tree.bzrdir.update_feature_flags({"bar": None, "nonexistant": None})
1037
        dir = bzrdir.BzrDir.open('tree')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1038
        self.assertEqual({}, dir._format.features)
6213.1.8 by Jelmer Vernooij
Support loading directories with featurs.
1039
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1040
    def test_needs_conversion_different_working_tree(self):
1041
        # meta1dirs need an conversion if any element is not the default.
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1042
        new_format = controldir.format_registry.make_bzrdir('dirstate')
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1043
        tree = self.make_branch_and_tree('tree', format='knit')
1044
        self.assertTrue(tree.bzrdir.needs_format_conversion(
1045
            new_format))
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1046
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
1047
    def test_initialize_on_format_uses_smart_transport(self):
1048
        self.setup_smart_server_with_call_log()
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1049
        new_format = controldir.format_registry.make_bzrdir('dirstate')
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
1050
        transport = self.get_transport('target')
1051
        transport.ensure_base()
1052
        self.reset_smart_call_log()
1053
        instance = new_format.initialize_on_transport(transport)
1054
        self.assertIsInstance(instance, remote.RemoteBzrDir)
1055
        rpc_count = len(self.hpss_calls)
1056
        # This figure represent the amount of work to perform this use case. It
1057
        # is entirely ok to reduce this number if a test fails due to rpc_count
1058
        # being too low. If rpc_count increases, more network roundtrips have
1059
        # become necessary for this use case. Please do not adjust this number
1060
        # upwards without agreement from bzr's network support maintainers.
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1061
        self.assertEqual(2, rpc_count)
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
1062
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1063
1563.1.6 by Robert Collins
Add tests for sftp push, and NonLocalTets for BzrDir.create_branch_convenience, before fixing the failure of it to work on non-local urls.
1064
class NonLocalTests(TestCaseWithTransport):
1065
    """Tests for bzrdir static behaviour on non local paths."""
1066
1067
    def setUp(self):
1068
        super(NonLocalTests, self).setUp()
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
1069
        self.vfs_transport_factory = memory.MemoryServer
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1070
1563.1.6 by Robert Collins
Add tests for sftp push, and NonLocalTets for BzrDir.create_branch_convenience, before fixing the failure of it to work on non-local urls.
1071
    def test_create_branch_convenience(self):
1072
        # outside a repo the default convenience output is a repo+branch_tree
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1073
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1074
        branch = bzrdir.BzrDir.create_branch_convenience(
1075
            self.get_url('foo'), format=format)
1076
        self.assertRaises(errors.NoWorkingTree,
1077
                          branch.bzrdir.open_workingtree)
1078
        branch.bzrdir.open_repository()
1563.1.6 by Robert Collins
Add tests for sftp push, and NonLocalTets for BzrDir.create_branch_convenience, before fixing the failure of it to work on non-local urls.
1079
1080
    def test_create_branch_convenience_force_tree_not_local_fails(self):
1081
        # outside a repo the default convenience output is a repo+branch_tree
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1082
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1083
        self.assertRaises(errors.NotLocalUrl,
1084
            bzrdir.BzrDir.create_branch_convenience,
1085
            self.get_url('foo'),
1086
            force_new_tree=True,
1087
            format=format)
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
1088
        t = self.get_transport()
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1089
        self.assertFalse(t.has('foo'))
1563.1.6 by Robert Collins
Add tests for sftp push, and NonLocalTets for BzrDir.create_branch_convenience, before fixing the failure of it to work on non-local urls.
1090
1563.2.38 by Robert Collins
make push preserve tree formats.
1091
    def test_clone(self):
1092
        # clone into a nonlocal path works
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
1093
        format = controldir.format_registry.make_bzrdir('knit')
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1094
        branch = bzrdir.BzrDir.create_branch_convenience('local',
1095
                                                         format=format)
1563.2.38 by Robert Collins
make push preserve tree formats.
1096
        branch.bzrdir.open_workingtree()
1097
        result = branch.bzrdir.clone(self.get_url('remote'))
1098
        self.assertRaises(errors.NoWorkingTree,
1099
                          result.open_workingtree)
1100
        result.open_branch()
1101
        result.open_repository()
1102
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
1103
    def test_checkout_metadir(self):
1104
        # checkout_metadir has reasonable working tree format even when no
1105
        # working tree is present
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
1106
        self.make_branch('branch-knit2', format='dirstate-with-subtree')
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
1107
        my_bzrdir = bzrdir.BzrDir.open(self.get_url('branch-knit2'))
1108
        checkout_format = my_bzrdir.checkout_metadir()
1109
        self.assertIsInstance(checkout_format.workingtree_format,
5816.5.7 by Jelmer Vernooij
Fix more imports.
1110
                              workingtree_4.WorkingTreeFormat4)
2100.3.22 by Aaron Bentley
merge from bzr.dev
1111
2215.3.5 by Aaron Bentley
Add support for remote ls
1112
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1113
class TestHTTPRedirections(object):
1114
    """Test redirection between two http servers.
2164.2.16 by Vincent Ladeuil
Add tests.
1115
1116
    This MUST be used by daughter classes that also inherit from
1117
    TestCaseWithTwoWebservers.
1118
1119
    We can't inherit directly from TestCaseWithTwoWebservers or the
1120
    test framework will try to create an instance which cannot
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1121
    run, its implementation being incomplete.
2164.2.16 by Vincent Ladeuil
Add tests.
1122
    """
1123
1124
    def create_transport_readonly_server(self):
5273.1.4 by Vincent Ladeuil
The default http protocol version wasn't properly defined and as such not respected by some parametrized tests.
1125
        # We don't set the http protocol version, relying on the default
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1126
        return http_utils.HTTPServerRedirecting()
2164.2.16 by Vincent Ladeuil
Add tests.
1127
1128
    def create_transport_secondary_server(self):
5273.1.4 by Vincent Ladeuil
The default http protocol version wasn't properly defined and as such not respected by some parametrized tests.
1129
        # We don't set the http protocol version, relying on the default
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1130
        return http_utils.HTTPServerRedirecting()
2164.2.16 by Vincent Ladeuil
Add tests.
1131
1132
    def setUp(self):
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1133
        super(TestHTTPRedirections, self).setUp()
2164.2.16 by Vincent Ladeuil
Add tests.
1134
        # The redirections will point to the new server
1135
        self.new_server = self.get_readonly_server()
1136
        # The requests to the old server will be redirected
1137
        self.old_server = self.get_secondary_server()
1138
        # Configure the redirections
1139
        self.old_server.redirect_to(self.new_server.host, self.new_server.port)
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1140
1141
    def test_loop(self):
1142
        # Both servers redirect to each other creating a loop
2164.2.16 by Vincent Ladeuil
Add tests.
1143
        self.new_server.redirect_to(self.old_server.host, self.old_server.port)
1144
        # Starting from either server should loop
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1145
        old_url = self._qualified_url(self.old_server.host,
2164.2.16 by Vincent Ladeuil
Add tests.
1146
                                      self.old_server.port)
1147
        oldt = self._transport(old_url)
1148
        self.assertRaises(errors.NotBranchError,
1149
                          bzrdir.BzrDir.open_from_transport, oldt)
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1150
        new_url = self._qualified_url(self.new_server.host,
2164.2.16 by Vincent Ladeuil
Add tests.
1151
                                      self.new_server.port)
1152
        newt = self._transport(new_url)
1153
        self.assertRaises(errors.NotBranchError,
1154
                          bzrdir.BzrDir.open_from_transport, newt)
1155
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1156
    def test_qualifier_preserved(self):
1157
        wt = self.make_branch_and_tree('branch')
1158
        old_url = self._qualified_url(self.old_server.host,
1159
                                      self.old_server.port)
1160
        start = self._transport(old_url).clone('branch')
1161
        bdir = bzrdir.BzrDir.open_from_transport(start)
1162
        # Redirection should preserve the qualifier, hence the transport class
1163
        # itself.
1164
        self.assertIsInstance(bdir.root_transport, type(start))
1165
1166
1167
class TestHTTPRedirections_urllib(TestHTTPRedirections,
1168
                                  http_utils.TestCaseWithTwoWebservers):
2164.2.16 by Vincent Ladeuil
Add tests.
1169
    """Tests redirections for urllib implementation"""
1170
1171
    _transport = HttpTransport_urllib
1172
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1173
    def _qualified_url(self, host, port):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1174
        result = 'http+urllib://%s:%s' % (host, port)
1175
        self.permit_url(result)
1176
        return result
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1177
2164.2.16 by Vincent Ladeuil
Add tests.
1178
1179
1180
class TestHTTPRedirections_pycurl(TestWithTransport_pycurl,
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1181
                                  TestHTTPRedirections,
1182
                                  http_utils.TestCaseWithTwoWebservers):
2164.2.16 by Vincent Ladeuil
Add tests.
1183
    """Tests redirections for pycurl implementation"""
1184
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1185
    def _qualified_url(self, host, port):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1186
        result = 'http+pycurl://%s:%s' % (host, port)
1187
        self.permit_url(result)
1188
        return result
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1189
1190
1191
class TestHTTPRedirections_nosmart(TestHTTPRedirections,
1192
                                  http_utils.TestCaseWithTwoWebservers):
1193
    """Tests redirections for the nosmart decorator"""
1194
1195
    _transport = NoSmartTransportDecorator
1196
1197
    def _qualified_url(self, host, port):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1198
        result = 'nosmart+http://%s:%s' % (host, port)
1199
        self.permit_url(result)
1200
        return result
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
1201
1202
1203
class TestHTTPRedirections_readonly(TestHTTPRedirections,
1204
                                    http_utils.TestCaseWithTwoWebservers):
1205
    """Tests redirections for readonly decoratror"""
1206
1207
    _transport = ReadonlyTransportDecorator
1208
1209
    def _qualified_url(self, host, port):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1210
        result = 'readonly+http://%s:%s' % (host, port)
1211
        self.permit_url(result)
1212
        return result
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1213
1214
1215
class TestDotBzrHidden(TestCaseWithTransport):
1216
3023.1.3 by Alexander Belchenko
John's review
1217
    ls = ['ls']
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1218
    if sys.platform == 'win32':
3023.1.3 by Alexander Belchenko
John's review
1219
        ls = [os.environ['COMSPEC'], '/C', 'dir', '/B']
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1220
1221
    def get_ls(self):
3023.1.3 by Alexander Belchenko
John's review
1222
        f = subprocess.Popen(self.ls, stdout=subprocess.PIPE,
1223
            stderr=subprocess.PIPE)
1224
        out, err = f.communicate()
1225
        self.assertEqual(0, f.returncode, 'Calling %s failed: %s'
1226
                         % (self.ls, err))
1227
        return out.splitlines()
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1228
1229
    def test_dot_bzr_hidden(self):
3023.1.2 by Alexander Belchenko
Martin's review.
1230
        if sys.platform == 'win32' and not win32utils.has_win32file:
1231
            raise TestSkipped('unable to make file hidden without pywin32 library')
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1232
        b = bzrdir.BzrDir.create('.')
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
1233
        self.build_tree(['a'])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1234
        self.assertEqual(['a'], self.get_ls())
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1235
1236
    def test_dot_bzr_hidden_with_url(self):
3023.1.2 by Alexander Belchenko
Martin's review.
1237
        if sys.platform == 'win32' and not win32utils.has_win32file:
1238
            raise TestSkipped('unable to make file hidden without pywin32 library')
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
1239
        b = bzrdir.BzrDir.create(urlutils.local_path_to_url('.'))
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
1240
        self.build_tree(['a'])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1241
        self.assertEqual(['a'], self.get_ls())
3583.1.2 by Andrew Bennetts
Add test for fix.
1242
1243
1244
class _TestBzrDirFormat(bzrdir.BzrDirMetaFormat1):
1245
    """Test BzrDirFormat implementation for TestBzrDirSprout."""
1246
1247
    def _open(self, transport):
1248
        return _TestBzrDir(transport, self)
1249
1250
1251
class _TestBzrDir(bzrdir.BzrDirMeta1):
1252
    """Test BzrDir implementation for TestBzrDirSprout.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1253
3583.1.2 by Andrew Bennetts
Add test for fix.
1254
    When created a _TestBzrDir already has repository and a branch.  The branch
1255
    is a test double as well.
1256
    """
1257
1258
    def __init__(self, *args, **kwargs):
1259
        super(_TestBzrDir, self).__init__(*args, **kwargs)
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
1260
        self.test_branch = _TestBranch(self.transport)
3583.1.2 by Andrew Bennetts
Add test for fix.
1261
        self.test_branch.repository = self.create_repository()
1262
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
1263
    def open_branch(self, unsupported=False, possible_transports=None):
3583.1.2 by Andrew Bennetts
Add test for fix.
1264
        return self.test_branch
1265
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1266
    def cloning_metadir(self, require_stacking=False):
3583.1.2 by Andrew Bennetts
Add test for fix.
1267
        return _TestBzrDirFormat()
1268
1269
4086.1.3 by Andrew Bennetts
Fix bzrlib.tests.test_bzrdir.
1270
class _TestBranchFormat(bzrlib.branch.BranchFormat):
1271
    """Test Branch format for TestBzrDirSprout."""
1272
1273
3583.1.2 by Andrew Bennetts
Add test for fix.
1274
class _TestBranch(bzrlib.branch.Branch):
1275
    """Test Branch implementation for TestBzrDirSprout."""
1276
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
1277
    def __init__(self, transport, *args, **kwargs):
4086.1.3 by Andrew Bennetts
Fix bzrlib.tests.test_bzrdir.
1278
        self._format = _TestBranchFormat()
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
1279
        self._transport = transport
1280
        self.base = transport.base
3583.1.2 by Andrew Bennetts
Add test for fix.
1281
        super(_TestBranch, self).__init__(*args, **kwargs)
1282
        self.calls = []
3650.3.7 by Aaron Bentley
Fix test
1283
        self._parent = None
1284
3583.1.2 by Andrew Bennetts
Add test for fix.
1285
    def sprout(self, *args, **kwargs):
1286
        self.calls.append('sprout')
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
1287
        return _TestBranch(self._transport)
3583.1.2 by Andrew Bennetts
Add test for fix.
1288
3650.3.4 by Aaron Bentley
Update test to permit calling copy_content_into
1289
    def copy_content_into(self, destination, revision_id=None):
1290
        self.calls.append('copy_content_into')
1291
5535.4.15 by Andrew Bennetts
Fix a test failure.
1292
    def last_revision(self):
1293
        return _mod_revision.NULL_REVISION
1294
3650.3.7 by Aaron Bentley
Fix test
1295
    def get_parent(self):
1296
        return self._parent
1297
6015.15.7 by John Arbash Meinel
Fix the 11 tests that still failed.
1298
    def _get_config(self):
1299
        return config.TransportConfig(self._transport, 'branch.conf')
1300
6404.1.2 by Vincent Ladeuil
Fix failing test
1301
    def _get_config_store(self):
1302
        return config.BranchStore(self)
1303
3650.3.7 by Aaron Bentley
Fix test
1304
    def set_parent(self, parent):
1305
        self._parent = parent
1306
5535.3.9 by Andrew Bennetts
Fix test failures.
1307
    def lock_read(self):
1308
        return lock.LogicalLockResult(self.unlock)
1309
1310
    def unlock(self):
1311
        return
1312
3583.1.2 by Andrew Bennetts
Add test for fix.
1313
1314
class TestBzrDirSprout(TestCaseWithMemoryTransport):
1315
1316
    def test_sprout_uses_branch_sprout(self):
1317
        """BzrDir.sprout calls Branch.sprout.
1318
1319
        Usually, BzrDir.sprout should delegate to the branch's sprout method
1320
        for part of the work.  This allows the source branch to control the
1321
        choice of format for the new branch.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1322
3583.1.2 by Andrew Bennetts
Add test for fix.
1323
        There are exceptions, but this tests avoids them:
1324
          - if there's no branch in the source bzrdir,
1325
          - or if the stacking has been requested and the format needs to be
1326
            overridden to satisfy that.
1327
        """
1328
        # Make an instrumented bzrdir.
1329
        t = self.get_transport('source')
1330
        t.ensure_base()
1331
        source_bzrdir = _TestBzrDirFormat().initialize_on_transport(t)
1332
        # The instrumented bzrdir has a test_branch attribute that logs calls
1333
        # made to the branch contained in that bzrdir.  Initially the test
1334
        # branch exists but no calls have been made to it.
1335
        self.assertEqual([], source_bzrdir.test_branch.calls)
1336
1337
        # Sprout the bzrdir
1338
        target_url = self.get_url('target')
1339
        result = source_bzrdir.sprout(target_url, recurse='no')
1340
1341
        # The bzrdir called the branch's sprout method.
3650.3.4 by Aaron Bentley
Update test to permit calling copy_content_into
1342
        self.assertSubset(['sprout'], source_bzrdir.test_branch.calls)
3650.3.5 by Aaron Bentley
Fix parent location when copying content
1343
1344
    def test_sprout_parent(self):
1345
        grandparent_tree = self.make_branch('grandparent')
1346
        parent = grandparent_tree.bzrdir.sprout('parent').open_branch()
1347
        branch_tree = parent.bzrdir.sprout('branch').open_branch()
1348
        self.assertContainsRe(branch_tree.get_parent(), '/parent/$')
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
1349
1350
1351
class TestBzrDirHooks(TestCaseWithMemoryTransport):
1352
1353
    def test_pre_open_called(self):
1354
        calls = []
1355
        bzrdir.BzrDir.hooks.install_named_hook('pre_open', calls.append, None)
1356
        transport = self.get_transport('foo')
1357
        url = transport.base
1358
        self.assertRaises(errors.NotBranchError, bzrdir.BzrDir.open, url)
1359
        self.assertEqual([transport.base], [t.base for t in calls])
1360
1361
    def test_pre_open_actual_exceptions_raised(self):
1362
        count = [0]
1363
        def fail_once(transport):
1364
            count[0] += 1
1365
            if count[0] == 1:
1366
                raise errors.BzrError("fail")
1367
        bzrdir.BzrDir.hooks.install_named_hook('pre_open', fail_once, None)
1368
        transport = self.get_transport('foo')
1369
        url = transport.base
1370
        err = self.assertRaises(errors.BzrError, bzrdir.BzrDir.open, url)
1371
        self.assertEqual('fail', err._preformatted_string)
4797.94.2 by Jelmer Vernooij
Add tests.
1372
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1373
    def test_post_repo_init(self):
6207.3.8 by Jelmer Vernooij
Fix a bunch of tests.
1374
        from bzrlib.controldir import RepoInitHookParams
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1375
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
1376
        bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1377
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1378
        self.make_repository('foo')
1379
        self.assertLength(1, calls)
1380
        params = calls[0]
1381
        self.assertIsInstance(params, RepoInitHookParams)
1382
        self.assertTrue(hasattr(params, 'bzrdir'))
1383
        self.assertTrue(hasattr(params, 'repository'))
5050.21.3 by Andrew Bennetts
Add a test for RepoInitHookParams.__repr__ too.
1384
1385
    def test_post_repo_init_hook_repr(self):
1386
        param_reprs = []
1387
        bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1388
            lambda params: param_reprs.append(repr(params)), None)
1389
        self.make_repository('foo')
1390
        self.assertLength(1, param_reprs)
1391
        param_repr = param_reprs[0]
1392
        self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1393
4797.94.2 by Jelmer Vernooij
Add tests.
1394
5340.8.4 by Marius Kruger
* gen_backup_name => generate_backup_name
1395
class TestGenerateBackupName(TestCaseWithMemoryTransport):
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
1396
    # FIXME: This may need to be unified with test_osutils.TestBackupNames or
1397
    # moved to per_bzrdir or per_transport for better coverage ?
1398
    # -- vila 20100909
5340.8.4 by Marius Kruger
* gen_backup_name => generate_backup_name
1399
1400
    def setUp(self):
1401
        super(TestGenerateBackupName, self).setUp()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
1402
        self._transport = self.get_transport()
5340.8.4 by Marius Kruger
* gen_backup_name => generate_backup_name
1403
        bzrdir.BzrDir.create(self.get_url(),
1404
            possible_transports=[self._transport])
1405
        self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1406
1407
    def test_new(self):
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
1408
        self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
5340.8.4 by Marius Kruger
* gen_backup_name => generate_backup_name
1409
1410
    def test_exiting(self):
1411
        self._transport.put_bytes("a.~1~", "some content")
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
1412
        self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))
5669.3.8 by Jelmer Vernooij
Refactor, move to bzrlib.controldir.
1413
6083.2.11 by Jelmer Vernooij
Add development-colo format.
1414
1415
class TestMeta1DirColoFormat(TestCaseWithTransport):
1416
    """Tests specific to the meta1 dir with colocated branches format."""
1417
1418
    def test_supports_colo(self):
1419
        format = bzrdir.BzrDirMetaFormat1Colo()
1420
        self.assertTrue(format.colocated_branches)
6207.1.1 by Jelmer Vernooij
Support upgrading between 2a and development-colo.
1421
1422
    def test_upgrade_from_2a(self):
1423
        tree = self.make_branch_and_tree('.', format='2a')
1424
        format = bzrdir.BzrDirMetaFormat1Colo()
1425
        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1426
        converter = tree.bzrdir._format.get_converter(format)
1427
        result = converter.convert(tree.bzrdir, None)
1428
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1429
        self.assertFalse(result.needs_format_conversion(format))
1430
1431
    def test_downgrade_to_2a(self):
1432
        tree = self.make_branch_and_tree('.', format='development-colo')
1433
        format = bzrdir.BzrDirMetaFormat1()
1434
        self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1435
        converter = tree.bzrdir._format.get_converter(format)
1436
        result = converter.convert(tree.bzrdir, None)
1437
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1438
        self.assertFalse(result.needs_format_conversion(format))
1439
1440
    def test_downgrade_to_2a_too_many_branches(self):
1441
        tree = self.make_branch_and_tree('.', format='development-colo')
1442
        tree.bzrdir.create_branch(name="another-colocated-branch")
1443
        converter = tree.bzrdir._format.get_converter(
1444
            bzrdir.BzrDirMetaFormat1())
6437.21.3 by Jelmer Vernooij
Fix test.
1445
        result = converter.convert(tree.bzrdir, bzrdir.BzrDirMetaFormat1())
1446
        self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
6239.1.1 by Jelmer Vernooij
Create lock directories in .bzr/, not .
1447
6437.18.2 by Jelmer Vernooij
Check for slashes in branch names.
1448
    def test_nested(self):
1449
        tree = self.make_branch_and_tree('.', format='development-colo')
1450
        tree.bzrdir.create_branch(name='foo')
1451
        tree.bzrdir.create_branch(name='fool/bla')
1452
        self.assertRaises(
1453
            errors.ParentBranchExists, tree.bzrdir.create_branch,
1454
            name='foo/bar')
1455
6437.18.4 by Jelmer Vernooij
Cope with child branches, too.
1456
    def test_parent(self):
1457
        tree = self.make_branch_and_tree('.', format='development-colo')
1458
        tree.bzrdir.create_branch(name='fool/bla')
1459
        tree.bzrdir.create_branch(name='foo/bar')
1460
        self.assertRaises(
6437.18.5 by Jelmer Vernooij
Review feedback from mgz: Use AlreadyBranchError rather than ChildBranchError, pass unicode.
1461
            errors.AlreadyBranchError, tree.bzrdir.create_branch,
6437.18.4 by Jelmer Vernooij
Cope with child branches, too.
1462
            name='foo')
1463
6213.1.5 by Jelmer Vernooij
Add feature flags object.
1464
6213.1.33 by Jelmer Vernooij
Fix some tests.
1465
class SampleBzrFormat(bzrdir.BzrFormat):
1466
1467
    @classmethod
1468
    def get_format_string(cls):
1469
        return "First line\n"
1470
1471
6213.1.31 by Jelmer Vernooij
Fix more tests.
1472
class TestBzrFormat(TestCase):
1473
    """Tests for BzrFormat."""
6213.1.5 by Jelmer Vernooij
Add feature flags object.
1474
1475
    def test_as_string(self):
6213.1.33 by Jelmer Vernooij
Fix some tests.
1476
        format = SampleBzrFormat()
1477
        format.features = {"foo": "required"}
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1478
        self.assertEqual(format.as_string(),
6213.1.33 by Jelmer Vernooij
Fix some tests.
1479
            "First line\n"
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1480
            "required foo\n")
6213.1.33 by Jelmer Vernooij
Fix some tests.
1481
        format.features["another"] = "optional"
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1482
        self.assertEqual(format.as_string(),
6213.1.33 by Jelmer Vernooij
Fix some tests.
1483
            "First line\n"
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1484
            "required foo\n"
1485
            "optional another\n")
6213.1.5 by Jelmer Vernooij
Add feature flags object.
1486
6213.1.43 by Jelmer Vernooij
Cope with features already existing.
1487
    def test_network_name(self):
6213.1.37 by Jelmer Vernooij
Moar tests.
1488
        # The network string should include the feature info
1489
        format = SampleBzrFormat()
1490
        format.features = {"foo": "required"}
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1491
        self.assertEqual(
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1492
            "First line\nrequired foo\n",
6213.1.43 by Jelmer Vernooij
Cope with features already existing.
1493
            format.network_name())
6213.1.37 by Jelmer Vernooij
Moar tests.
1494
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1495
    def test_from_string_no_features(self):
6213.1.51 by Jelmer Vernooij
Add some comments.
1496
        # No features
1497
        format = SampleBzrFormat.from_string(
1498
            "First line\n")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1499
        self.assertEqual({}, format.features)
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1500
1501
    def test_from_string_with_feature(self):
6213.1.51 by Jelmer Vernooij
Add some comments.
1502
        # Proper feature
6213.1.33 by Jelmer Vernooij
Fix some tests.
1503
        format = SampleBzrFormat.from_string(
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1504
            "First line\nrequired foo\n")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1505
        self.assertEqual("required", format.features.get("foo"))
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1506
1507
    def test_from_string_format_string_mismatch(self):
6213.1.51 by Jelmer Vernooij
Add some comments.
1508
        # The first line has to match the format string
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1509
        self.assertRaises(AssertionError, SampleBzrFormat.from_string,
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1510
            "Second line\nrequired foo\n")
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1511
1512
    def test_from_string_missing_space(self):
6213.1.51 by Jelmer Vernooij
Add some comments.
1513
        # At least one space is required in the feature lines
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1514
        self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
6213.1.37 by Jelmer Vernooij
Moar tests.
1515
            "First line\nfoo\n")
6213.1.53 by Jelmer Vernooij
Add ParseFormatError.
1516
1517
    def test_from_string_with_spaces(self):
6213.1.51 by Jelmer Vernooij
Add some comments.
1518
        # Feature with spaces (in case we add stuff like this in the future)
6213.1.45 by Jelmer Vernooij
Ignore optional non-feature lines in bzr formats.
1519
        format = SampleBzrFormat.from_string(
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1520
            "First line\nrequired foo with spaces\n")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1521
        self.assertEqual("required", format.features.get("foo with spaces"))
6213.1.6 by Jelmer Vernooij
Add FeatureFlags.__eq__.
1522
1523
    def test_eq(self):
6213.1.33 by Jelmer Vernooij
Fix some tests.
1524
        format1 = SampleBzrFormat()
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1525
        format1.features = {"nested-trees": "optional"}
6213.1.33 by Jelmer Vernooij
Fix some tests.
1526
        format2 = SampleBzrFormat()
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1527
        format2.features = {"nested-trees": "optional"}
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1528
        self.assertEqual(format1, format1)
1529
        self.assertEqual(format1, format2)
6213.1.33 by Jelmer Vernooij
Fix some tests.
1530
        format3 = SampleBzrFormat()
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
1531
        self.assertNotEqual(format1, format3)
6213.1.29 by Jelmer Vernooij
Update docs, fix tests.
1532
1533
    def test_check_support_status_optional(self):
1534
        # Optional, so silently ignore
6213.1.33 by Jelmer Vernooij
Fix some tests.
1535
        format = SampleBzrFormat()
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1536
        format.features = {"nested-trees": "optional"}
6213.1.33 by Jelmer Vernooij
Fix some tests.
1537
        format.check_support_status(True)
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1538
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1539
        SampleBzrFormat.register_feature("nested-trees")
6213.1.33 by Jelmer Vernooij
Fix some tests.
1540
        format.check_support_status(True)
6213.1.29 by Jelmer Vernooij
Update docs, fix tests.
1541
1542
    def test_check_support_status_required(self):
1543
        # Optional, so trigger an exception
6213.1.33 by Jelmer Vernooij
Fix some tests.
1544
        format = SampleBzrFormat()
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1545
        format.features = {"nested-trees": "required"}
6213.1.33 by Jelmer Vernooij
Fix some tests.
1546
        self.assertRaises(errors.MissingFeature, format.check_support_status,
1547
            True)
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1548
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1549
        SampleBzrFormat.register_feature("nested-trees")
6213.1.33 by Jelmer Vernooij
Fix some tests.
1550
        format.check_support_status(True)
6213.1.29 by Jelmer Vernooij
Update docs, fix tests.
1551
1552
    def test_check_support_status_unknown(self):
1553
        # treat unknown necessity as required
6213.1.33 by Jelmer Vernooij
Fix some tests.
1554
        format = SampleBzrFormat()
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1555
        format.features = {"nested-trees": "unknown"}
6213.1.33 by Jelmer Vernooij
Fix some tests.
1556
        self.assertRaises(errors.MissingFeature, format.check_support_status,
1557
            True)
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1558
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1559
        SampleBzrFormat.register_feature("nested-trees")
6213.1.33 by Jelmer Vernooij
Fix some tests.
1560
        format.check_support_status(True)
6213.1.43 by Jelmer Vernooij
Cope with features already existing.
1561
1562
    def test_feature_already_registered(self):
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1563
        # a feature can only be registered once
1564
        self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1565
        SampleBzrFormat.register_feature("nested-trees")
6213.1.43 by Jelmer Vernooij
Cope with features already existing.
1566
        self.assertRaises(errors.FeatureAlreadyRegistered,
6213.1.48 by Jelmer Vernooij
Drop feature bit, don't allow spaces.
1567
            SampleBzrFormat.register_feature, "nested-trees")
1568
1569
    def test_feature_with_space(self):
1570
        # spaces are not allowed in feature names
1571
        self.assertRaises(ValueError, SampleBzrFormat.register_feature,
1572
            "nested trees")