/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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
3445.2.1 by John Arbash Meinel
Add tests for Branch.missing_revisions and deprecate it.
406
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
407
class TestBranch6(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
408
409
    def get_class(self):
410
        return _mod_branch.BzrBranch6
411
412
    def get_format_name(self):
413
        return "dirstate-tags"
414
415
    def get_format_name_subtree(self):
416
        return "dirstate-with-subtree"
417
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
418
    def test_set_stacked_on_url_errors(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
419
        branch = self.make_branch('a', format=self.get_format_name())
420
        self.assertRaises(errors.UnstackableBranchFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
421
            branch.set_stacked_on_url, None)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
422
423
    def test_default_stacked_location(self):
424
        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
425
        self.assertRaises(errors.UnstackableBranchFormat, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
426
427
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
428
class TestBranch7(TestBranch67, tests.TestCaseWithTransport):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
429
430
    def get_class(self):
431
        return _mod_branch.BzrBranch7
432
433
    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)
434
        return "1.9"
3221.11.2 by Robert Collins
Create basic stackable branch facility.
435
436
    def get_format_name_subtree(self):
437
        return "development-subtree"
438
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
439
    def test_set_stacked_on_url_unstackable_repo(self):
3221.11.6 by Robert Collins
Stackable branch fixes.
440
        repo = self.make_repository('a', format='dirstate-tags')
441
        control = repo.bzrdir
442
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
443
        target = self.make_branch('b')
444
        self.assertRaises(errors.UnstackableRepositoryFormat,
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
445
            branch.set_stacked_on_url, target.base)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
446
3242.3.21 by Jonathan Lange
Preserve stacking in clone
447
    def test_clone_stacked_on_unstackable_repo(self):
448
        repo = self.make_repository('a', format='dirstate-tags')
449
        control = repo.bzrdir
450
        branch = _mod_branch.BzrBranchFormat7().initialize(control)
451
        # Calling clone should not raise UnstackableRepositoryFormat.
452
        cloned_bzrdir = control.clone('cloned')
453
3221.11.2 by Robert Collins
Create basic stackable branch facility.
454
    def _test_default_stacked_location(self):
455
        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
456
        self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
457
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
458
    def test_stack_and_unstack(self):
459
        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.
460
        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
461
        branch.set_stacked_on_url(target.branch.base)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
462
        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.
463
        revid = target.commit('foo')
464
        self.assertTrue(branch.repository.has_revision(revid))
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
465
        branch.set_stacked_on_url(None)
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
466
        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.
467
        self.assertFalse(branch.repository.has_revision(revid))
3221.11.8 by Robert Collins
Minimally test stacking and unstacking a repository.
468
3221.11.11 by Robert Collins
Ensure opening a stacked branch gives a ready to use repository.
469
    def test_open_opens_stacked_reference(self):
470
        branch = self.make_branch('a', format=self.get_format_name())
471
        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
472
        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.
473
        branch = branch.bzrdir.open_branch()
474
        revid = target.commit('foo')
475
        self.assertTrue(branch.repository.has_revision(revid))
476
3221.11.2 by Robert Collins
Create basic stackable branch facility.
477
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
478
class BzrBranch8(tests.TestCaseWithTransport):
4273.1.15 by Aaron Bentley
Add reference_info caching.
479
480
    def make_branch(self, location, format=None):
481
        if format is None:
482
            format = bzrdir.format_registry.make_bzrdir('1.9')
483
            format.set_branch_format(_mod_branch.BzrBranchFormat8())
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
484
        return tests.TestCaseWithTransport.make_branch(
485
            self, location, format=format)
4273.1.15 by Aaron Bentley
Add reference_info caching.
486
487
    def create_branch_with_reference(self):
488
        branch = self.make_branch('branch')
489
        branch._set_all_reference_info({'file-id': ('path', 'location')})
490
        return branch
491
492
    @staticmethod
493
    def instrument_branch(branch, gets):
494
        old_get = branch._transport.get
495
        def get(*args, **kwargs):
496
            gets.append((args, kwargs))
497
            return old_get(*args, **kwargs)
498
        branch._transport.get = get
499
500
    def test_reference_info_caching_read_locked(self):
501
        gets = []
502
        branch = self.create_branch_with_reference()
503
        branch.lock_read()
504
        self.addCleanup(branch.unlock)
505
        self.instrument_branch(branch, gets)
506
        branch.get_reference_info('file-id')
507
        branch.get_reference_info('file-id')
508
        self.assertEqual(1, len(gets))
509
510
    def test_reference_info_caching_read_unlocked(self):
511
        gets = []
512
        branch = self.create_branch_with_reference()
513
        self.instrument_branch(branch, gets)
514
        branch.get_reference_info('file-id')
515
        branch.get_reference_info('file-id')
516
        self.assertEqual(2, len(gets))
517
518
    def test_reference_info_caching_write_locked(self):
519
        gets = []
520
        branch = self.make_branch('branch')
521
        branch.lock_write()
522
        self.instrument_branch(branch, gets)
523
        self.addCleanup(branch.unlock)
524
        branch._set_all_reference_info({'file-id': ('path2', 'location2')})
525
        path, location = branch.get_reference_info('file-id')
526
        self.assertEqual(0, len(gets))
527
        self.assertEqual('path2', path)
528
        self.assertEqual('location2', location)
529
530
    def test_reference_info_caches_cleared(self):
531
        branch = self.make_branch('branch')
532
        branch.lock_write()
533
        branch.set_reference_info('file-id', 'path2', 'location2')
534
        branch.unlock()
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
535
        doppelganger = _mod_branch.Branch.open('branch')
4273.1.15 by Aaron Bentley
Add reference_info caching.
536
        doppelganger.set_reference_info('file-id', 'path3', 'location3')
537
        self.assertEqual(('path3', 'location3'),
538
                         branch.get_reference_info('file-id'))
539
6165.4.11 by Jelmer Vernooij
More test fixes.
540
    def _recordParentMapCalls(self, repo):
541
        self._parent_map_calls = []
542
        orig_get_parent_map = repo.revisions.get_parent_map
543
        def get_parent_map(q):
544
            q = list(q)
545
            self._parent_map_calls.extend([e[0] for e in q])
546
            return orig_get_parent_map(q)
547
        repo.revisions.get_parent_map = get_parent_map
548
549
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
550
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.
551
    """Tests for the branch reference facility."""
552
553
    def test_create_open_reference(self):
554
        bzrdirformat = bzrdir.BzrDirMetaFormat1()
5609.9.4 by Vincent Ladeuil
Use self.get_transport instead of transport.get_transport where possible.
555
        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.
556
        t.mkdir('repo')
557
        dir = bzrdirformat.initialize(self.get_url('repo'))
558
        dir.create_repository()
559
        target_branch = dir.create_branch()
560
        t.mkdir('branch')
561
        branch_dir = bzrdirformat.initialize(self.get_url('branch'))
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
562
        made_branch = _mod_branch.BranchReferenceFormat().initialize(
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
563
            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.
564
        self.assertEqual(made_branch.base, target_branch.base)
565
        opened_branch = branch_dir.open_branch()
566
        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.
567
568
    def test_get_reference(self):
569
        """For a BranchReference, get_reference should reutrn the location."""
570
        branch = self.make_branch('target')
571
        checkout = branch.create_checkout('checkout', lightweight=True)
572
        reference_url = branch.bzrdir.root_transport.abspath('') + '/'
573
        # if the api for create_checkout changes to return different checkout types
574
        # then this file read will fail.
575
        self.assertFileEqual(reference_url, 'checkout/.bzr/branch/location')
576
        self.assertEqual(reference_url,
2018.5.97 by Andrew Bennetts
Fix more tests.
577
            _mod_branch.BranchReferenceFormat().get_reference(checkout.bzrdir))
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
578
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
579
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
580
class TestHooks(tests.TestCaseWithTransport):
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
581
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.
582
    def test_constructor(self):
583
        """Check that creating a BranchHooks instance has the right defaults."""
5622.3.15 by Jelmer Vernooij
Fix branch hooks constructor test.
584
        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.
585
        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
586
        self.assertTrue("post_push" in hooks, "post_push not in %s" % hooks)
587
        self.assertTrue("post_commit" in hooks, "post_commit not in %s" % hooks)
2659.3.1 by NamNguyen
``Branch.hooks`` now supports ``pre_commit`` hook.
588
        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
589
        self.assertTrue("post_pull" in hooks, "post_pull not in %s" % hooks)
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
590
        self.assertTrue("post_uncommit" in hooks,
591
                        "post_uncommit not in %s" % hooks)
3331.1.4 by James Henstridge
Adjust my tests to pass with Ian's API.
592
        self.assertTrue("post_change_branch_tip" in hooks,
593
                        "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,
594
        self.assertTrue("post_branch_init" in hooks,
595
                        "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',
596
        self.assertTrue("post_switch" in hooks,
597
                        "post_switch not in %s" % hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
598
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.
599
    def test_installed_hooks_are_BranchHooks(self):
600
        """The installed hooks object should be a BranchHooks."""
601
        # the installed hooks are saved in self._preserved_hooks.
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
602
        self.assertIsInstance(self._preserved_hooks[_mod_branch.Branch][1],
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
603
                              _mod_branch.BranchHooks)
2245.1.3 by Robert Collins
Add install_hook to the BranchHooks class as the official means for installing a hook.
604
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
605
    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',
606
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
607
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
608
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
609
        self.assertLength(0, calls)
610
        branch = self.make_branch('a')
611
        self.assertLength(1, calls)
612
        params = calls[0]
5107.3.2 by Marco Pantaleoni
Renamed 'post_branch' hook to 'post_branch_init', for more consistency,
613
        self.assertIsInstance(params, _mod_branch.BranchInitHookParams)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
614
        self.assertTrue(hasattr(params, 'bzrdir'))
615
        self.assertTrue(hasattr(params, 'branch'))
616
5050.21.1 by Andrew Bennetts
Remove broken and apparently unused code path from BranchInitHookParams.__repr__.
617
    def test_post_branch_init_hook_repr(self):
618
        param_reprs = []
619
        _mod_branch.Branch.hooks.install_named_hook('post_branch_init',
620
            lambda params: param_reprs.append(repr(params)), None)
621
        branch = self.make_branch('a')
622
        self.assertLength(1, param_reprs)
623
        param_repr = param_reprs[0]
624
        self.assertStartsWith(param_repr, '<BranchInitHookParams of ')
625
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
626
    def test_post_switch_hook(self):
627
        from bzrlib import switch
628
        calls = []
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
629
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
630
            calls.append, None)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
631
        tree = self.make_branch_and_tree('branch-1')
632
        self.build_tree(['branch-1/file-1'])
633
        tree.add('file-1')
634
        tree.commit('rev1')
635
        to_branch = tree.bzrdir.sprout('branch-2').open_branch()
636
        self.build_tree(['branch-1/file-2'])
637
        tree.add('file-2')
638
        tree.remove('file-1')
639
        tree.commit('rev2')
640
        checkout = tree.branch.create_checkout('checkout')
641
        self.assertLength(0, calls)
642
        switch.switch(checkout.bzrdir, to_branch)
643
        self.assertLength(1, calls)
644
        params = calls[0]
645
        self.assertIsInstance(params, _mod_branch.SwitchHookParams)
646
        self.assertTrue(hasattr(params, 'to_branch'))
647
        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()
648
5176.1.1 by Vincent Ladeuil
Warn if a config variable can't be interpreted as a boolean
649
650
class TestBranchOptions(tests.TestCaseWithTransport):
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
651
4989.2.5 by Vincent Ladeuil
Clarify tests.
652
    def setUp(self):
653
        super(TestBranchOptions, self).setUp()
654
        self.branch = self.make_branch('.')
6372.4.1 by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks.
655
        self.config_stack = self.branch.get_config_stack()
4989.2.5 by Vincent Ladeuil
Clarify tests.
656
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
657
    def check_append_revisions_only(self, expected_value, value=None):
658
        """Set append_revisions_only in config and check its interpretation."""
4989.2.5 by Vincent Ladeuil
Clarify tests.
659
        if value is not None:
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
660
            self.config_stack.set('append_revisions_only', value)
4989.2.5 by Vincent Ladeuil
Clarify tests.
661
        self.assertEqual(expected_value,
6123.9.11 by Jelmer Vernooij
Make get_append_revisions_only public.
662
                         self.branch.get_append_revisions_only())
4989.2.5 by Vincent Ladeuil
Clarify tests.
663
664
    def test_valid_append_revisions_only(self):
665
        self.assertEquals(None,
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
666
                          self.config_stack.get('append_revisions_only'))
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
667
        self.check_append_revisions_only(None)
668
        self.check_append_revisions_only(False, 'False')
669
        self.check_append_revisions_only(True, 'True')
4989.2.13 by Vincent Ladeuil
append_revisions_only accept all valid booleans, update doc to
670
        # The following values will cause compatibility problems on projects
671
        # using older bzr versions (<2.2) but are accepted
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
672
        self.check_append_revisions_only(False, 'false')
673
        self.check_append_revisions_only(True, 'true')
4989.2.5 by Vincent Ladeuil
Clarify tests.
674
675
    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
676
        """Ensure warning is noted on invalid settings"""
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
677
        self.warnings = []
678
        def warning(*args):
679
            self.warnings.append(args[0] % args[1:])
680
        self.overrideAttr(trace, 'warning', warning)
681
        self.check_append_revisions_only(None, 'not-a-bool')
682
        self.assertLength(1, self.warnings)
683
        self.assertEqual(
6372.4.2 by Jelmer Vernooij
Fix remaining tests.
684
            'Value "not-a-bool" is not valid for "append_revisions_only"',
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
685
            self.warnings[0])
4989.2.5 by Vincent Ladeuil
Clarify tests.
686
4989.2.1 by Brian de Alwis
The 'append_revisions_only' option is now case-insensitive,
687
5010.2.1 by Vincent Ladeuil
Fiux test/test_branch.py imports.
688
class TestPullResult(tests.TestCase):
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
689
690
    def test_pull_result_to_int(self):
691
        # 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.
692
        r = _mod_branch.PullResult()
2297.1.3 by Martin Pool
PullResult can pretend to be an int for api compatibility with old .pull()
693
        r.old_revno = 10
694
        r.new_revno = 20
695
        # this usage of results is not recommended for new code (because it
696
        # doesn't describe very well what happened), but for api stability
697
        # it's still supported
5348.1.2 by Martin Pool
Deprecate casting PushResult and PullResult to int to get the relative revno change
698
        self.assertEqual(self.applyDeprecated(
699
            symbol_versioning.deprecated_in((2, 3, 0)),
700
            r.__int__),
701
            10)
3758.1.1 by Andrew Bennetts
Fix #230902 by being more careful not to squash a pre-existing exception when calling foo.unlock()
702
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
703
    def test_report_changed(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
704
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
705
        r.old_revid = "old-revid"
706
        r.old_revno = 10
707
        r.new_revid = "new-revid"
708
        r.new_revno = 20
709
        f = StringIO()
710
        r.report(f)
711
        self.assertEqual("Now on revision 20.\n", f.getvalue())
6349.2.5 by Jelmer Vernooij
Add test for BranchFormatMetadir.from_string.
712
        self.assertEqual("Now on revision 20.\n", f.getvalue())
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
713
714
    def test_report_unchanged(self):
5010.2.26 by Vincent Ladeuil
Fix imports in test_branch.py.
715
        r = _mod_branch.PullResult()
4672.4.1 by Jelmer Vernooij
Add two more tests for PullResult.
716
        r.old_revid = "same-revid"
717
        r.new_revid = "same-revid"
718
        f = StringIO()
719
        r.report(f)
6112.4.7 by Jelmer Vernooij
Fix tests.
720
        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()
721