~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
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
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)
6349.2.1 by Jelmer Vernooij
Add BzrDirMetaComponentFormat.
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)
204
        self.assertRaises(ValueError,
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,
6349.2.1 by Jelmer Vernooij
Add BzrDirMetaComponentFormat.
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,
6349.2.1 by Jelmer Vernooij
Add BzrDirMetaComponentFormat.
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
220
    def test_register_unregister_format(self):
5662.2.6 by Jelmer Vernooij
add more tests.
221
        # 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.
222
        format = SampleBranchFormat()
223
        # make a control dir
224
        dir = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
225
        # make a branch
226
        format.initialize(dir)
227
        # register a format for it.
5662.2.6 by Jelmer Vernooij
add more tests.
228
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
229
            _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.
230
        # which branch.Open will refuse (not supported)
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
231
        self.assertRaises(errors.UnsupportedFormatError,
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
232
                          _mod_branch.Branch.open, self.get_url())
2230.3.22 by Aaron Bentley
Make test suite use format registry default, not BzrDir default
233
        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.
234
        # but open_downlevel will work
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
235
        self.assertEqual(
236
            format.open(dir),
237
            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.
238
        # unregister the format
5662.2.6 by Jelmer Vernooij
add more tests.
239
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
240
            _mod_branch.BranchFormat.unregister_format, format)
2230.3.22 by Aaron Bentley
Make test suite use format registry default, not BzrDir default
241
        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.
242
243
5662.2.6 by Jelmer Vernooij
add more tests.
244
class TestBranchFormatRegistry(tests.TestCase):
245
246
    def setUp(self):
247
        super(TestBranchFormatRegistry, self).setUp()
248
        self.registry = _mod_branch.BranchFormatRegistry()
249
250
    def test_default(self):
251
        self.assertIs(None, self.registry.get_default())
252
        format = SampleBranchFormat()
253
        self.registry.set_default(format)
254
        self.assertEquals(format, self.registry.get_default())
255
256
    def test_register_unregister_format(self):
257
        format = SampleBranchFormat()
258
        self.registry.register(format)
259
        self.assertEquals(format,
260
            self.registry.get("Sample branch format."))
261
        self.registry.remove(format)
262
        self.assertRaises(KeyError, self.registry.get,
263
            "Sample branch format.")
264
265
    def test_get_all(self):
266
        format = SampleBranchFormat()
267
        self.assertEquals([], self.registry._get_all())
268
        self.registry.register(format)
269
        self.assertEquals([format], self.registry._get_all())
270
271
    def test_register_extra(self):
272
        format = SampleExtraBranchFormat()
273
        self.assertEquals([], self.registry._get_all())
274
        self.registry.register_extra(format)
275
        self.assertEquals([format], self.registry._get_all())
276
277
    def test_register_extra_lazy(self):
278
        self.assertEquals([], self.registry._get_all())
279
        self.registry.register_extra_lazy("bzrlib.tests.test_branch",
280
            "SampleExtraBranchFormat")
281
        formats = self.registry._get_all()
282
        self.assertEquals(1, len(formats))
283
        self.assertIsInstance(formats[0], SampleExtraBranchFormat)
284
285
5305.1.1 by Robert Collins
``Branch`` formats can now be loaded lazily by registering a
286
#Used by TestMetaDirBranchFormatFactory 
287
FakeLazyFormat = None
288
289
290
class TestMetaDirBranchFormatFactory(tests.TestCase):
291
292
    def test_get_format_string_does_not_load(self):
293
        """Formats have a static format string."""
294
        factory = _mod_branch.MetaDirBranchFormatFactory("yo", None, None)
295
        self.assertEqual("yo", factory.get_format_string())
296
297
    def test_call_loads(self):
298
        # __call__ is used by the network_format_registry interface to get a
299
        # Format.
300
        global FakeLazyFormat
301
        del FakeLazyFormat
302
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
303
            "bzrlib.tests.test_branch", "FakeLazyFormat")
304
        self.assertRaises(AttributeError, factory)
305
306
    def test_call_returns_call_of_referenced_object(self):
307
        global FakeLazyFormat
308
        FakeLazyFormat = lambda:'called'
