/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
1
# Copyright (C) 2006-2012 Canonical Ltd
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
2
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
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.
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
7
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
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.
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
12
#
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
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.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
16
17
"""Tests for the Branch facility that are not interface  tests.
18
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
19
For interface tests see `tests/per_branch/*.py`.
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
20
21
For concrete class tests see this file, and for meta-branch tests
22
also see this file.
23
"""
24
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
25
from cStringIO import StringIO
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
26
2230.3.3 by Aaron Bentley
Add more config testing
27
from bzrlib import (
28
    branch as _mod_branch,
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
29
    bzrdir,
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
30
    config,
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
31
    controldir,
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
32
    errors,
5348.1.2 by Martin Pool
Deprecate casting PushResult and PullResult to int to get the relative revno change
33
    symbol_versioning,
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
34
    tests,
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
35
    trace,
2230.3.3 by Aaron Bentley
Add more config testing
36
    urlutils,
37
    )
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
38
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
39
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
40
class TestDefaultFormat(tests.TestCase):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
41
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
42
    def test_default_format(self):
43
        # update this if you change the default branch format
6213.1.16 by Jelmer Vernooij
Feature support in repository.
44
        self.assertIsInstance(_mod_branch.format_registry.get_default(),
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
45
                _mod_branch.BzrBranchFormat7)
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
46
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
47
    def test_default_format_is_same_as_bzrdir_default(self):
48
        # XXX: it might be nice if there was only one place the default was
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
49
        # set, but at the moment that's not true -- mbp 20070814 --
2696.3.8 by Martin Pool
doc
50
        # https://bugs.launchpad.net/bzr/+bug/132376
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
51
        self.assertEqual(
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
52
            _mod_branch.format_registry.get_default(),
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
53
            bzrdir.BzrDirFormat.get_default_format().get_branch_format())
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
54
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
55
    def test_get_set_default_format(self):
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
56
        # set the format and then set it back again
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
57
        old_format = _mod_branch.format_registry.get_default()
5662.2.6 by Jelmer Vernooij
add more tests.
58
        _mod_branch.format_registry.set_default(SampleBranchFormat())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
59
        try:
60
            # the default branch format is used by the meta dir format
61
            # which is not the default bzrdir format at this point
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
62
            dir = bzrdir.BzrDirMetaFormat1().initialize('memory:///')
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
63
            result = dir.create_branch()
64
            self.assertEqual(result, 'A branch')
65
        finally:
5662.2.6 by Jelmer Vernooij
add more tests.
66
            _mod_branch.format_registry.set_default(old_format)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
67
        self.assertEqual(old_format,
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
68
                         _mod_branch.format_registry.get_default())
1508.1.25 by Robert Collins
Update per review comments.
69
70
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
71
class TestBranchFormat5(tests.TestCaseWithTransport):
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
72
    """Tests specific to branch format 5"""
73
74
    def test_branch_format_5_uses_lockdir(self):
75
        url = self.get_url()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
76
        bdir = bzrdir.BzrDirMetaFormat1().initialize(url)
77
        bdir.create_repository()
5718.8.8 by Jelmer Vernooij
Actually use branch format 5 in branch format 5 test.
78
        branch = _mod_branch.BzrBranchFormat5().initialize(bdir)
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
79
        t = self.get_transport()
80
        self.log("branch instance is %r" % branch)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
81
        self.assert_(isinstance(branch, _mod_branch.BzrBranch5))
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
82
        self.assertIsDirectory('.', t)
83
        self.assertIsDirectory('.bzr/branch', t)
84
        self.assertIsDirectory('.bzr/branch/lock', t)
1553.5.73 by Martin Pool
Additional test that Branch5 uses lockdir properly
85
        branch.lock_write()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
86
        self.addCleanup(branch.unlock)
87
        self.assertIsDirectory('.bzr/branch/lock/held', t)
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
88
2230.3.3 by Aaron Bentley
Add more config testing
89
    def test_set_push_location(self):
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
90
        conf = config.LocationConfig.from_string('# comment\n', '.', save=True)
2839.3.1 by Alexander Belchenko
provide non-empty locations.conf for test_branch.TestBranchFormat5.test_set_push_location
91
2230.3.3 by Aaron Bentley
Add more config testing
92
        branch = self.make_branch('.', format='knit')
93
        branch.set_push_location('foo')
94
        local_path = urlutils.local_path_from_url(branch.base[:-1])
