~bzr-pqm/bzr/bzr.dev

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