309
        factory = _mod_branch.MetaDirBranchFormatFactory(None,
310
            "bzrlib.tests.test_branch", "FakeLazyFormat")
311
        self.assertEqual('called', factory())
312
313
3221.11.2 by Robert Collins
Create basic stackable branch facility.
314
class TestBranch67(object):
315
    """Common tests for both branch 6 and 7 which are mostly the same."""
316
317
    def get_format_name(self):
318
        raise NotImplementedError(self.get_format_name)
319
320
    def get_format_name_subtree(self):
321
        raise NotImplementedError(self.get_format_name)
322
323
    def get_class(self):
324
        raise NotImplementedError(self.get_class)
2230.3.1 by Aaron Bentley
Get branch6 creation working
325
326
    def test_creation(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
327
        format = bzrdir.BzrDirMetaFormat1()
2230.3.55 by Aaron Bentley
Updates from review
328
        format.set_branch_format(_mod_branch.BzrBranchFormat6())
2230.3.1 by Aaron Bentley
Get branch6 creation working
329
        branch = self.make_branch('a', format=format)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
330
        self.assertIsInstance(branch, self.get_class())
331
        branch = self.make_branch('b', format=self.get_format_name())
332
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
333
        branch = _mod_branch.Branch.open('a')
3221.11.2 by Robert Collins
Create basic stackable branch facility.
334
        self.assertIsInstance(branch, self.get_class())
2230.3.1 by Aaron Bentley
Get branch6 creation working
335
336
    def test_layout(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
337
        branch = self.make_branch('a', format=self.get_format_name())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
338
        self.assertPathExists('a/.bzr/branch/last-revision')
339
        self.assertPathDoesNotExist('a/.bzr/branch/revision-history')
340
        self.assertPathDoesNotExist('a/.bzr/branch/references')
2230.3.1 by Aaron Bentley
Get branch6 creation working
341
2230.3.3 by Aaron Bentley
Add more config testing
342
    def test_config(self):
343
        """Ensure that all configuration data is stored in the branch"""
3221.11.2 by Robert Collins
Create basic stackable branch facility.
344
        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).
345
        branch.set_parent('http://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
346
        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).
347
        self.assertEqual('http://example.com', branch.get_parent())
348
        branch.set_push_location('sftp://example.com')
2230.3.3 by Aaron Bentley
Add more config testing
349
        config = branch.get_config()._get_branch_data_config()
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
350
        self.assertEqual('sftp://example.com',
2230.3.3 by Aaron Bentley
Add more config testing
351
                         config.get_user_option('push_location'))
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
352
        branch.set_bound_location('ftp://example.com')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
353
        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).
354
        self.assertEqual('ftp://example.com', branch.get_bound_location())
2230.3.3 by Aaron Bentley
Add more config testing
355
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
356
    def test_set_revision_history(self):
3567.4.16 by John Arbash Meinel
Use the new BranchBuilder api in a Branch test
357
        builder = self.make_branch_builder('.', format=self.get_format_name())
358
        builder.build_snapshot('foo', None,
359
            [('add', ('', None, 'directory', None))],
360
            message='foo')
361
        builder.build_snapshot('bar', None, [], message='bar')
362
        branch = builder.get_branch()
363
        branch.lock_write()
364
        self.addCleanup(branch.unlock)
5718.7.4 by Jelmer Vernooij
Branch.set_revision_history.
365
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
366
            branch.set_revision_history, ['foo', 'bar'])
367
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
368
                branch.set_revision_history, ['foo'])
3567.4.16 by John Arbash Meinel
Use the new BranchBuilder api in a Branch test
369
        self.assertRaises(errors.NotLefthandHistory,
5718.7.4 by Jelmer Vernooij
Branch.set_revision_history.
370
            self.applyDeprecated, symbol_versioning.deprecated_in((2, 4, 0)),
371
            branch.set_revision_history, ['bar'])
2230.3.44 by Aaron Bentley
Change asserts to specific errors for left-hand history violations
372
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
373
    def do_checkout_test(self, lightweight=False):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