2839.3.1 by Alexander Belchenko
provide non-empty locations.conf for test_branch.TestBranchFormat5.test_set_push_location
95
        self.assertFileEqual("# comment\n"
96
                             "[%s]\n"
2230.3.3 by Aaron Bentley
Add more config testing
97
                             "push_location = foo\n"
3221.7.1 by Matt Nordhoff
Upgrade ConfigObj to version 4.5.1.
98
                             "push_location:policy = norecurse\n" % local_path,
5345.1.11 by Vincent Ladeuil
Cleanup bt.test_branch.
99
                             config.locations_config_filename())
2230.3.3 by Aaron Bentley
Add more config testing
100
2230.3.12 by Aaron Bentley
Clean up trailing whitespace
101
    # TODO RBC 20051029 test getting a push location from a branch in a
2230.3.3 by Aaron Bentley
Add more config testing
102
    # recursive section - that is, it appends the branch name.
103
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
104
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
105
class SampleBranchFormat(_mod_branch.BranchFormatMetadir):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
106
    """A sample format
107
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
108
    this format is initializable, unsupported to aid in testing the
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
109
    open and open_downlevel routines.
110
    """
111
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
112
    @classmethod
113
    def get_format_string(cls):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
114
        """See BzrBranchFormat.get_format_string()."""
115
        return "Sample branch format."
