/brz/remove-bazaar

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