374
        tree = self.make_branch_and_tree('source',
375
            format=self.get_format_name_subtree())
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
376
        subtree = self.make_branch_and_tree('source/subtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
377
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
378
        subsubtree = self.make_branch_and_tree('source/subtree/subsubtree',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
379
            format=self.get_format_name_subtree())
2100.3.25 by Aaron Bentley
add subsubtree to test
380
        self.build_tree(['source/subtree/file',
381
                         'source/subtree/subsubtree/file'])
382
        subsubtree.add('file')
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
383
        subtree.add('file')
2100.3.25 by Aaron Bentley
add subsubtree to test
384
        subtree.add_reference(subsubtree)
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
385
        tree.add_reference(subtree)
386
        tree.commit('a revision')
2100.3.23 by Aaron Bentley
Nested checkouts kinda work
387
        subtree.commit('a subtree file')
2100.3.25 by Aaron Bentley
add subsubtree to test
388
        subsubtree.commit('a subsubtree file')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
389
        tree.branch.create_checkout('target', lightweight=lightweight)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
390
        self.assertPathExists('target')
391
        self.assertPathExists('target/subtree')
392
        self.assertPathExists('target/subtree/file')
393
        self.assertPathExists('target/subtree/subsubtree/file')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
394
        subbranch = _mod_branch.Branch.open('target/subtree/subsubtree')
2100.3.26 by Aaron Bentley
checkout type is maintained for subtrees
395
        if lightweight:
396
            self.assertEndsWith(subbranch.base, 'source/subtree/subsubtree/')
397
        else:
398
            self.assertEndsWith(subbranch.base, 'target/subtree/subsubtree/')
399
400
    def test_checkout_with_references(self):
401
        self.do_checkout_test()
402
403
    def test_light_checkout_with_references(self):
404
        self.do_checkout_test(lightweight=True)
2230.3.51 by Aaron Bentley
Store revno for Branch6, set_last_revision -> set_last_revision_info
405
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
406
    def test_set_push(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
407
        branch = self.make_branch('source', format=self.get_format_name())
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
408
        branch.get_config().set_user_option('push_location', 'old',
409
            store=config.STORE_LOCATION)
410
        warnings = []
411
        def warning(*args):
412
            warnings.append(args[0] % args[1:])
413
        _warning = trace.warning
414
        trace.warning = warning
415
        try:
416
            branch.set_push_location('new')
417
        finally:
418
            trace.warning = _warning
419
        self.assertEqual(warnings[0], 'Value "new" is masked by "old" from '
420
                         'locations.conf')
421
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
422
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
423
class TestBranch6(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
424
425
    def get_class(self):
426
        return _mod_branch.BzrBranch6
427
428
    def get_format_name(self):
429
        return "dirstate-tags"
430
431
    def get_format_name_subtree(self):
432
        return "dirstate-with-subtree"
433
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
434
    def test_set_stacked_on_url_errors(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
435
        branch = self.make_branch('a', format=self.get_format_name())
436
        self.assertRaises(errors.UnstackableBranchFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
437
            branch.set_stacked_on_url, None)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
438
439
    def test_default_stacked_location(self):
440
        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
441
        self.assertRaises(errors.UnstackableBranchFormat, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
442
443
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
444
class TestBranch7(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
445
446
    def get_class(self):
447
        return _mod_branch.BzrBranch7
448
449
    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)
450
        return "1.9"
3221.11.2 by Robert Collins
Create basic stackable branch facility.
451
452
    def get_format_name_subtree(self):
453
        return "development-subtree"
454
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
455
    def test_set_stacked_on_url_unstackable_repo(self):
3221.11.6 by Robert Collins
Stackable branch fixes.
456
        repo = self.make_repository('a', format='dirstate-tags')
457
        control = repo.bzrdir
458
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
459
        target = self.make_branch('b')
460
        self.assertRaises(errors.UnstackableRepositoryFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
461
            branch.set_stacked_on_url, target.base)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
462
3242.3.21 by Jonathan Lange
Preserve stacking in clone
463
    def test_clone_stacked_on_unstackable_repo(self):
464
        repo = self.make_repository('a', format='dirstate-tags')
465
        control = repo.bzrdir
466
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
467
        # Calling clone should not raise UnstackableRepositoryFormat.
468
        cloned_bzrdir = control.clone('cloned')
469
3221.11.2 by Robert Collins
Create basic stackable branch facility.
470
    def _test_default_stacked_location(self):
471
        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
472
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
473
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
474
    def test_stack_and_unstack(self):
475
        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.
476
        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
477
        branch.set_stacked_on_url(target.branch.base)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
478
        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.
479
        revid = target.commit('foo')
480
        self.assertTrue(branch.repository.has_revision(revid))
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
481
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
482
        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.
483
        self.assertFalse(branch.repository.has_revision(revid))
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
484
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
485
    def test_open_opens_stacked_reference(self):
486
        branch = self.make_branch('a', format=self.get_format_name())
487
        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
488
        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.
489
        branch = branch.bzrdir.open_branch()
490
        revid = target.commit('foo')
491
        self.assertTrue(branch.repository.has_revision(revid))
492
3221.11.2 by Robert Collins
Create basic stackable branch facility.
493
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
494
class BzrBranch8(tests.TestCaseWithTransport):
4273.1.15 by Aaron Bentley
Add reference_info caching.
495
496
    def make_branch(self, location, format=None):
497
        if format is None:
498
            format = bzrdir.format_registry.make_bzrdir('1.9')
499
            format.set_branch_format(_mod_branch.BzrBranchFormat8())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
500
        return tests.TestCaseWithTransport.make_branch(
501
            self, location, format=format)
4273.1.15 by Aaron Bentley
Add reference_info caching.
502
503
    def create_branch_with_reference(self):
504
        branch = self.make_branch('branch')
505
        branch._set_all_reference_info({'file-id': ('path', 'location')})
506
        return branch
507
508
    @staticmethod
509
    def instrument_branch(branch, gets):
510
        old_get = branch._transport.get
511
        def get(*args, **kwargs):
512
            gets.append((args, kwargs))
513
            return old_get(*args, **kwargs)
514
        branch._transport.get = get
515
516
    def test_reference_info_caching_read_locked(self):
517
        gets = []
518
        branch = self.create_branch_with_reference()
519
        branch.lock_read()
520
        self.addCleanup(branch.unlock)
521
        self.instrument_branch(branch, gets)
522
        branch.get_reference_info('file-id')
523
        branch.get_reference_info('file-id')
524
        self.assertEqual(1, len(gets))
525
526
    def test_reference_info_caching_read_unlocked(self):
527
        gets = []
528
        branch = self.create_branch_with_reference()
529
        self.instrument_branch(branch, gets)
530
        branch.get_reference_info('file-id')
531
        branch.get_reference_info('file-id')
532
        self.assertEqual(2, len(gets))
533
534
    def test_reference_info_caching_write_locked(self):
535
        gets = []
536
        branch = self.make_branch('branch')
537
        branch.lock_write()
538
        self.instrument_branch(branch, gets)
539
        self.addCleanup(branch.unlock)
540
        branch._set_all_reference_info({'file-id': ('path2', 'location2')})
541
        path, location = branch.get_reference_info('file-id')
542
        self.assertEqual(0, len(gets))
543
        self.assertEqual('path2', path)
544
        self.assertEqual('location2', location)
545
546
    def test_reference_info_caches_cleared(self):
547
        branch = self.make_branch('branch')
548
        branch.lock_write()
549
        branch.set_reference_info('file-id', 'path2', 'location2')
550
        branch.unlock()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
551
        doppelganger = _mod_branch.Branch.open('branch')
4273.1.15 by Aaron Bentley
Add reference_info caching.
552
        doppelganger.set_reference_info('file-id', 'path3', 'location3')
553
        self.assertEqual(('path3', 'location3'),
554
                         branch.get_reference_info('file-id'))
555
6165.4.11 by Jelmer Vernooij
More test fixes.
556
    def _recordParentMapCalls(self, repo):
557
        self._parent_map_calls = []
558
        orig_get_parent_map = repo.revisions.get_parent_map
559
        def get_parent_map(q):
560
            q = list(q)
561
            self._parent_map_calls.extend([e[0] for e in q])
562
            return orig_get_parent_map(q)
563
        repo.revisions.get_parent_map = get_parent_map
564
565
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
566
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.
567
    """Tests for the branch reference facility."""
568
569
    def test_create_open_reference(self):
570
        bzrdirformat = bzrdir.BzrDirMetaFormat1()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
571
        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.
572
        t.mkdir('repo')
573
        dir = bzrdirformat.initialize(self.get_url('repo'))
574
        dir.create_repository()
575
        target_branch = dir.create_branch()
576
        t.mkdir('branch')
577
        branch_dir = bzrdirformat.initialize(self.get_url('branch'))
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
578
        made_branch = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
579
            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.
580
        self.assertEqual(made_branch.base, target_branch.base)
581
        opened_branch = branch_dir.open_branch()
582
        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.
583
584
    def test_get_reference(self):
585
        """For a BranchReference, get_reference should reutrn the location."""
586
        branch = self.make_branch('target')
587
        checkout = branch.create_checkout('checkout', lightweight=True)
588
        reference_url = branch.bzrdir.root_transport.abspath('') + '/'
589
        # if the api for create_checkout changes to return different checkout types
590
        # then this file read will fail.
591
        self.assertFileEqual(reference_url, 'checkout/.bzr/branch/location')
592
        self.assertEqual(reference_url,
2018.5.97 by Andrew Bennetts
Fix more tests.
593
            _mod_branch.BranchReferenceFormat().get_reference(checkout.bzrdir))
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
594
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
595
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
596
class TestHooks(tests.TestCaseWithTransport):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
597
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.
598
    def test_constructor(self):
599
        """Check that creating a BranchHooks instance has the right defaults."""
5622.3.15 by Jelmer Vernooij
Fix branch hooks constructor test.
600
        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.
601
        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
602
        self.assertTrue("post_push" in hooks, "post_push not in %s" % hooks)
603
        self.assertTrue("post_commit" in hooks, "post_commit not in %s" % hooks)
2659.3.1 by NamNguyen
``Branch.hooks`` now supports ``pre_commit`` hook.
604
        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
605
        self.assertTrue("post_pull" in hooks, "post_pull not in %s" % hooks)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
606
        self.assertTrue("post_uncommit" in hooks,
607
                        "post_uncommit not in %s" % hooks)
3331.1.4 by James Henstridge
Adjust my tests to pass with Ian's API.
608
        self.assertTrue("post_change_branch_tip" in hooks,
609
                        "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,
610
        self.assertTrue("post_branch_init" in hooks,
611
                        "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',
612
        self.assertTrue("post_switch" in hooks,
613
                        "post_switch not in %s" % hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
614
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.
615
    def test_installed_hooks_are_BranchHooks(self):
616
        """The installed hooks object should be a BranchHooks."""
617
        # the installed hooks are saved in self._preserved_hooks.
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
618
        self.assertIsInstance(self._preserved_hooks[_mod_branch.Branch][1],
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
619
                              _mod_branch.BranchHooks)
2245.1.3 by Robert Collins
Add install_hook to the BranchHooks class as the official means for installing a hook.
620
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
621
    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',
622
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
623
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
624
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
625
        self.assertLength(0, calls)
626
        branch = self.make_branch('a')
627
        self.assertLength(1, calls)
628
        params = calls[0]
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
629
        self.assertIsInstance(params, _mod_branch.BranchInitHookParams)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
630
        self.assertTrue(hasattr(params, 'bzrdir'))
631
        self.assertTrue(hasattr(params, 'branch'))
632
5050.21.1 by Andrew Bennetts
Remove broken and apparently unused code path from BranchInitHookParams.__repr__.
633
    def test_post_branch_init_hook_repr(self):
634
        param_reprs = []
635
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
636
            lambda params: param_reprs.append(repr(params)), None)
637
        branch = self.make_branch('a')
638
        self.assertLength(1, param_reprs)
639
        param_repr = param_reprs[0]
640
        self.assertStartsWith(param_repr, '<BranchInitHookParams of ')
641
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
642
    def test_post_switch_hook(self):
643
        from bzrlib import switch
644
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
645
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
646
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
647
        tree = self.make_branch_and_tree('branch-1')
648
        self.build_tree(['branch-1/file-1'])
649
        tree.add('file-1')
650
        tree.commit('rev1')
651
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
652
        self.build_tree(['branch-1/file-2'])
653
        tree.add('file-2')
654
        tree.remove('file-1')
655
        tree.commit('rev2')
656
        checkout = tree.branch.create_checkout('checkout')
657
        self.assertLength(0, calls)
658
        switch.switch(checkout.bzrdir, to_branch)
659
        self.assertLength(1, calls)
660
        params = calls[0]
661
        self.assertIsInstance(params, _mod_branch.SwitchHookParams)
662
        self.assertTrue(hasattr(params, 'to_branch'))
663
        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()
664
5176.1.1 by Vincent Ladeuil
Warn if a config variable can't be interpreted as a boolean
665
666
class TestBranchOptions(tests.TestCaseWithTransport):
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
667
4989.2.5 by Vincent Ladeuil
Clarify tests.
668
    def setUp(self):
669
        super(TestBranchOptions, self).setUp()
670
        self.branch = self.make_branch('.')
671
        self.config = self.branch.get_config()
672
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
673
    def check_append_revisions_only(self, expected_value, value=None):
674
        """Set append_revisions_only in config and check its interpretation."""
4989.2.5 by Vincent Ladeuil
Clarify tests.
675
        if value is not None:
676
            self.config.set_user_option('append_revisions_only', value)
677
        self.assertEqual(expected_value,
6123.9.11 by Jelmer Vernooij
Make get_append_revisions_only public.
678
                         self.branch.get_append_revisions_only())
4989.2.5 by Vincent Ladeuil
Clarify tests.
679
680
    def test_valid_append_revisions_only(self):
681
        self.assertEquals(None,
682
                          self.config.get_user_option('append_revisions_only'))
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
683
        self.check_append_revisions_only(None)
684
        self.check_append_revisions_only(False, 'False')
685
        self.check_append_revisions_only(True, 'True')
4989.2.13 by Vincent Ladeuil
append_revisions_only accept all valid booleans, update doc to
686
        # The following values will cause compatibility problems on projects
687
        # using older bzr versions (<2.2) but are accepted
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
688
        self.check_append_revisions_only(False, 'false')
689
        self.check_append_revisions_only(True, 'true')
4989.2.5 by Vincent Ladeuil
Clarify tests.
690
691
    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
692
        """Ensure warning is noted on invalid settings"""
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
693
        self.warnings = []
694
        def warning(*args):
695
            self.warnings.append(args[0] % args[1:])
696
        self.overrideAttr(trace, 'warning', warning)
697
        self.check_append_revisions_only(None, 'not-a-bool')
698
        self.assertLength(1, self.warnings)
699
        self.assertEqual(
700
            'Value "not-a-bool" is not a boolean for "append_revisions_only"',
701
            self.warnings[0])
4989.2.5 by Vincent Ladeuil
Clarify tests.
702
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
703
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
704
class TestPullResult(tests.TestCase):
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
705
706
    def test_pull_result_to_int(self):
707
        # 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.
708
        r = _mod_branch.PullResult()
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
709
        r.old_revno = 10
710
        r.new_revno = 20
711
        # this usage of results is not recommended for new code (because it
712
        # doesn't describe very well what happened), but for api stability
713
        # it's still supported
5348.1.2 by Martin Pool
Deprecate casting PushResult and PullResult to int to get the relative revno change
714
        self.assertEqual(self.applyDeprecated(
715
            symbol_versioning.deprecated_in((2, 3, 0)),
716
            r.__int__),
717
            10)
3758.1.1 by Andrew Bennetts
Fix #230902 by being more careful not to squash a pre-existing exception when calling foo.unlock()
718
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
719
    def test_report_changed(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
720
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
721
        r.old_revid = "old-revid"
722
        r.old_revno = 10
723
        r.new_revid = "new-revid"
724
        r.new_revno = 20
725
        f = StringIO()
726
        r.report(f)
727
        self.assertEqual("Now on revision 20.\n", f.getvalue())
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
728
        self.assertEqual("Now on revision 20.\n", f.getvalue())
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
729
730
    def test_report_unchanged(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
731
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
732
        r.old_revid = "same-revid"
733
        r.new_revid = "same-revid"
734
        f = StringIO()
735
        r.report(f)
6112.4.7 by Jelmer Vernooij
Fix tests.
736
        self.assertEqual("No revisions or tags to pull.\n", f.getvalue())
3758.1.1 by Andrew Bennetts
Fix #230902 by being more careful not to squash a pre-existing exception when calling foo.unlock()
737