116
6123.9.15 by Jelmer Vernooij
More test fixes.
117
    def initialize(self, a_bzrdir, name=None, repository=None,
118
                   append_revisions_only=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
119
        """Format 4 branches cannot be created."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
120
        t = a_bzrdir.get_branch_transport(self, name=name)
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
121
        t.put_bytes('format', self.get_format_string())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
122
        return 'A branch'
123
124
    def is_supported(self):
125
        return False
126
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
127
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
128
             possible_transports=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
129
        return "opened branch."
130
131
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
132
# Demonstrating how lazy loading is often implemented:
133
# A constant string is created.
134
SampleSupportedBranchFormatString = "Sample supported branch format."
135
136
# And the format class can then reference the constant to avoid skew.
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
137
class SampleSupportedBranchFormat(_mod_branch.BranchFormatMetadir):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
138
    """A sample supported format."""
139
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
140
    @classmethod
141
    def get_format_string(cls):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
142
        """See BzrBranchFormat.get_format_string()."""
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
143
        return SampleSupportedBranchFormatString
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
144
6123.9.15 by Jelmer Vernooij
More test fixes.
145
    def initialize(self, a_bzrdir, name=None, append_revisions_only=None):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
146
        t = a_bzrdir.get_branch_transport(self, name=name)
147
        t.put_bytes('format', self.get_format_string())
148
        return 'A branch'
149
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
150
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
151
             possible_transports=None):
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
152
        return "opened supported branch."
153
154
5642.2.1 by Jelmer Vernooij
Allow the registration of non-metadir branch formats.
155
class SampleExtraBranchFormat(_mod_branch.BranchFormat):
156
    """A sample format that is not usable in a metadir."""
157
158
    def get_format_string(self):
159
        # This format is not usable in a metadir.
160
        return None
161
162
    def network_name(self):
163
        # Network name always has to be provided.
164
        return "extra"
165
166
    def initialize(self, a_bzrdir, name=None):
167
        raise NotImplementedError(self.initialize)
168
6305.3.4 by Jelmer Vernooij
Add possible_transports in a couple more places.
169
    def open(self, transport, name=None, _found=False, ignore_fallbacks=False,
170
             possible_transports=None):
5642.2.1 by Jelmer Vernooij
Allow the registration of non-metadir branch formats.
171
        raise NotImplementedError(self.open)
172
173
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
174
class TestBzrBranchFormat(tests.TestCaseWithTransport):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
175
    """Tests for the BzrBranchFormat facility."""
176
177
    def test_find_format(self):
178
        # is the right format object found for a branch?
179
        # create a branch with a few known format objects.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
180
        # this is not quite the same as
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
181
        self.build_tree(["foo/", "bar/"])
182
        def check_format(format, url):
183
            dir = format._matchingbzrdir.initialize(url)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
184
            dir.create_repository()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
185
            format.initialize(dir)
6213.1.13 by Jelmer Vernooij
make some methods class methods.
186
            found_format = _mod_branch.BranchFormatMetadir.find_format(dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
187
            self.assertIsInstance(found_format, format.__class__)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
188
        check_format(_mod_branch.BzrBranchFormat5(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
189
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
190
    def test_find_format_factory(self):
191
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
192
        SampleSupportedBranchFormat().initialize(dir)
193
        factory = _mod_branch.MetaDirBranchFormatFactory(
5305.1.2 by Robert Collins
More clarity about how to use the lazy registration feature.
194
            SampleSupportedBranchFormatString,
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
195
            "bzrlib.tests.test_branch", "SampleSupportedBranchFormat")
5662.2.6 by Jelmer Vernooij
add more tests.
196
        _mod_branch.format_registry.register(factory)
197
        self.addCleanup(_mod_branch.format_registry.remove, factory)
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
198
        b = _mod_branch.Branch.open(self.get_url())
199
        self.assertEqual(b, "opened supported branch.")
200
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
201
    def test_from_string(self):
202
        self.assertIsInstance(
203
            SampleBranchFormat.from_string("Sample branch format."),
204
            SampleBranchFormat)
6213.1.54 by Jelmer Vernooij
Fix tests.
205
        self.assertRaises(AssertionError,
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
206
            SampleBranchFormat.from_string, "Different branch format.")
207
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
208
    def test_find_format_not_branch(self):
209
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
210
        self.assertRaises(errors.NotBranchError,
6213.1.13 by Jelmer Vernooij
make some methods class methods.
211
                          _mod_branch.BranchFormatMetadir.find_format,
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
212
                          dir)
213
214
    def test_find_format_unknown_format(self):
215
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
216
        SampleBranchFormat().initialize(dir)
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
217
        self.assertRaises(errors.UnknownFormatError,
6213.1.13 by Jelmer Vernooij
make some methods class methods.
218
                          _mod_branch.BranchFormatMetadir.find_format,
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
219
                          dir)
220
6213.1.13 by Jelmer Vernooij
make some methods class methods.
221
    def test_find_format_with_features(self):
222
        tree = self.make_branch_and_tree('.', format='2a')
6213.1.57 by Jelmer Vernooij
Add Branch.update_features.
223
        tree.branch.update_feature_flags({"name": "optional"})
6213.1.15 by Jelmer Vernooij
Fix format feature tests.
224
        found_format = _mod_branch.BranchFormatMetadir.find_format(tree.bzrdir)
6213.1.13 by Jelmer Vernooij
make some methods class methods.
225
        self.assertIsInstance(found_format, _mod_branch.BranchFormatMetadir)
6213.1.32 by Jelmer Vernooij
Fix check support status.
226
        self.assertEquals(found_format.features.get("name"), "optional")
6213.1.57 by Jelmer Vernooij
Add Branch.update_features.
227
        tree.branch.update_feature_flags({"name": None})
228
        branch = _mod_branch.Branch.open('.')
229
        self.assertEquals(branch._format.features, {})
6213.1.13 by Jelmer Vernooij
make some methods class methods.
230
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
231
5662.2.6 by Jelmer Vernooij
add more tests.
232
class TestBranchFormatRegistry(tests.TestCase):
233
234
    def setUp(self):
235
        super(TestBranchFormatRegistry, self).setUp()
236
        self.registry = _mod_branch.BranchFormatRegistry()
237
238
    def test_default(self):
239
        self.assertIs(None, self.registry.get_default())
240
        format = SampleBranchFormat()
241
        self.registry.set_default(format)
242
        self.assertEquals(format, self.registry.get_default())
243
244
    def test_register_unregister_format(self):
245
        format = SampleBranchFormat()
246
        self.registry.register(format)
247
        self.assertEquals(format,
248
            self.registry.get("Sample branch format."))
249
        self.registry.remove(format)
250
        self.assertRaises(KeyError, self.registry.get,
251
            "Sample branch format.")
252
253
    def test_get_all(self):
254
        format = SampleBranchFormat()
255
        self.assertEquals([], self.registry._get_all())
256
        self.registry.register(format)
257
        self.assertEquals([format], self.registry._get_all())
258
259
    def test_register_extra(self):
260
        format = SampleExtraBranchFormat()
261
        self.assertEquals([], self.registry._get_all())
262
        self.registry.register_extra(format)
263
        self.assertEquals([format], self.registry._get_all())
264
265
    def test_register_extra_lazy(self):
266
        self.assertEquals([], self.registry._get_all())
267
        self.registry.register_extra_lazy("bzrlib.tests.test_branch",
268
            "SampleExtraBranchFormat")
269
        formats = self.registry._get_all()
270
        self.assertEquals(1, len(formats))
271
        self.assertIsInstance(formats[0], SampleExtraBranchFormat)
272
273
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
274
#Used by TestMetaDirBranchFormatFactory 
275
FakeLazyFormat = None
276
277
278
class TestMetaDirBranchFormatFactory(tests.TestCase):
279
280
    def test_get_format_string_does_not_load(self):
281
        """Formats have a static format string."""
282
        factory = _mod_branch.MetaDirBranchFormatFactory("yo", None, None)
283
        self.assertEqual("yo", factory.get_format_string())
284
285
    def test_call_loads(self):
286
        # __call__ is used by the network_format_registry interface to get a
287
        # Format.
288
        global FakeLazyFormat
289
        del FakeLazyFormat
290
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
291
            "bzrlib.tests.test_branch", "FakeLazyFormat")
292
        self.assertRaises(AttributeError, factory)
293
294
    def test_call_returns_call_of_referenced_object(self):
295
        global FakeLazyFormat
296
        FakeLazyFormat = lambda:'called'
297
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
298
            "bzrlib.tests.test_branch", "FakeLazyFormat")
299
        self.assertEqual('called', factory())
300
301
3221.11.2 by Robert Collins
Create basic stackable branch facility.
302
class TestBranch67(object):
303
    """Common tests for both branch 6 and 7 which are mostly the same."""
304
305
    def get_format_name(self):
306
        raise NotImplementedError(self.get_format_name)
307
308
    def get_format_name_subtree(self):
309
        raise NotImplementedError(self.get_format_name)
310
311
    def get_class(self):
312
        raise NotImplementedError(self.get_class)
2230.3.1 by Aaron Bentley
Get branch6 creation working
313
314
    def test_creation(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
315
        format = bzrdir.BzrDirMetaFormat1()
2230.3.55 by Aaron Bentley
Updates from review
316
        format.set_branch_format(_mod_branch.BzrBranchFormat6())
2230.3.1 by Aaron Bentley
Get branch6 creation working
317
        branch = self.make_branch('a', format=format)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
318
        self.assertIsInstance(branch, self.get_class())
319
        branch = self.make_branch('b', format=self.get_format_name())
320
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
321
        branch = _mod_branch.Branch.open('a')
3221.11.2 by Robert Collins
Create basic stackable branch facility.
322
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
323
324
    def test_layout(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
325
        branch = self.make_branch('a', format=self.get_format_name())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
326
        self.assertPathExists('a/.bzr/branch/last-revision')
327
        self.assertPathDoesNotExist('a/.bzr/branch/revision-history')
328
        self.assertPathDoesNotExist('a/.bzr/branch/references')
2230.3.1 by Aaron Bentley
Get branch6 creation working
329
2230.3.3 by Aaron Bentley
Add more config testing
330
    def test_config(self):
331
        """Ensure that all configuration data is stored in the branch"""
3221.11.2 by Robert Collins
Create basic stackable branch facility.
332
        branch = self.make_branch('a', format=self.get_format_name())
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
333
        branch.set_parent('http://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
334
        self.assertPathDoesNotExist('a/.bzr/branch/parent')
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
335
        self.assertEqual('http://example.com', branch.get_parent())
336
        branch.set_push_location('sftp://example.com')
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
337
        conf = branch.get_config_stack()
338
        self.assertEqual('sftp://example.com', conf.get('push_location'))
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
339
        branch.set_bound_location('ftp://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
340
        self.assertPathDoesNotExist('a/.bzr/branch/bound')
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
341
        self.assertEqual('ftp://example.com', branch.get_bound_location())
2230.3.3 by Aaron Bentley
Add more config testing
342
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
343
    def test_set_revision_history(self):
3567.4.16 by John Arbash Meinel
Use the new BranchBuilder api in a Branch test
344
        builder = self.make_branch_builder('.', format=self.get_format_name())
345
        builder.build_snapshot('foo', None,
346
            [('add', ('', None, 'directory', None))],
347
            message='foo')
348
        builder.build_snapshot('bar', None, [], message='bar')
349
        branch = builder.get_branch()
350
        branch.lock_write()
351
        self.addCleanup(branch.unlock)
5718.7.4 by Jelmer Vernooij
Branch.set_revision_history.
352
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
353
            branch.set_revision_history, ['foo', 'bar'])
354
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
355
                branch.set_revision_history, ['foo'])
3567.4.16 by John Arbash Meinel
Use the new BranchBuilder api in a Branch test
356
        self.assertRaises(errors.NotLefthandHistory,
5718.7.4 by Jelmer Vernooij
Branch.set_revision_history.
357
            self.applyDeprecated, symbol_versioning.deprecated_in((2, 4, 0)),
358
            branch.set_revision_history, ['bar'])
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
359
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
360
    def do_checkout_test(self, lightweight=False):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
361
        tree = self.make_branch_and_tree('source',
362
            format=self.get_format_name_subtree())
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
363
        subtree = self.make_branch_and_tree('source/subtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
364
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
365
        subsubtree = self.make_branch_and_tree('source/subtree/subsubtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
366
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
367
        self.build_tree(['source/subtree/file',
368
                         'source/subtree/subsubtree/file'])
369
        subsubtree.add('file')
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
370
        subtree.add('file')
2100.3.25 by Aaron Bentley
add subsubtree to test
371
        subtree.add_reference(subsubtree)
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
372
        tree.add_reference(subtree)
373
        tree.commit('a revision')
2100.3.23 by Aaron Bentley
Nested checkouts kinda work
374
        subtree.commit('a subtree file')
2100.3.25 by Aaron Bentley
add subsubtree to test
375
        subsubtree.commit('a subsubtree file')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
376
        tree.branch.create_checkout('target', lightweight=lightweight)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
377
        self.assertPathExists('target')
378
        self.assertPathExists('target/subtree')
379
        self.assertPathExists('target/subtree/file')
380
        self.assertPathExists('target/subtree/subsubtree/file')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
381
        subbranch = _mod_branch.Branch.open('target/subtree/subsubtree')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
382
        if lightweight:
383
            self.assertEndsWith(subbranch.base, 'source/subtree/subsubtree/')
384
        else:
385
            self.assertEndsWith(subbranch.base, 'target/subtree/subsubtree/')
386
387
    def test_checkout_with_references(self):
388
        self.do_checkout_test()
389
390
    def test_light_checkout_with_references(self):
391
        self.do_checkout_test(lightweight=True)
2230.3.51 by Aaron Bentley
Store revno for Branch6, set_last_revision -> set_last_revision_info
392
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
393
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
394
class TestBranch6(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
395
396
    def get_class(self):
397
        return _mod_branch.BzrBranch6
398
399
    def get_format_name(self):
400
        return "dirstate-tags"
401
402
    def get_format_name_subtree(self):
403
        return "dirstate-with-subtree"
404
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
405
    def test_set_stacked_on_url_errors(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
406
        branch = self.make_branch('a', format=self.get_format_name())
407
        self.assertRaises(errors.UnstackableBranchFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
408
            branch.set_stacked_on_url, None)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
409
410
    def test_default_stacked_location(self):
411
        branch = self.make_branch('a', format=self.get_format_name())
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
412
        self.assertRaises(errors.UnstackableBranchFormat, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
413
414
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
415
class TestBranch7(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
416
417
    def get_class(self):
418
        return _mod_branch.BzrBranch7
419
420
    def get_format_name(self):
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
421
        return "1.9"
3221.11.2 by Robert Collins
Create basic stackable branch facility.
422
423
    def get_format_name_subtree(self):
424
        return "development-subtree"
425
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
426
    def test_set_stacked_on_url_unstackable_repo(self):
3221.11.6 by Robert Collins
Stackable branch fixes.
427
        repo = self.make_repository('a', format='dirstate-tags')
428
        control = repo.bzrdir
429
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
430
        target = self.make_branch('b')
431
        self.assertRaises(errors.UnstackableRepositoryFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
432
            branch.set_stacked_on_url, target.base)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
433
3242.3.21 by Jonathan Lange
Preserve stacking in clone
434
    def test_clone_stacked_on_unstackable_repo(self):
435
        repo = self.make_repository('a', format='dirstate-tags')
436
        control = repo.bzrdir
437
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
438
        # Calling clone should not raise UnstackableRepositoryFormat.
439
        cloned_bzrdir = control.clone('cloned')
440
3221.11.2 by Robert Collins
Create basic stackable branch facility.
441
    def _test_default_stacked_location(self):
442
        branch = self.make_branch('a', format=self.get_format_name())
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
443
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
444
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
445
    def test_stack_and_unstack(self):
446
        branch = self.make_branch('a', format=self.get_format_name())
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
447
        target = self.make_branch_and_tree('b', format=self.get_format_name())
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
448
        branch.set_stacked_on_url(target.branch.base)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
449
        self.assertEqual(target.branch.base, branch.get_stacked_on_url())
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
450
        revid = target.commit('foo')
451
        self.assertTrue(branch.repository.has_revision(revid))
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
452
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
453
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.10 by Robert Collins
Extend set_stacked_on to update the repository with the right external references.
454
        self.assertFalse(branch.repository.has_revision(revid))
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
455
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
456
    def test_open_opens_stacked_reference(self):
457
        branch = self.make_branch('a', format=self.get_format_name())
458
        target = self.make_branch_and_tree('b', format=self.get_format_name())
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
459
        branch.set_stacked_on_url(target.branch.base)
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
460
        branch = branch.bzrdir.open_branch()
461
        revid = target.commit('foo')
462
        self.assertTrue(branch.repository.has_revision(revid))
463
3221.11.2 by Robert Collins
Create basic stackable branch facility.
464
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
465
class BzrBranch8(tests.TestCaseWithTransport):
4273.1.15 by Aaron Bentley
Add reference_info caching.
466
467
    def make_branch(self, location, format=None):
468
        if format is None:
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
469
            format = controldir.format_registry.make_bzrdir('1.9')
4273.1.15 by Aaron Bentley
Add reference_info caching.
470
            format.set_branch_format(_mod_branch.BzrBranchFormat8())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
471
        return tests.TestCaseWithTransport.make_branch(
472
            self, location, format=format)
4273.1.15 by Aaron Bentley
Add reference_info caching.
473
474
    def create_branch_with_reference(self):
475
        branch = self.make_branch('branch')
476
        branch._set_all_reference_info({'file-id': ('path', 'location')})
477
        return branch
478
479
    @staticmethod
480
    def instrument_branch(branch, gets):
481
        old_get = branch._transport.get
482
        def get(*args, **kwargs):
483
            gets.append((args, kwargs))
484
            return old_get(*args, **kwargs)
485
        branch._transport.get = get
486
487
    def test_reference_info_caching_read_locked(self):
488
        gets = []
489
        branch = self.create_branch_with_reference()
490
        branch.lock_read()
491
        self.addCleanup(branch.unlock)
492
        self.instrument_branch(branch, gets)
493
        branch.get_reference_info('file-id')
494
        branch.get_reference_info('file-id')
495
        self.assertEqual(1, len(gets))
496
497
    def test_reference_info_caching_read_unlocked(self):
498
        gets = []
499
        branch = self.create_branch_with_reference()
500
        self.instrument_branch(branch, gets)
501
        branch.get_reference_info('file-id')
502
        branch.get_reference_info('file-id')
503
        self.assertEqual(2, len(gets))
504
505
    def test_reference_info_caching_write_locked(self):
506
        gets = []
507
        branch = self.make_branch('branch')
508
        branch.lock_write()
509
        self.instrument_branch(branch, gets)
510
        self.addCleanup(branch.unlock)
511
        branch._set_all_reference_info({'file-id': ('path2', 'location2')})
512
        path, location = branch.get_reference_info('file-id')
513
        self.assertEqual(0, len(gets))
514
        self.assertEqual('path2', path)
515
        self.assertEqual('location2', location)
516
517
    def test_reference_info_caches_cleared(self):
518
        branch = self.make_branch('branch')
519
        branch.lock_write()
520
        branch.set_reference_info('file-id', 'path2', 'location2')
521
        branch.unlock()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
522
        doppelganger = _mod_branch.Branch.open('branch')
4273.1.15 by Aaron Bentley
Add reference_info caching.
523
        doppelganger.set_reference_info('file-id', 'path3', 'location3')
524
        self.assertEqual(('path3', 'location3'),
525
                         branch.get_reference_info('file-id'))
526
6165.4.11 by Jelmer Vernooij
More test fixes.
527
    def _recordParentMapCalls(self, repo):
528
        self._parent_map_calls = []
529
        orig_get_parent_map = repo.revisions.get_parent_map
530
        def get_parent_map(q):
531
            q = list(q)
532
            self._parent_map_calls.extend([e[0] for e in q])
533
            return orig_get_parent_map(q)
534
        repo.revisions.get_parent_map = get_parent_map
535
536
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
537
class TestBranchReference(tests.TestCaseWithTransport):
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
538
    """Tests for the branch reference facility."""
539
540
    def test_create_open_reference(self):
541
        bzrdirformat = bzrdir.BzrDirMetaFormat1()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
542
        t = self.get_transport()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
543
        t.mkdir('repo')
544
        dir = bzrdirformat.initialize(self.get_url('repo'))
545
        dir.create_repository()
546
        target_branch = dir.create_branch()
547
        t.mkdir('branch')
548
        branch_dir = bzrdirformat.initialize(self.get_url('branch'))
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
549
        made_branch = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
550
            branch_dir, target_branch=target_branch)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
551
        self.assertEqual(made_branch.base, target_branch.base)
552
        opened_branch = branch_dir.open_branch()
553
        self.assertEqual(opened_branch.base, target_branch.base)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
554
555
    def test_get_reference(self):
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
556
        """For a BranchReference, get_reference should return the location."""
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
557
        branch = self.make_branch('target')
558
        checkout = branch.create_checkout('checkout', lightweight=True)
559
        reference_url = branch.bzrdir.root_transport.abspath('') + '/'
560
        # if the api for create_checkout changes to return different checkout types
561
        # then this file read will fail.
562
        self.assertFileEqual(reference_url, 'checkout/.bzr/branch/location')
563
        self.assertEqual(reference_url,
2018.5.97 by Andrew Bennetts
Fix more tests.
564
            _mod_branch.BranchReferenceFormat().get_reference(checkout.bzrdir))
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
565
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
566
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
567
class TestHooks(tests.TestCaseWithTransport):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
568
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
569
    def test_constructor(self):
570
        """Check that creating a BranchHooks instance has the right defaults."""
5622.3.15 by Jelmer Vernooij
Fix branch hooks constructor test.
571
        hooks = _mod_branch.BranchHooks()
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
572
        self.assertTrue("set_rh" in hooks, "set_rh not in %s" % hooks)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
573
        self.assertTrue("post_push" in hooks, "post_push not in %s" % hooks)
574
        self.assertTrue("post_commit" in hooks, "post_commit not in %s" % hooks)
2659.3.1 by NamNguyen
``Branch.hooks`` now supports ``pre_commit`` hook.
575
        self.assertTrue("pre_commit" in hooks, "pre_commit not in %s" % hooks)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
576
        self.assertTrue("post_pull" in hooks, "post_pull not in %s" % hooks)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
577
        self.assertTrue("post_uncommit" in hooks,
578
                        "post_uncommit not in %s" % hooks)
3331.1.4 by James Henstridge
Adjust my tests to pass with Ian's API.
579
        self.assertTrue("post_change_branch_tip" in hooks,
580
                        "post_change_branch_tip not in %s" % hooks)
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
581
        self.assertTrue("post_branch_init" in hooks,
582
                        "post_branch_init not in %s" % hooks)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
583
        self.assertTrue("post_switch" in hooks,
584
                        "post_switch not in %s" % hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
585
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
586
    def test_installed_hooks_are_BranchHooks(self):
587
        """The installed hooks object should be a BranchHooks."""
588
        # the installed hooks are saved in self._preserved_hooks.
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
589
        self.assertIsInstance(self._preserved_hooks[_mod_branch.Branch][1],
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
590
                              _mod_branch.BranchHooks)
2245.1.3 by Robert Collins
Add install_hook to the BranchHooks class as the official means for installing a hook.
591
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
592
    def test_post_branch_init_hook(self):
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
593
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
594
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
595
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
596
        self.assertLength(0, calls)
597
        branch = self.make_branch('a')
598
        self.assertLength(1, calls)
599
        params = calls[0]
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
600
        self.assertIsInstance(params, _mod_branch.BranchInitHookParams)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
601
        self.assertTrue(hasattr(params, 'bzrdir'))
602
        self.assertTrue(hasattr(params, 'branch'))
603
5050.21.1 by Andrew Bennetts
Remove broken and apparently unused code path from BranchInitHookParams.__repr__.
604
    def test_post_branch_init_hook_repr(self):
605
        param_reprs = []
606
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
607
            lambda params: param_reprs.append(repr(params)), None)
608
        branch = self.make_branch('a')
609
        self.assertLength(1, param_reprs)
610
        param_repr = param_reprs[0]
611
        self.assertStartsWith(param_repr, '<BranchInitHookParams of ')
612
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
613
    def test_post_switch_hook(self):
614
        from bzrlib import switch
615
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
616
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
617
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
618
        tree = self.make_branch_and_tree('branch-1')
619
        self.build_tree(['branch-1/file-1'])
620
        tree.add('file-1')
621
        tree.commit('rev1')
622
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
623
        self.build_tree(['branch-1/file-2'])
624
        tree.add('file-2')
625
        tree.remove('file-1')
626
        tree.commit('rev2')
627
        checkout = tree.branch.create_checkout('checkout')
628
        self.assertLength(0, calls)
629
        switch.switch(checkout.bzrdir, to_branch)
630
        self.assertLength(1, calls)
631
        params = calls[0]
632
        self.assertIsInstance(params, _mod_branch.SwitchHookParams)
633
        self.assertTrue(hasattr(params, 'to_branch'))
634
        self.assertTrue(hasattr(params, 'revision_id'))
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
635
5176.1.1 by Vincent Ladeuil
Warn if a config variable can't be interpreted as a boolean
636
637
class TestBranchOptions(tests.TestCaseWithTransport):
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
638
4989.2.5 by Vincent Ladeuil
Clarify tests.
639
    def setUp(self):
640
        super(TestBranchOptions, self).setUp()
641
        self.branch = self.make_branch('.')
6372.4.1 by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks.
642
        self.config_stack = self.branch.get_config_stack()
4989.2.5 by Vincent Ladeuil
Clarify tests.
643
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
644
    def check_append_revisions_only(self, expected_value, value=None):
645
        """Set append_revisions_only in config and check its interpretation."""
4989.2.5 by Vincent Ladeuil
Clarify tests.
646
        if value is not None:
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
647
            self.config_stack.set('append_revisions_only', value)
4989.2.5 by Vincent Ladeuil
Clarify tests.
648
        self.assertEqual(expected_value,
6123.9.11 by Jelmer Vernooij
Make get_append_revisions_only public.
649
                         self.branch.get_append_revisions_only())
4989.2.5 by Vincent Ladeuil
Clarify tests.
650
651
    def test_valid_append_revisions_only(self):
652
        self.assertEquals(None,
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
653
                          self.config_stack.get('append_revisions_only'))
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
654
        self.check_append_revisions_only(None)
655
        self.check_append_revisions_only(False, 'False')
656
        self.check_append_revisions_only(True, 'True')
4989.2.13 by Vincent Ladeuil
append_revisions_only accept all valid booleans, update doc to
657
        # The following values will cause compatibility problems on projects
658
        # using older bzr versions (<2.2) but are accepted
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
659
        self.check_append_revisions_only(False, 'false')
660
        self.check_append_revisions_only(True, 'true')
4989.2.5 by Vincent Ladeuil
Clarify tests.
661
662
    def test_invalid_append_revisions_only(self):
4989.2.9 by Brian de Alwis
Revert append_revisions_only to only allow 'True' and 'False' to
663
        """Ensure warning is noted on invalid settings"""
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
664
        self.warnings = []
665
        def warning(*args):
666
            self.warnings.append(args[0] % args[1:])
667
        self.overrideAttr(trace, 'warning', warning)
668
        self.check_append_revisions_only(None, 'not-a-bool')
669
        self.assertLength(1, self.warnings)
670
        self.assertEqual(
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
671
            'Value "not-a-bool" is not valid for "append_revisions_only"',
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
672
            self.warnings[0])
4989.2.5 by Vincent Ladeuil
Clarify tests.
673
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
674
    def test_use_fresh_values(self):
675
        copy = _mod_branch.Branch.open(self.branch.base)
676
        copy.lock_write()
677
        try:
678
            copy.get_config_stack().set('foo', 'bar')
679
        finally:
680
            copy.unlock()
681
        self.assertFalse(self.branch.is_locked())
6480.1.2 by Aaron Bentley
Updates from review.
682
        result = self.branch.get_config_stack().get('foo')
6480.1.3 by Aaron Bentley
Mention bugs in comments.
683
        # Bug: https://bugs.launchpad.net/bzr/+bug/948339
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
684
        self.expectFailure('Unlocked branches cache their configs',
6480.1.2 by Aaron Bentley
Updates from review.
685
            self.assertEqual, 'bar', result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
686
687
    def test_set_from_config_get_from_config_stack(self):
688
        self.branch.lock_write()
689
        self.addCleanup(self.branch.unlock)
690
        self.branch.get_config().set_user_option('foo', 'bar')
6480.1.2 by Aaron Bentley
Updates from review.
691
        result = self.branch.get_config_stack().get('foo')
6480.1.3 by Aaron Bentley
Mention bugs in comments.
692
        # https://bugs.launchpad.net/bzr/+bug/948344
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
693
        self.expectFailure('BranchStack uses cache after set_user_option',
6480.1.2 by Aaron Bentley
Updates from review.
694
                           self.assertEqual, 'bar', result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
695
696
    def test_set_from_config_stack_get_from_config(self):
697
        self.branch.lock_write()
698
        self.addCleanup(self.branch.unlock)
699
        self.branch.get_config_stack().set('foo', 'bar')
700
        self.assertEqual('bar',
701
                         self.branch.get_config().get_user_option('foo'))
702
703
    def test_set_delays_write(self):
704
        self.branch.lock_write()
705
        self.addCleanup(self.branch.unlock)
706
        self.branch.get_config_stack().set('foo', 'bar')
707
        copy = _mod_branch.Branch.open(self.branch.base)
6480.1.2 by Aaron Bentley
Updates from review.
708
        result = copy.get_config_stack().get('foo')
6480.1.3 by Aaron Bentley
Mention bugs in comments.
709
        # Bug: https://bugs.launchpad.net/bzr/+bug/948339
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
710
        self.expectFailure("Config writes are not cached.", self.assertIs,
6480.1.2 by Aaron Bentley
Updates from review.
711
                           None, result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
712
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
713
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
714
class TestPullResult(tests.TestCase):
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
715
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
716
    def test_report_changed(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
717
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
718
        r.old_revid = "old-revid"
719
        r.old_revno = 10
720
        r.new_revid = "new-revid"
721
        r.new_revno = 20
722
        f = StringIO()
723
        r.report(f)
724
        self.assertEqual("Now on revision 20.\n", f.getvalue())
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
725
        self.assertEqual("Now on revision 20.\n", f.getvalue())
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
726
727
    def test_report_unchanged(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
728
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
729
        r.old_revid = "same-revid"
730
        r.new_revid = "same-revid"
731
        f = StringIO()
732
        r.report(f)
6112.4.7 by Jelmer Vernooij
Fix tests.
733
        self.assertEqual("No revisions or tags to pull.\n", f.getvalue())