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