/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
1
# Copyright (C) 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
905 by Martin Pool
- merge aaron's append_multiple.patch
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
905 by Martin Pool
- merge aaron's append_multiple.patch
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
905 by Martin Pool
- merge aaron's append_multiple.patch
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
17
"""Tests for branch implementations - tests a branch format."""
18
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
19
import os
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
20
import sys
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
21
1878.1.3 by John Arbash Meinel
some test cleanups
22
from bzrlib import (
23
    branch,
24
    bzrdir,
25
    errors,
26
    gpg,
27
    urlutils,
28
    transactions,
29
    repository,
30
    )
1534.4.2 by Robert Collins
Introduce BranchFormats - factoring out intialisation of Branches.
31
from bzrlib.branch import Branch, needs_read_lock, needs_write_lock
1770.3.3 by Jelmer Vernooij
Add tests for Branch.get_revision_delta() and Repository.get_revision_delta().
32
from bzrlib.delta import TreeDelta
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
33
from bzrlib.errors import (FileExists,
34
                           NoSuchRevision,
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
35
                           NoSuchFile,
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
36
                           UninitializableFormat,
37
                           NotBranchError,
38
                           )
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
39
from bzrlib.osutils import getcwd
1836.3.1 by Robert Collins
(robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.
40
import bzrlib.revision
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
41
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
42
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
43
from bzrlib.tests.HttpServer import HttpServer
1260 by Martin Pool
- some updates for fetch/update function
44
from bzrlib.trace import mutter
1534.4.4 by Robert Collins
Make BzrBranchFormat.find_format take a transport not a url for efficiency.
45
from bzrlib.transport import get_transport
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
46
from bzrlib.transport.memory import MemoryServer
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
47
from bzrlib.upgrade import upgrade
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
48
from bzrlib.workingtree import WorkingTree
1092.2.25 by Robert Collins
support ghosts in commits
49
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
50
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
51
class TestCaseWithBranch(TestCaseWithBzrDir):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
52
53
    def setUp(self):
54
        super(TestCaseWithBranch, self).setUp()
55
        self.branch = None
56
57
    def get_branch(self):
58
        if self.branch is None:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
59
            self.branch = self.make_branch('')
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
60
        return self.branch
61
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
62
    def make_branch(self, relpath, format=None):
63
        repo = self.make_repository(relpath, format=format)
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.
64
        # fixme RBC 20060210 this isnt necessarily a fixable thing,
65
        # Skipped is the wrong exception to raise.
66
        try:
67
            return self.branch_format.initialize(repo.bzrdir)
68
        except errors.UninitializableFormat:
69
            raise TestSkipped('Uninitializable branch format')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
70
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
71
    def make_repository(self, relpath, shared=False, format=None):
72
        made_control = self.make_bzrdir(relpath, format=format)
73
        return made_control.create_repository(shared=shared)
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
74
75
76
class TestBranch(TestCaseWithBranch):
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
77
1102 by Martin Pool
- merge test refactoring from robertc
78
    def test_append_revisions(self):
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
79
        """Test appending more than one revision"""
2230.3.2 by Aaron Bentley
Get all branch tests passing
80
        wt = self.make_branch_and_tree('tree')
81
        wt.commit('f', rev_id='rev1')
82
        wt.commit('f', rev_id='rev2')
83
        wt.commit('f', rev_id='rev3')
84
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
85
        br = self.get_branch()
2230.3.2 by Aaron Bentley
Get all branch tests passing
86
        br.fetch(wt.branch)
905 by Martin Pool
- merge aaron's append_multiple.patch
87
        br.append_revision("rev1")
88
        self.assertEquals(br.revision_history(), ["rev1",])
89
        br.append_revision("rev2", "rev3")
90
        self.assertEquals(br.revision_history(), ["rev1", "rev2", "rev3"])
2229.2.1 by Aaron Bentley
Reject reserved ids in versiondfile, tree, branch and repository
91
        self.assertRaises(errors.ReservedId, br.append_revision, 'current:')
1110 by Martin Pool
- merge aaron's merge improvements:
92
2249.5.6 by John Arbash Meinel
Make sure Branch.revision_history() also works in utf-8 revision ids.
93
    def test_revision_ids_are_utf8(self):
2249.5.17 by John Arbash Meinel
[merge] bzr.dev 2293 and resolve conflicts, but still broken
94
        wt = self.make_branch_and_tree('tree')
95
        wt.commit('f', rev_id='rev1')
96
        wt.commit('f', rev_id='rev2')
97
        wt.commit('f', rev_id='rev3')
98
2249.5.6 by John Arbash Meinel
Make sure Branch.revision_history() also works in utf-8 revision ids.
99
        br = self.get_branch()
2249.5.17 by John Arbash Meinel
[merge] bzr.dev 2293 and resolve conflicts, but still broken
100
        br.fetch(wt.branch)
2249.5.6 by John Arbash Meinel
Make sure Branch.revision_history() also works in utf-8 revision ids.
101
        br.set_revision_history(['rev1', 'rev2', 'rev3'])
102
        rh = br.revision_history()
103
        self.assertEqual(['rev1', 'rev2', 'rev3'], rh)
104
        for revision_id in rh:
105
            self.assertIsInstance(revision_id, str)
106
        last = br.last_revision()
107
        self.assertEqual('rev3', last)
108
        self.assertIsInstance(last, str)
2249.5.19 by John Arbash Meinel
Track through the new Branch6 code, and make sure revision ids are utf8
109
        revno, last = br.last_revision_info()
110
        self.assertEqual(3, revno)
111
        self.assertEqual('rev3', last)
112
        self.assertIsInstance(last, str)
2249.5.6 by John Arbash Meinel
Make sure Branch.revision_history() also works in utf-8 revision ids.
113
1260 by Martin Pool
- some updates for fetch/update function
114
    def test_fetch_revisions(self):
115
        """Test fetch-revision operation."""
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.
116
        wt = self.make_branch_and_tree('b1')
117
        b1 = wt.branch
2381.1.3 by Robert Collins
Review feedback.
118
        self.build_tree_contents([('b1/foo', 'hello')])
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
119
        wt.add(['foo'], ['foo-id'])
120
        wt.commit('lala!', rev_id='revision-1', allow_pointless=False)
1260 by Martin Pool
- some updates for fetch/update function
121
2381.1.3 by Robert Collins
Review feedback.
122
        b2 = self.make_branch('b2')
1534.1.32 by Robert Collins
Deprecate direct use of fetch.Fetcher.
123
        self.assertEqual((1, []), b2.fetch(b1))
1260 by Martin Pool
- some updates for fetch/update function
124
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
125
        rev = b2.repository.get_revision('revision-1')
126
        tree = b2.repository.revision_tree('revision-1')
1534.1.32 by Robert Collins
Deprecate direct use of fetch.Fetcher.
127
        self.assertEqual(tree.get_file_text('foo-id'), 'hello')
1260 by Martin Pool
- some updates for fetch/update function
128
1770.3.3 by Jelmer Vernooij
Add tests for Branch.get_revision_delta() and Repository.get_revision_delta().
129
    def test_get_revision_delta(self):
130
        tree_a = self.make_branch_and_tree('a')
2381.1.3 by Robert Collins
Review feedback.
131
        self.build_tree(['a/foo'])
1770.3.3 by Jelmer Vernooij
Add tests for Branch.get_revision_delta() and Repository.get_revision_delta().
132
        tree_a.add('foo', 'file1')
133
        tree_a.commit('rev1', rev_id='rev1')
2381.1.3 by Robert Collins
Review feedback.
134
        self.build_tree(['a/vla'])
1770.3.3 by Jelmer Vernooij
Add tests for Branch.get_revision_delta() and Repository.get_revision_delta().
135
        tree_a.add('vla', 'file2')
136
        tree_a.commit('rev2', rev_id='rev2')
137
138
        delta = tree_a.branch.get_revision_delta(1)
139
        self.assertIsInstance(delta, TreeDelta)
140
        self.assertEqual([('foo', 'file1', 'file')], delta.added)
141
        delta = tree_a.branch.get_revision_delta(2)
142
        self.assertIsInstance(delta, TreeDelta)
143
        self.assertEqual([('vla', 'file2', 'file')], delta.added)
144
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
145
    def get_unbalanced_tree_pair(self):
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
146
        """Return two branches, a and b, with one file in a."""
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.
147
        tree_a = self.make_branch_and_tree('a')
2381.1.3 by Robert Collins
Review feedback.
148
        self.build_tree_contents([('a/b', 'b')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
149
        tree_a.add('b')
150
        tree_a.commit("silly commit", rev_id='A')
151
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.
152
        tree_b = self.make_branch_and_tree('b')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
153
        return tree_a, tree_b
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
154
155
    def get_balanced_branch_pair(self):
156
        """Returns br_a, br_b as with one commit in a, and b has a's stores."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
157
        tree_a, tree_b = self.get_unbalanced_tree_pair()
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.
158
        tree_b.branch.repository.fetch(tree_a.branch.repository)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
159
        return tree_a, tree_b
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
160
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
161
    def test_clone_partial(self):
1393.1.23 by Martin Pool
- fix cloning of part of a branch
162
        """Copy only part of the history of a 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.
163
        # TODO: RBC 20060208 test with a revision not on revision-history.
164
        #       what should that behaviour be ? Emailed the list.
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
165
        # First, make a branch with two commits.
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.
166
        wt_a = self.make_branch_and_tree('a')
2381.1.3 by Robert Collins
Review feedback.
167
        self.build_tree(['a/one'])
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.
168
        wt_a.add(['one'])
169
        wt_a.commit('commit one', rev_id='1')
2381.1.3 by Robert Collins
Review feedback.
170
        self.build_tree(['a/two'])
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.
171
        wt_a.add(['two'])
172
        wt_a.commit('commit two', rev_id='2')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
173
        # Now make a copy of the repository.
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.
174
        repo_b = self.make_repository('b')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
175
        wt_a.branch.repository.copy_content_into(repo_b)
176
        # wt_a might be a lightweight checkout, so get a hold of the actual
177
        # branch (because you can't do a partial clone of a lightweight
178
        # checkout).
179
        branch = wt_a.branch.bzrdir.open_branch()
180
        # Then make a branch where the new repository is, but specify a revision
181
        # ID.  The new branch's history will stop at the specified revision.
182
        br_b = branch.clone(repo_b.bzrdir, revision_id='1')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
183
        self.assertEqual('1', br_b.last_revision())
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.
184
185
    def test_sprout_partial(self):
186
        # test sprouting with a prefix of the revision-history.
187
        # also needs not-on-revision-history behaviour defined.
188
        wt_a = self.make_branch_and_tree('a')
2381.1.3 by Robert Collins
Review feedback.
189
        self.build_tree(['a/one'])
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.
190
        wt_a.add(['one'])
191
        wt_a.commit('commit one', rev_id='1')
2381.1.3 by Robert Collins
Review feedback.
192
        self.build_tree(['a/two'])
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.
193
        wt_a.add(['two'])
194
        wt_a.commit('commit two', rev_id='2')
195
        repo_b = self.make_repository('b')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
196
        repo_a = wt_a.branch.repository
197
        repo_a.copy_content_into(repo_b)
198
        br_b = wt_a.branch.sprout(repo_b.bzrdir, revision_id='1')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
199
        self.assertEqual('1', br_b.last_revision())
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.
200
1864.7.2 by John Arbash Meinel
Test that we copy the parent across properly (if it is available)
201
    def get_parented_branch(self):
202
        wt_a = self.make_branch_and_tree('a')
2381.1.3 by Robert Collins
Review feedback.
203
        self.build_tree(['a/one'])
1864.7.2 by John Arbash Meinel
Test that we copy the parent across properly (if it is available)
204
        wt_a.add(['one'])
205
        wt_a.commit('commit one', rev_id='1')
206
207
        branch_b = wt_a.bzrdir.sprout('b', revision_id='1').open_branch()
208
        self.assertEqual(wt_a.branch.base, branch_b.get_parent())
209
        return branch_b
210
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.
211
    def test_clone_branch_nickname(self):
212
        # test the nick name is preserved always
213
        raise TestSkipped('XXX branch cloning is not yet tested..')
214
215
    def test_clone_branch_parent(self):
216
        # test the parent is preserved always
1864.7.2 by John Arbash Meinel
Test that we copy the parent across properly (if it is available)
217
        branch_b = self.get_parented_branch()
218
        repo_c = self.make_repository('c')
219
        branch_b.repository.copy_content_into(repo_c)
220
        branch_c = branch_b.clone(repo_c.bzrdir)
221
        self.assertNotEqual(None, branch_c.get_parent())
222
        self.assertEqual(branch_b.get_parent(), branch_c.get_parent())
223
224
        # We can also set a specific parent, and it should be honored
225
        random_parent = 'http://bazaar-vcs.org/path/to/branch'
226
        branch_b.set_parent(random_parent)
227
        repo_d = self.make_repository('d')
228
        branch_b.repository.copy_content_into(repo_d)
229
        branch_d = branch_b.clone(repo_d.bzrdir)
230
        self.assertEqual(random_parent, branch_d.get_parent())
231
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.
232
    def test_sprout_branch_nickname(self):
233
        # test the nick name is reset always
234
        raise TestSkipped('XXX branch sprouting is not yet tested..')
235
236
    def test_sprout_branch_parent(self):
237
        source = self.make_branch('source')
238
        target = source.bzrdir.sprout(self.get_url('target')).open_branch()
239
        self.assertEqual(source.bzrdir.root_transport.base, target.get_parent())
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
240
241
    def test_submit_branch(self):
242
        """Submit location can be queried and set"""
243
        branch = self.make_branch('branch')
244
        self.assertEqual(branch.get_submit_branch(), None)
245
        branch.set_submit_branch('sftp://example.com')
246
        self.assertEqual(branch.get_submit_branch(), 'sftp://example.com')
247
        branch.set_submit_branch('sftp://example.net')
248
        self.assertEqual(branch.get_submit_branch(), 'sftp://example.net')
1393.1.23 by Martin Pool
- fix cloning of part of a branch
249
        
1551.12.44 by Aaron Bentley
Add (set|get)_public_branch
250
    def test_public_branch(self):
251
        """public location can be queried and set"""
252
        branch = self.make_branch('branch')
253
        self.assertEqual(branch.get_public_branch(), None)
254
        branch.set_public_branch('sftp://example.com')
255
        self.assertEqual(branch.get_public_branch(), 'sftp://example.com')
256
        branch.set_public_branch('sftp://example.net')
257
        self.assertEqual(branch.get_public_branch(), 'sftp://example.net')
258
        branch.set_public_branch(None)
259
        self.assertEqual(branch.get_public_branch(), None)
260
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
261
    def test_record_initial_ghost(self):
262
        """Branches should support having ghosts."""
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.
263
        wt = self.make_branch_and_tree('.')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
264
        wt.set_parent_ids(['non:existent@rev--ision--0--2'],
265
            allow_leftmost_as_ghost=True)
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
266
        rev_id = wt.commit('commit against a ghost first parent.')
267
        rev = wt.branch.repository.get_revision(rev_id)
268
        self.assertEqual(rev.parent_ids, ['non:existent@rev--ision--0--2'])
1092.2.25 by Robert Collins
support ghosts in commits
269
        # parent_sha1s is not populated now, WTF. rbc 20051003
270
        self.assertEqual(len(rev.parent_sha1s), 0)
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
271
272
    def test_record_two_ghosts(self):
273
        """Recording with all ghosts works."""
274
        wt = self.make_branch_and_tree('.')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
275
        wt.set_parent_ids([
276
                'foo@azkhazan-123123-abcabc',
277
                'wibble@fofof--20050401--1928390812',
278
            ],
279
            allow_leftmost_as_ghost=True)
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
280
        rev_id = wt.commit("commit from ghost base with one merge")
281
        # the revision should have been committed with two parents
282
        rev = wt.branch.repository.get_revision(rev_id)
283
        self.assertEqual(['foo@azkhazan-123123-abcabc',
284
            'wibble@fofof--20050401--1928390812'],
285
            rev.parent_ids)
1092.2.25 by Robert Collins
support ghosts in commits
286
1185.12.90 by Aaron Bentley
Fixed InvalidRevisionID handling in Branch.get_revision_xml
287
    def test_bad_revision(self):
1534.4.28 by Robert Collins
first cut at merge from integration.
288
        self.assertRaises(errors.InvalidRevisionId,
289
                          self.get_branch().repository.get_revision,
290
                          None)
1185.12.90 by Aaron Bentley
Fixed InvalidRevisionID handling in Branch.get_revision_xml
291
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
292
# TODO 20051003 RBC:
1092.2.25 by Robert Collins
support ghosts in commits
293
# compare the gpg-to-sign info for a commit with a ghost and 
294
#     an identical tree without a ghost
295
# fetch missing should rewrite the TOC of weaves to list newly available parents.
1393.1.9 by Martin Pool
- tidy up test assertion
296
        
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
297
    def test_sign_existing_revision(self):
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.
298
        wt = self.make_branch_and_tree('.')
299
        branch = wt.branch
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
300
        wt.commit("base", allow_pointless=True, rev_id='A')
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
301
        from bzrlib.testament import Testament
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
302
        strategy = gpg.LoopbackGPGStrategy(None)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
303
        branch.repository.sign_revision('A', strategy)
1551.12.36 by Aaron Bentley
Fix failing tests
304
        self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
305
                         Testament.from_revision(branch.repository,
306
                         'A').as_short_text() +
1551.12.52 by Aaron Bentley
speling fix
307
                         '-----END PSEUDO-SIGNED CONTENT-----\n',
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
308
                         branch.repository.get_signature_text('A'))
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
309
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
310
    def test_store_signature(self):
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
311
        wt = self.make_branch_and_tree('.')
312
        branch = wt.branch
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
313
        branch.repository.store_revision_signature(
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
314
            gpg.LoopbackGPGStrategy(None), 'FOO', 'A')
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
315
        self.assertRaises(errors.NoSuchRevision,
316
                          branch.repository.has_signature_for_revision_id,
317
                          'A')
318
        wt.commit("base", allow_pointless=True, rev_id='A')
1551.12.36 by Aaron Bentley
Fix failing tests
319
        self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
1551.12.52 by Aaron Bentley
speling fix
320
                         'FOO-----END PSEUDO-SIGNED CONTENT-----\n',
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
321
                         branch.repository.get_signature_text('A'))
1469 by Robert Collins
Change Transport.* to work with URL's.
322
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
323
    def test_branch_keeps_signatures(self):
324
        wt = self.make_branch_and_tree('source')
325
        wt.commit('A', allow_pointless=True, rev_id='A')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
326
        repo = wt.branch.repository
327
        repo.sign_revision('A', gpg.LoopbackGPGStrategy(None))
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
328
        #FIXME: clone should work to urls,
329
        # wt.clone should work to disks.
330
        self.build_tree(['target/'])
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
331
        d2 = repo.bzrdir.clone(urlutils.local_path_to_url('target'))
332
        self.assertEqual(repo.get_signature_text('A'),
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
333
                         d2.open_repository().get_signature_text('A'))
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
334
1185.35.11 by Aaron Bentley
Added support for branch nicks
335
    def test_nicks(self):
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
336
        """Test explicit and implicit branch nicknames.
337
        
338
        Nicknames are implicitly the name of the branch's directory, unless an
339
        explicit nickname is set.  That is, an explicit nickname always
340
        overrides the implicit one.
341
        """
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
342
        t = get_transport(self.get_url())
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
343
        branch = self.make_branch('bzr.dev')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
344
        # The nick will be 'bzr.dev', because there is no explicit nick set.
1185.35.11 by Aaron Bentley
Added support for branch nicks
345
        self.assertEqual(branch.nick, 'bzr.dev')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
346
        # Move the branch to a different directory, 'bzr.ab'.  Now that branch
347
        # will report its nick as 'bzr.ab'.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
348
        t.move('bzr.dev', 'bzr.ab')
349
        branch = Branch.open(self.get_url('bzr.ab'))
1185.35.11 by Aaron Bentley
Added support for branch nicks
350
        self.assertEqual(branch.nick, 'bzr.ab')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
351
        # Set the branch nick explicitly.  This will ensure there's a branch
352
        # config file in the branch.
353
        branch.nick = "Aaron's branch"
354
        branch.nick = "Aaron's branch"
355
        try:
356
            controlfilename = branch.control_files.controlfilename
357
        except AttributeError:
358
            # remote branches don't have control_files
359
            pass
360
        else:
361
            self.failUnless(
362
                t.has(t.relpath(controlfilename("branch.conf"))))
363
        # Because the nick has been set explicitly, the nick is now always
364
        # "Aaron's branch", regardless of directory name.
1185.35.11 by Aaron Bentley
Added support for branch nicks
365
        self.assertEqual(branch.nick, "Aaron's branch")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
366
        t.move('bzr.ab', 'integration')
367
        branch = Branch.open(self.get_url('integration'))
1185.35.11 by Aaron Bentley
Added support for branch nicks
368
        self.assertEqual(branch.nick, "Aaron's branch")
1185.35.12 by Aaron Bentley
Got writes of existing tree configs working.
369
        branch.nick = u"\u1234"
370
        self.assertEqual(branch.nick, u"\u1234")
1185.35.11 by Aaron Bentley
Added support for branch nicks
371
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
372
    def test_commit_nicks(self):
373
        """Nicknames are committed to the revision"""
374
        wt = self.make_branch_and_tree('bzr.dev')
375
        branch = wt.branch
376
        branch.nick = "My happy branch"
377
        wt.commit('My commit respect da nick.')
378
        committed = branch.repository.get_revision(branch.last_revision())
379
        self.assertEqual(committed.properties["branch-nick"],
380
                         "My happy branch")
381
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
382
    def test_create_open_branch_uses_repository(self):
383
        try:
384
            repo = self.make_repository('.', shared=True)
385
        except errors.IncompatibleFormat:
386
            return
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
387
        child_transport = repo.bzrdir.root_transport.clone('child')
388
        child_transport.mkdir('.')
389
        child_dir = self.bzrdir_format.initialize_on_transport(child_transport)
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
390
        try:
391
            child_branch = self.branch_format.initialize(child_dir)
392
        except errors.UninitializableFormat:
393
            # branch references are not default init'able.
394
            return
395
        self.assertEqual(repo.bzrdir.root_transport.base,
396
                         child_branch.repository.bzrdir.root_transport.base)
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
397
        child_branch = branch.Branch.open(self.get_url('child'))
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
398
        self.assertEqual(repo.bzrdir.root_transport.base,
399
                         child_branch.repository.bzrdir.root_transport.base)
400
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
401
    def test_format_description(self):
402
        tree = self.make_branch_and_tree('tree')
403
        text = tree.branch._format.get_format_description()
404
        self.failUnless(len(text))
405
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
406
    def test_check_branch_report_results(self):
407
        """Checking a branch produces results which can be printed"""
408
        branch = self.make_branch('.')
409
        result = branch.check()
410
        # reports results through logging
411
        result.report_results(verbose=True)
412
        result.report_results(verbose=False)
413
1740.3.1 by Jelmer Vernooij
Introduce and use CommitBuilder objects.
414
    def test_get_commit_builder(self):
415
        self.assertIsInstance(self.make_branch(".").get_commit_builder([]), 
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
416
            repository.CommitBuilder)
1740.3.1 by Jelmer Vernooij
Introduce and use CommitBuilder objects.
417
1792.1.1 by Robert Collins
Factor out revision-history synthesis to make it reusable as Branch.generate_revision_history.
418
    def test_generate_revision_history(self):
419
        """Create a fake revision history easily."""
420
        tree = self.make_branch_and_tree('.')
421
        rev1 = tree.commit('foo')
422
        orig_history = tree.branch.revision_history()
423
        rev2 = tree.commit('bar', allow_pointless=True)
424
        tree.branch.generate_revision_history(rev1)
425
        self.assertEqual(orig_history, tree.branch.revision_history())
426
1836.3.1 by Robert Collins
(robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.
427
    def test_generate_revision_history_NULL_REVISION(self):
428
        tree = self.make_branch_and_tree('.')
429
        rev1 = tree.commit('foo')
430
        tree.branch.generate_revision_history(bzrlib.revision.NULL_REVISION)
431
        self.assertEqual([], tree.branch.revision_history())
432
1551.8.6 by Aaron Bentley
Rename test
433
    def test_create_checkout(self):
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
434
        tree_a = self.make_branch_and_tree('a')
435
        branch_a = tree_a.branch
1551.8.5 by Aaron Bentley
Change name to create_checkout
436
        checkout_b = branch_a.create_checkout('b')
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
437
        self.assertEqual(None, checkout_b.last_revision())
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
438
        checkout_b.commit('rev1', rev_id='rev1')
439
        self.assertEqual('rev1', branch_a.last_revision())
440
        self.assertNotEqual(checkout_b.branch.base, branch_a.base)
441
1551.8.5 by Aaron Bentley
Change name to create_checkout
442
        checkout_c = branch_a.create_checkout('c', lightweight=True)
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
443
        self.assertEqual('rev1', checkout_c.last_revision())
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
444
        checkout_c.commit('rev2', rev_id='rev2')
445
        self.assertEqual('rev2', branch_a.last_revision())
446
        self.assertEqual(checkout_c.branch.base, branch_a.base)
447
448
        os.mkdir('d')
1551.8.5 by Aaron Bentley
Change name to create_checkout
449
        checkout_d = branch_a.create_checkout('d', lightweight=True)
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
450
        self.assertEqual('rev2', checkout_d.last_revision())
1551.8.3 by Aaron Bentley
Make create_checkout_convenience a Branch method
451
        os.mkdir('e')
1551.8.5 by Aaron Bentley
Change name to create_checkout
452
        checkout_e = branch_a.create_checkout('e')
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
453
        self.assertEqual('rev2', checkout_e.last_revision())
1425 by Robert Collins
merge from Aaron - unbreaks open_containing and the fetch progress bar
454
1997.1.4 by Robert Collins
``bzr checkout --lightweight`` now operates on readonly branches as well
455
    def test_create_anonymous_lightweight_checkout(self):
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
456
        """A lightweight checkout from a readonly branch should succeed."""
1997.1.4 by Robert Collins
``bzr checkout --lightweight`` now operates on readonly branches as well
457
        tree_a = self.make_branch_and_tree('a')
458
        rev_id = tree_a.commit('put some content in the branch')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
459
        # open the branch via a readonly transport
460
        source_branch = bzrlib.branch.Branch.open(self.get_readonly_url('a'))
1997.1.4 by Robert Collins
``bzr checkout --lightweight`` now operates on readonly branches as well
461
        # sanity check that the test will be valid
462
        self.assertRaises((errors.LockError, errors.TransportNotPossible),
463
            source_branch.lock_write)
464
        checkout = source_branch.create_checkout('c', lightweight=True)
465
        self.assertEqual(rev_id, checkout.last_revision())
466
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
467
    def test_create_anonymous_heavyweight_checkout(self):
468
        """A regular checkout from a readonly branch should succeed."""
469
        tree_a = self.make_branch_and_tree('a')
470
        rev_id = tree_a.commit('put some content in the branch')
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
471
        # open the branch via a readonly transport
472
        source_branch = bzrlib.branch.Branch.open(self.get_readonly_url('a'))
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
473
        # sanity check that the test will be valid
474
        self.assertRaises((errors.LockError, errors.TransportNotPossible),
475
            source_branch.lock_write)
476
        checkout = source_branch.create_checkout('c')
477
        self.assertEqual(rev_id, checkout.last_revision())
478
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
479
    def test_set_revision_history(self):
480
        tree = self.make_branch_and_tree('a')
481
        tree.commit('a commit', rev_id='rev1')
482
        br = tree.branch
483
        br.set_revision_history(["rev1"])
484
        self.assertEquals(br.revision_history(), ["rev1"])
485
        br.set_revision_history([])
486
        self.assertEquals(br.revision_history(), [])
487
1551.8.4 by Aaron Bentley
Tweak import style
488
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
489
class ChrootedTests(TestCaseWithBranch):
490
    """A support class that provides readonly urls outside the local namespace.
491
492
    This is done by checking if self.transport_server is a MemoryServer. if it
493
    is then we are chrooted already, if it is not then an HttpServer is used
494
    for readonly urls.
495
    """
496
497
    def setUp(self):
498
        super(ChrootedTests, self).setUp()
2381.1.1 by Robert Collins
Split out hpss test fixes which dont depend on new or altered API's.
499
        if not self.vfs_transport_factory == MemoryServer:
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
500
            self.transport_readonly_server = HttpServer
1425 by Robert Collins
merge from Aaron - unbreaks open_containing and the fetch progress bar
501
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
502
    def test_open_containing(self):
503
        self.assertRaises(NotBranchError, Branch.open_containing,
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
504
                          self.get_readonly_url(''))
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
505
        self.assertRaises(NotBranchError, Branch.open_containing,
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
506
                          self.get_readonly_url('g/p/q'))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
507
        branch = self.make_branch('.')
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
508
        branch, relpath = Branch.open_containing(self.get_readonly_url(''))
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
509
        self.assertEqual('', relpath)
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
510
        branch, relpath = Branch.open_containing(self.get_readonly_url('g/p/q'))
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
511
        self.assertEqual('g/p/q', relpath)
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
512
        
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
513
514
class InstrumentedTransaction(object):
515
516
    def finish(self):
517
        self.calls.append('finish')
518
519
    def __init__(self):
520
        self.calls = []
521
522
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
523
class TestDecorator(object):
524
525
    def __init__(self):
526
        self._calls = []
527
528
    def lock_read(self):
529
        self._calls.append('lr')
530
531
    def lock_write(self):
532
        self._calls.append('lw')
533
534
    def unlock(self):
535
        self._calls.append('ul')
536
537
    @needs_read_lock
538
    def do_with_read(self):
539
        return 1
540
541
    @needs_read_lock
542
    def except_with_read(self):
543
        raise RuntimeError
544
545
    @needs_write_lock
546
    def do_with_write(self):
547
        return 2
548
549
    @needs_write_lock
550
    def except_with_write(self):
551
        raise RuntimeError
552
553
554
class TestDecorators(TestCase):
555
556
    def test_needs_read_lock(self):
557
        branch = TestDecorator()
558
        self.assertEqual(1, branch.do_with_read())
559
        self.assertEqual(['lr', 'ul'], branch._calls)
560
561
    def test_excepts_in_read_lock(self):
562
        branch = TestDecorator()
563
        self.assertRaises(RuntimeError, branch.except_with_read)
564
        self.assertEqual(['lr', 'ul'], branch._calls)
565
566
    def test_needs_write_lock(self):
567
        branch = TestDecorator()
568
        self.assertEqual(2, branch.do_with_write())
569
        self.assertEqual(['lw', 'ul'], branch._calls)
570
571
    def test_excepts_in_write_lock(self):
572
        branch = TestDecorator()
573
        self.assertRaises(RuntimeError, branch.except_with_write)
574
        self.assertEqual(['lw', 'ul'], branch._calls)
575
576
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
577
class TestBranchPushLocations(TestCaseWithBranch):
578
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
579
    def test_get_push_location_unset(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
580
        self.assertEqual(None, self.get_branch().get_push_location())
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
581
582
    def test_get_push_location_exact(self):
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
583
        from bzrlib.config import (locations_config_filename,
1185.31.43 by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp
584
                                   ensure_config_dir_exists)
585
        ensure_config_dir_exists()
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
586
        fn = locations_config_filename()
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
587
        print >> open(fn, 'wt'), ("[%s]\n"
588
                                  "push_location=foo" %
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
589
                                  self.get_branch().base[:-1])
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
590
        self.assertEqual("foo", self.get_branch().get_push_location())
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
591
592
    def test_set_push_location(self):
1878.1.3 by John Arbash Meinel
some test cleanups
593
        branch = self.get_branch()
594
        branch.set_push_location('foo')
2230.3.3 by Aaron Bentley
Add more config testing
595
        self.assertEqual('foo', branch.get_push_location())
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
596
597
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
598
class TestFormat(TestCaseWithBranch):
599
    """Tests for the format itself."""
600
601
    def test_format_initialize_find_open(self):
602
        # loopback test to check the current format initializes to itself.
1534.4.7 by Robert Collins
Move downlevel check up to the Branch.open logic, removing it from the Branch constructor and deprecating relax_version_check to the same.
603
        if not self.branch_format.is_supported():
604
            # unsupported formats are not loopback testable
605
            # because the default open will not open them and
606
            # they may not be initializable.
607
            return
608
        # supported formats must be able to init and open
1534.4.12 by Robert Collins
Tweak formats implementation test to exercise readonly and readwrite transports.
609
        t = get_transport(self.get_url())
610
        readonly_t = get_transport(self.get_readonly_url())
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
611
        made_branch = self.make_branch('.')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
612
        self.failUnless(isinstance(made_branch, branch.Branch))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
613
614
        # find it via bzrdir opening:
615
        opened_control = bzrdir.BzrDir.open(readonly_t.base)
616
        direct_opened_branch = opened_control.open_branch()
617
        self.assertEqual(direct_opened_branch.__class__, made_branch.__class__)
618
        self.assertEqual(opened_control, direct_opened_branch.bzrdir)
619
        self.failUnless(isinstance(direct_opened_branch._format,
620
                        self.branch_format.__class__))
621
622
        # find it via Branch.open
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
623
        opened_branch = branch.Branch.open(readonly_t.base)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
624
        self.failUnless(isinstance(opened_branch, made_branch.__class__))
625
        self.assertEqual(made_branch._format.__class__,
626
                         opened_branch._format.__class__)
627
        # if it has a unique id string, can we probe for it ?
628
        try:
629
            self.branch_format.get_format_string()
630
        except NotImplementedError:
631
            return
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
632
        self.assertEqual(self.branch_format,
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
633
                         branch.BranchFormat.find_format(opened_control))
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
634
2230.3.7 by Aaron Bentley
Fix binding return values
635
2230.3.6 by Aaron Bentley
work in progress bind stuff
636
class TestBound(TestCaseWithBranch):
637
638
    def test_bind_unbind(self):
639
        branch = self.make_branch('1')
640
        branch2 = self.make_branch('2')
641
        try:
642
            branch.bind(branch2)
643
        except errors.UpgradeRequired:
644
            raise TestSkipped('Format does not support binding')
2230.3.7 by Aaron Bentley
Fix binding return values
645
        self.assertTrue(branch.unbind())
646
        self.assertFalse(branch.unbind())
2230.3.6 by Aaron Bentley
work in progress bind stuff
647
        self.assertIs(None, branch.get_bound_location())
2230.3.31 by Aaron Bentley
Implement re-binding previously-bound branches
648
649
    def test_old_bound_location(self):
650
        branch = self.make_branch('branch1')
651
        try:
652
            self.assertIs(None, branch.get_old_bound_location())
653
        except errors.UpgradeRequired:
654
            raise TestSkipped('Format does not store old bound locations')
655
        branch2 = self.make_branch('branch2')
656
        branch.bind(branch2)
657
        self.assertIs(None, branch.get_old_bound_location())
658
        branch.unbind()
659
        self.assertContainsRe(branch.get_old_bound_location(), '\/branch2\/$')
2230.3.32 by Aaron Bentley
Implement strict history policy
660
661
662
class TestStrict(TestCaseWithBranch):
663
664
    def test_strict_history(self):
665
        tree1 = self.make_branch_and_tree('tree1')
666
        try:
2230.3.40 by Aaron Bentley
Rename strict_revision_history to append_revisions_only
667
            tree1.branch.set_append_revisions_only(True)
2230.3.32 by Aaron Bentley
Implement strict history policy
668
        except errors.UpgradeRequired:
669
            raise TestSkipped('Format does not support strict history')
670
        tree1.commit('empty commit')
671
        tree2 = tree1.bzrdir.sprout('tree2').open_workingtree()
672
        tree2.commit('empty commit 2')
673
        tree1.pull(tree2.branch)
674
        tree1.commit('empty commit 3')
675
        tree2.commit('empty commit 4')
676
        self.assertRaises(errors.DivergedBranches, tree1.pull, tree2.branch)
677
        tree2.merge_from_branch(tree1.branch)
678
        tree2.commit('empty commit 5')
2230.3.40 by Aaron Bentley
Rename strict_revision_history to append_revisions_only
679
        self.assertRaises(errors.AppendRevisionsOnlyViolation, tree1.pull,
2230.3.32 by Aaron Bentley
Implement strict history policy
680
                          tree2.branch)
681
        tree3 = tree1.bzrdir.sprout('tree3').open_workingtree()
682
        tree3.merge_from_branch(tree2.branch)
683
        tree3.commit('empty commit 6')
684
        tree2.pull(tree3.branch)