/brz/remove-bazaar

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