/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
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
343
    def do_checkout_test(self, lightweight=False):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
344
        tree = self.make_branch_and_tree('source',
345
            format=self.get_format_name_subtree())
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
346
        subtree = self.make_branch_and_tree('source/subtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
347
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
348
        subsubtree = self.make_branch_and_tree('source/subtree/subsubtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
349
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
350
        self.build_tree(['source/subtree/file',
351
                         'source/subtree/subsubtree/file'])
352
        subsubtree.add('file')
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
353
        subtree.add('file')
2100.3.25 by Aaron Bentley
add subsubtree to test
354
        subtree.add_reference(subsubtree)
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
355
        tree.add_reference(subtree)
356
        tree.commit('a revision')
2100.3.23 by Aaron Bentley
Nested checkouts kinda work
357
        subtree.commit('a subtree file')
2100.3.25 by Aaron Bentley
add subsubtree to test
358
        subsubtree.commit('a subsubtree file')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
359
        tree.branch.create_checkout('target', lightweight=lightweight)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
360
        self.assertPathExists('target')
361
        self.assertPathExists('target/subtree')
362
        self.assertPathExists('target/subtree/file')
363
        self.assertPathExists('target/subtree/subsubtree/file')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
364
        subbranch = _mod_branch.Branch.open('target/subtree/subsubtree')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
365
        if lightweight:
366
            self.assertEndsWith(subbranch.base, 'source/subtree/subsubtree/')
367
        else:
368
            self.assertEndsWith(subbranch.base, 'target/subtree/subsubtree/')
369
370
    def test_checkout_with_references(self):
371
        self.do_checkout_test()
372
373
    def test_light_checkout_with_references(self):
374
        self.do_checkout_test(lightweight=True)
2230.3.51 by Aaron Bentley
Store revno for Branch6, set_last_revision -> set_last_revision_info
375
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
376
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
377
class TestBranch6(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
378
379
    def get_class(self):
380
        return _mod_branch.BzrBranch6
381
382
    def get_format_name(self):
383
        return "dirstate-tags"
384
385
    def get_format_name_subtree(self):
386
        return "dirstate-with-subtree"
387
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
388
    def test_set_stacked_on_url_errors(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
389
        branch = self.make_branch('a', format=self.get_format_name())
390
        self.assertRaises(errors.UnstackableBranchFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
391
            branch.set_stacked_on_url, None)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
392
393
    def test_default_stacked_location(self):
394
        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
395
        self.assertRaises(errors.UnstackableBranchFormat, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
396
397
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
398
class TestBranch7(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
399
400
    def get_class(self):
401
        return _mod_branch.BzrBranch7
402
403
    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)
404
        return "1.9"
3221.11.2 by Robert Collins
Create basic stackable branch facility.
405
406
    def get_format_name_subtree(self):
407
        return "development-subtree"
408
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
409
    def test_set_stacked_on_url_unstackable_repo(self):
3221.11.6 by Robert Collins
Stackable branch fixes.
410
        repo = self.make_repository('a', format='dirstate-tags')
411
        control = repo.bzrdir
412
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
413
        target = self.make_branch('b')
414
        self.assertRaises(errors.UnstackableRepositoryFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
415
            branch.set_stacked_on_url, target.base)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
416
3242.3.21 by Jonathan Lange
Preserve stacking in clone
417
    def test_clone_stacked_on_unstackable_repo(self):
418
        repo = self.make_repository('a', format='dirstate-tags')
419
        control = repo.bzrdir
420
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
421
        # Calling clone should not raise UnstackableRepositoryFormat.
422
        cloned_bzrdir = control.clone('cloned')
423
3221.11.2 by Robert Collins
Create basic stackable branch facility.
424
    def _test_default_stacked_location(self):
425
        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
426
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
427
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
428
    def test_stack_and_unstack(self):
429
        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.
430
        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
431
        branch.set_stacked_on_url(target.branch.base)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
432
        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.
433
        revid = target.commit('foo')
434
        self.assertTrue(branch.repository.has_revision(revid))
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
435
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
436
        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.
437
        self.assertFalse(branch.repository.has_revision(revid))
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
438
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
439
    def test_open_opens_stacked_reference(self):
440
        branch = self.make_branch('a', format=self.get_format_name())
441
        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
442
        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.
443
        branch = branch.bzrdir.open_branch()
444
        revid = target.commit('foo')
445
        self.assertTrue(branch.repository.has_revision(revid))
446
3221.11.2 by Robert Collins
Create basic stackable branch facility.
447
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
448
class BzrBranch8(tests.TestCaseWithTransport):
4273.1.15 by Aaron Bentley
Add reference_info caching.
449
450
    def make_branch(self, location, format=None):
451
        if format is None:
6472.2.1 by Jelmer Vernooij
Use bzrdir.controldir for generic access to control directories.
452
            format = controldir.format_registry.make_bzrdir('1.9')
4273.1.15 by Aaron Bentley
Add reference_info caching.
453
            format.set_branch_format(_mod_branch.BzrBranchFormat8())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
454
        return tests.TestCaseWithTransport.make_branch(
455
            self, location, format=format)
4273.1.15 by Aaron Bentley
Add reference_info caching.
456
457
    def create_branch_with_reference(self):
458
        branch = self.make_branch('branch')
459
        branch._set_all_reference_info({'file-id': ('path', 'location')})
460
        return branch
461
462
    @staticmethod
463
    def instrument_branch(branch, gets):
464
        old_get = branch._transport.get
465
        def get(*args, **kwargs):
466
            gets.append((args, kwargs))
467
            return old_get(*args, **kwargs)
468
        branch._transport.get = get
469
470
    def test_reference_info_caching_read_locked(self):
471
        gets = []
472
        branch = self.create_branch_with_reference()
473
        branch.lock_read()
474
        self.addCleanup(branch.unlock)
475
        self.instrument_branch(branch, gets)
476
        branch.get_reference_info('file-id')
477
        branch.get_reference_info('file-id')
478
        self.assertEqual(1, len(gets))
479
480
    def test_reference_info_caching_read_unlocked(self):
481
        gets = []
482
        branch = self.create_branch_with_reference()
483
        self.instrument_branch(branch, gets)
484
        branch.get_reference_info('file-id')
485
        branch.get_reference_info('file-id')
486
        self.assertEqual(2, len(gets))
487
488
    def test_reference_info_caching_write_locked(self):
489
        gets = []
490
        branch = self.make_branch('branch')
491
        branch.lock_write()
492
        self.instrument_branch(branch, gets)
493
        self.addCleanup(branch.unlock)
494
        branch._set_all_reference_info({'file-id': ('path2', 'location2')})
495
        path, location = branch.get_reference_info('file-id')
496
        self.assertEqual(0, len(gets))
497
        self.assertEqual('path2', path)
498
        self.assertEqual('location2', location)
499
500
    def test_reference_info_caches_cleared(self):
501
        branch = self.make_branch('branch')
502
        branch.lock_write()
503
        branch.set_reference_info('file-id', 'path2', 'location2')
504
        branch.unlock()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
505
        doppelganger = _mod_branch.Branch.open('branch')
4273.1.15 by Aaron Bentley
Add reference_info caching.
506
        doppelganger.set_reference_info('file-id', 'path3', 'location3')
507
        self.assertEqual(('path3', 'location3'),
508
                         branch.get_reference_info('file-id'))
509
6165.4.11 by Jelmer Vernooij
More test fixes.
510
    def _recordParentMapCalls(self, repo):
511
        self._parent_map_calls = []
512
        orig_get_parent_map = repo.revisions.get_parent_map
513
        def get_parent_map(q):
514
            q = list(q)
515
            self._parent_map_calls.extend([e[0] for e in q])
516
            return orig_get_parent_map(q)
517
        repo.revisions.get_parent_map = get_parent_map
518
519
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
520
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.
521
    """Tests for the branch reference facility."""
522
523
    def test_create_open_reference(self):
524
        bzrdirformat = bzrdir.BzrDirMetaFormat1()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
525
        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.
526
        t.mkdir('repo')
527
        dir = bzrdirformat.initialize(self.get_url('repo'))
528
        dir.create_repository()
529
        target_branch = dir.create_branch()
530
        t.mkdir('branch')
531
        branch_dir = bzrdirformat.initialize(self.get_url('branch'))
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
532
        made_branch = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
533
            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.
534
        self.assertEqual(made_branch.base, target_branch.base)
535
        opened_branch = branch_dir.open_branch()
536
        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.
537
538
    def test_get_reference(self):
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
539
        """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.
540
        branch = self.make_branch('target')
541
        checkout = branch.create_checkout('checkout', lightweight=True)
542
        reference_url = branch.bzrdir.root_transport.abspath('') + '/'
543
        # if the api for create_checkout changes to return different checkout types
544
        # then this file read will fail.
545
        self.assertFileEqual(reference_url, 'checkout/.bzr/branch/location')
546
        self.assertEqual(reference_url,
2018.5.97 by Andrew Bennetts
Fix more tests.
547
            _mod_branch.BranchReferenceFormat().get_reference(checkout.bzrdir))
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
548
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
549
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
550
class TestHooks(tests.TestCaseWithTransport):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
551
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.
552
    def test_constructor(self):
553
        """Check that creating a BranchHooks instance has the right defaults."""
5622.3.15 by Jelmer Vernooij
Fix branch hooks constructor test.
554
        hooks = _mod_branch.BranchHooks()
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
555
        self.assertTrue("post_push" in hooks, "post_push not in %s" % hooks)
556
        self.assertTrue("post_commit" in hooks, "post_commit not in %s" % hooks)
2659.3.1 by NamNguyen
``Branch.hooks`` now supports ``pre_commit`` hook.
557
        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
558
        self.assertTrue("post_pull" in hooks, "post_pull not in %s" % hooks)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
559
        self.assertTrue("post_uncommit" in hooks,
560
                        "post_uncommit not in %s" % hooks)
3331.1.4 by James Henstridge
Adjust my tests to pass with Ian's API.
561
        self.assertTrue("post_change_branch_tip" in hooks,
562
                        "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,
563
        self.assertTrue("post_branch_init" in hooks,
564
                        "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',
565
        self.assertTrue("post_switch" in hooks,
566
                        "post_switch not in %s" % hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
567
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.
568
    def test_installed_hooks_are_BranchHooks(self):
569
        """The installed hooks object should be a BranchHooks."""
570
        # the installed hooks are saved in self._preserved_hooks.
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
571
        self.assertIsInstance(self._preserved_hooks[_mod_branch.Branch][1],
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
572
                              _mod_branch.BranchHooks)
2245.1.3 by Robert Collins
Add install_hook to the BranchHooks class as the official means for installing a hook.
573
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
574
    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',
575
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
576
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
577
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
578
        self.assertLength(0, calls)
579
        branch = self.make_branch('a')
580
        self.assertLength(1, calls)
581
        params = calls[0]
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
582
        self.assertIsInstance(params, _mod_branch.BranchInitHookParams)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
583
        self.assertTrue(hasattr(params, 'bzrdir'))
584
        self.assertTrue(hasattr(params, 'branch'))
585
5050.21.1 by Andrew Bennetts
Remove broken and apparently unused code path from BranchInitHookParams.__repr__.
586
    def test_post_branch_init_hook_repr(self):
587
        param_reprs = []
588
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
589
            lambda params: param_reprs.append(repr(params)), None)
590
        branch = self.make_branch('a')
591
        self.assertLength(1, param_reprs)
592
        param_repr = param_reprs[0]
593
        self.assertStartsWith(param_repr, '<BranchInitHookParams of ')
594
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
595
    def test_post_switch_hook(self):
596
        from bzrlib import switch
597
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
598
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
599
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
600
        tree = self.make_branch_and_tree('branch-1')
601
        self.build_tree(['branch-1/file-1'])
602
        tree.add('file-1')
603
        tree.commit('rev1')
604
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
605
        self.build_tree(['branch-1/file-2'])
606
        tree.add('file-2')
607
        tree.remove('file-1')
608
        tree.commit('rev2')
609
        checkout = tree.branch.create_checkout('checkout')
610
        self.assertLength(0, calls)
611
        switch.switch(checkout.bzrdir, to_branch)
612
        self.assertLength(1, calls)
613
        params = calls[0]
614
        self.assertIsInstance(params, _mod_branch.SwitchHookParams)
615
        self.assertTrue(hasattr(params, 'to_branch'))
616
        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()
617
5176.1.1 by Vincent Ladeuil
Warn if a config variable can't be interpreted as a boolean
618
619
class TestBranchOptions(tests.TestCaseWithTransport):
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
620
4989.2.5 by Vincent Ladeuil
Clarify tests.
621
    def setUp(self):
622
        super(TestBranchOptions, self).setUp()
623
        self.branch = self.make_branch('.')
6372.4.1 by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks.
624
        self.config_stack = self.branch.get_config_stack()
4989.2.5 by Vincent Ladeuil
Clarify tests.
625
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
626
    def check_append_revisions_only(self, expected_value, value=None):
627
        """Set append_revisions_only in config and check its interpretation."""
4989.2.5 by Vincent Ladeuil
Clarify tests.
628
        if value is not None:
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
629
            self.config_stack.set('append_revisions_only', value)
4989.2.5 by Vincent Ladeuil
Clarify tests.
630
        self.assertEqual(expected_value,
6123.9.11 by Jelmer Vernooij
Make get_append_revisions_only public.
631
                         self.branch.get_append_revisions_only())
4989.2.5 by Vincent Ladeuil
Clarify tests.
632
633
    def test_valid_append_revisions_only(self):
634
        self.assertEquals(None,
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
635
                          self.config_stack.get('append_revisions_only'))
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
636
        self.check_append_revisions_only(None)
637
        self.check_append_revisions_only(False, 'False')
638
        self.check_append_revisions_only(True, 'True')
4989.2.13 by Vincent Ladeuil
append_revisions_only accept all valid booleans, update doc to
639
        # The following values will cause compatibility problems on projects
640
        # using older bzr versions (<2.2) but are accepted
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
641
        self.check_append_revisions_only(False, 'false')
642
        self.check_append_revisions_only(True, 'true')
4989.2.5 by Vincent Ladeuil
Clarify tests.
643
644
    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
645
        """Ensure warning is noted on invalid settings"""
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
646
        self.warnings = []
647
        def warning(*args):
648
            self.warnings.append(args[0] % args[1:])
649
        self.overrideAttr(trace, 'warning', warning)
650
        self.check_append_revisions_only(None, 'not-a-bool')
651
        self.assertLength(1, self.warnings)
652
        self.assertEqual(
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
653
            'Value "not-a-bool" is not valid for "append_revisions_only"',
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
654
            self.warnings[0])
4989.2.5 by Vincent Ladeuil
Clarify tests.
655
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
656
    def test_use_fresh_values(self):
657
        copy = _mod_branch.Branch.open(self.branch.base)
658
        copy.lock_write()
659
        try:
660
            copy.get_config_stack().set('foo', 'bar')
661
        finally:
662
            copy.unlock()
663
        self.assertFalse(self.branch.is_locked())
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
664
        # Since the branch is locked, the option value won't be saved on disk
665
        # so trying to access the config of locked branch via another older
666
        # non-locked branch object pointing to the same branch is not supported
667
        self.assertEqual(None, self.branch.get_config_stack().get('foo'))
668
        # Using a newly created branch object works as expected
669
        fresh = _mod_branch.Branch.open(self.branch.base)
670
        self.assertEqual('bar', fresh.get_config_stack().get('foo'))
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
671
672
    def test_set_from_config_get_from_config_stack(self):
673
        self.branch.lock_write()
674
        self.addCleanup(self.branch.unlock)
675
        self.branch.get_config().set_user_option('foo', 'bar')
6480.1.2 by Aaron Bentley
Updates from review.
676
        result = self.branch.get_config_stack().get('foo')
6480.1.3 by Aaron Bentley
Mention bugs in comments.
677
        # https://bugs.launchpad.net/bzr/+bug/948344
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
678
        self.expectFailure('BranchStack uses cache after set_user_option',
6480.1.2 by Aaron Bentley
Updates from review.
679
                           self.assertEqual, 'bar', result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
680
681
    def test_set_from_config_stack_get_from_config(self):
682
        self.branch.lock_write()
683
        self.addCleanup(self.branch.unlock)
684
        self.branch.get_config_stack().set('foo', 'bar')
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
685
        # Since the branch is locked, the option value won't be saved on disk
686
        # so mixing get() and get_user_option() is broken by design.
687
        self.assertEqual(None,
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
688
                         self.branch.get_config().get_user_option('foo'))
689
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
690
    def test_set_delays_write_when_branch_is_locked(self):
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
691
        self.branch.lock_write()
692
        self.addCleanup(self.branch.unlock)
693
        self.branch.get_config_stack().set('foo', 'bar')
694
        copy = _mod_branch.Branch.open(self.branch.base)
6480.1.2 by Aaron Bentley
Updates from review.
695
        result = copy.get_config_stack().get('foo')
6499.2.1 by Vincent Ladeuil
Save branch config options only during the final unlock
696
        # Accessing from a different branch object is like accessing from a
697
        # different process: the option has not been saved yet and the new
698
        # value cannot be seen.
699
        self.assertIs(None, result)
6480.1.1 by Aaron Bentley
Add tests of ConfigStack caching and interoperation.
700
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
701
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
702
class TestPullResult(tests.TestCase):
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
703
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
704
    def test_report_changed(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
705
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
706
        r.old_revid = "old-revid"
707
        r.old_revno = 10
708
        r.new_revid = "new-revid"
709
        r.new_revno = 20
710
        f = StringIO()
711
        r.report(f)
712
        self.assertEqual("Now on revision 20.\n", f.getvalue())
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
713
        self.assertEqual("Now on revision 20.\n", f.getvalue())
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
714
715
    def test_report_unchanged(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
716
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
717
        r.old_revid = "same-revid"
718
        r.new_revid = "same-revid"
719
        f = StringIO()
720
        r.report(f)
6112.4.7 by Jelmer Vernooij
Fix tests.
721
        self.assertEqual("No revisions or tags to pull.\n", f.getvalue())