/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
1260 by Martin Pool
- some updates for fetch/update function
43
from bzrlib.trace import mutter
1534.4.4 by Robert Collins
Make BzrBranchFormat.find_format take a transport not a url for efficiency.
44
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.
45
from bzrlib.transport.http import HttpServer
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
1185.16.56 by Martin Pool
doc
51
# TODO: Make a branch using basis branch, and check that it 
52
# doesn't request any files that could have been avoided, by 
53
# hooking into the Transport.
54
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
55
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
56
class TestCaseWithBranch(TestCaseWithBzrDir):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
57
58
    def setUp(self):
59
        super(TestCaseWithBranch, self).setUp()
60
        self.branch = None
61
62
    def get_branch(self):
63
        if self.branch is None:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
64
            self.branch = self.make_branch('')
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
65
        return self.branch
66
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
67
    def make_branch(self, relpath, format=None):
68
        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.
69
        # fixme RBC 20060210 this isnt necessarily a fixable thing,
70
        # Skipped is the wrong exception to raise.
71
        try:
72
            return self.branch_format.initialize(repo.bzrdir)
73
        except errors.UninitializableFormat:
74
            raise TestSkipped('Uninitializable branch format')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
75
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
76
    def make_repository(self, relpath, shared=False, format=None):
77
        made_control = self.make_bzrdir(relpath, format=format)
78
        return made_control.create_repository(shared=shared)
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
79
80
81
class TestBranch(TestCaseWithBranch):
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
82
1102 by Martin Pool
- merge test refactoring from robertc
83
    def test_append_revisions(self):
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
84
        """Test appending more than one revision"""
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
85
        br = self.get_branch()
905 by Martin Pool
- merge aaron's append_multiple.patch
86
        br.append_revision("rev1")
87
        self.assertEquals(br.revision_history(), ["rev1",])
88
        br.append_revision("rev2", "rev3")
89
        self.assertEquals(br.revision_history(), ["rev1", "rev2", "rev3"])
1110 by Martin Pool
- merge aaron's merge improvements:
90
1260 by Martin Pool
- some updates for fetch/update function
91
    def test_fetch_revisions(self):
92
        """Test fetch-revision operation."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
93
        get_transport(self.get_url()).mkdir('b1')
94
        get_transport(self.get_url()).mkdir('b2')
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.
95
        wt = self.make_branch_and_tree('b1')
96
        b1 = wt.branch
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
97
        b2 = self.make_branch('b2')
1185.31.35 by John Arbash Meinel
Couple small fixes, all tests pass on cygwin.
98
        file('b1/foo', 'w').write('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.
99
        wt.add(['foo'], ['foo-id'])
100
        wt.commit('lala!', rev_id='revision-1', allow_pointless=False)
1260 by Martin Pool
- some updates for fetch/update function
101
102
        mutter('start fetch')
1534.1.32 by Robert Collins
Deprecate direct use of fetch.Fetcher.
103
        self.assertEqual((1, []), b2.fetch(b1))
1260 by Martin Pool
- some updates for fetch/update function
104
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
105
        rev = b2.repository.get_revision('revision-1')
106
        tree = b2.repository.revision_tree('revision-1')
1534.1.32 by Robert Collins
Deprecate direct use of fetch.Fetcher.
107
        self.assertEqual(tree.get_file_text('foo-id'), 'hello')
1260 by Martin Pool
- some updates for fetch/update function
108
1770.3.3 by Jelmer Vernooij
Add tests for Branch.get_revision_delta() and Repository.get_revision_delta().
109
    def test_get_revision_delta(self):
110
        tree_a = self.make_branch_and_tree('a')
111
        self.build_tree(['a/foo'])
112
        tree_a.add('foo', 'file1')
113
        tree_a.commit('rev1', rev_id='rev1')
114
        self.build_tree(['a/vla'])
115
        tree_a.add('vla', 'file2')
116
        tree_a.commit('rev2', rev_id='rev2')
117
118
        delta = tree_a.branch.get_revision_delta(1)
119
        self.assertIsInstance(delta, TreeDelta)
120
        self.assertEqual([('foo', 'file1', 'file')], delta.added)
121
        delta = tree_a.branch.get_revision_delta(2)
122
        self.assertIsInstance(delta, TreeDelta)
123
        self.assertEqual([('vla', 'file2', 'file')], delta.added)
124
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
125
    def get_unbalanced_tree_pair(self):
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
126
        """Return two branches, a and b, with one file in a."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
127
        get_transport(self.get_url()).mkdir('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.
128
        tree_a = self.make_branch_and_tree('a')
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
129
        file('a/b', 'wb').write('b')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
130
        tree_a.add('b')
131
        tree_a.commit("silly commit", rev_id='A')
132
133
        get_transport(self.get_url()).mkdir('b')
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.
134
        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.
135
        return tree_a, tree_b
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
136
137
    def get_balanced_branch_pair(self):
138
        """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.
139
        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.
140
        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.
141
        return tree_a, tree_b
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
142
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
143
    def test_clone_branch(self):
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
144
        """Copy the stores from one branch to another"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
145
        tree_a, tree_b = self.get_balanced_branch_pair()
146
        tree_b.commit("silly commit")
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
147
        os.mkdir('c')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
148
        # this fails to test that the history from a was not used.
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.
149
        dir_c = tree_a.bzrdir.clone('c', basis=tree_b.bzrdir)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
150
        self.assertEqual(tree_a.branch.revision_history(),
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.
151
                         dir_c.open_branch().revision_history())
1393.1.23 by Martin Pool
- fix cloning of part of a branch
152
1185.66.8 by Aaron Bentley
Applied Jelmer's patch to make clone a branch operation
153
    def test_clone_partial(self):
1393.1.23 by Martin Pool
- fix cloning of part of a branch
154
        """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.
155
        # TODO: RBC 20060208 test with a revision not on revision-history.
156
        #       what should that behaviour be ? Emailed the list.
157
        wt_a = self.make_branch_and_tree('a')
158
        self.build_tree(['a/one'])
159
        wt_a.add(['one'])
160
        wt_a.commit('commit one', rev_id='1')
161
        self.build_tree(['a/two'])
162
        wt_a.add(['two'])
163
        wt_a.commit('commit two', rev_id='2')
164
        repo_b = self.make_repository('b')
165
        wt_a.bzrdir.open_repository().copy_content_into(repo_b)
166
        br_b = wt_a.bzrdir.open_branch().clone(repo_b.bzrdir, revision_id='1')
167
        self.assertEqual(br_b.last_revision(), '1')
168
169
    def test_sprout_partial(self):
170
        # test sprouting with a prefix of the revision-history.
171
        # also needs not-on-revision-history behaviour defined.
172
        wt_a = self.make_branch_and_tree('a')
173
        self.build_tree(['a/one'])
174
        wt_a.add(['one'])
175
        wt_a.commit('commit one', rev_id='1')
176
        self.build_tree(['a/two'])
177
        wt_a.add(['two'])
178
        wt_a.commit('commit two', rev_id='2')
179
        repo_b = self.make_repository('b')
180
        wt_a.bzrdir.open_repository().copy_content_into(repo_b)
181
        br_b = wt_a.bzrdir.open_branch().sprout(repo_b.bzrdir, revision_id='1')
182
        self.assertEqual(br_b.last_revision(), '1')
183
184
    def test_clone_branch_nickname(self):
185
        # test the nick name is preserved always
186
        raise TestSkipped('XXX branch cloning is not yet tested..')
187
188
    def test_clone_branch_parent(self):
189
        # test the parent is preserved always
190
        raise TestSkipped('XXX branch cloning is not yet tested..')
191
        
192
    def test_sprout_branch_nickname(self):
193
        # test the nick name is reset always
194
        raise TestSkipped('XXX branch sprouting is not yet tested..')
195
196
    def test_sprout_branch_parent(self):
197
        source = self.make_branch('source')
198
        target = source.bzrdir.sprout(self.get_url('target')).open_branch()
199
        self.assertEqual(source.bzrdir.root_transport.base, target.get_parent())
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
200
201
    def test_submit_branch(self):
202
        """Submit location can be queried and set"""
203
        branch = self.make_branch('branch')
204
        self.assertEqual(branch.get_submit_branch(), None)
205
        branch.set_submit_branch('sftp://example.com')
206
        self.assertEqual(branch.get_submit_branch(), 'sftp://example.com')
207
        branch.set_submit_branch('sftp://example.net')
208
        self.assertEqual(branch.get_submit_branch(), 'sftp://example.net')
1393.1.23 by Martin Pool
- fix cloning of part of a branch
209
        
1092.2.25 by Robert Collins
support ghosts in commits
210
    def test_record_initial_ghost_merge(self):
211
        """A pending merge with no revision present is still a merge."""
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.
212
        wt = self.make_branch_and_tree('.')
213
        branch = wt.branch
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.
214
        wt.add_pending_merge('non:existent@rev--ision--0--2')
215
        wt.commit('pretend to merge nonexistent-revision', rev_id='first')
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
216
        rev = branch.repository.get_revision(branch.last_revision())
1092.2.25 by Robert Collins
support ghosts in commits
217
        self.assertEqual(len(rev.parent_ids), 1)
218
        # parent_sha1s is not populated now, WTF. rbc 20051003
219
        self.assertEqual(len(rev.parent_sha1s), 0)
220
        self.assertEqual(rev.parent_ids[0], 'non:existent@rev--ision--0--2')
221
1185.12.90 by Aaron Bentley
Fixed InvalidRevisionID handling in Branch.get_revision_xml
222
    def test_bad_revision(self):
1534.4.28 by Robert Collins
first cut at merge from integration.
223
        self.assertRaises(errors.InvalidRevisionId,
224
                          self.get_branch().repository.get_revision,
225
                          None)
1185.12.90 by Aaron Bentley
Fixed InvalidRevisionID handling in Branch.get_revision_xml
226
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
227
# TODO 20051003 RBC:
1092.2.25 by Robert Collins
support ghosts in commits
228
# compare the gpg-to-sign info for a commit with a ghost and 
229
#     an identical tree without a ghost
230
# fetch missing should rewrite the TOC of weaves to list newly available parents.
1393.1.9 by Martin Pool
- tidy up test assertion
231
        
1092.2.27 by Robert Collins
reenable pending merge tests in testbranch.py
232
    def test_pending_merges(self):
233
        """Tracking pending-merged revisions."""
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.
234
        wt = self.make_branch_and_tree('.')
235
        b = wt.branch
1457.1.14 by Robert Collins
Move pending_merges() to WorkingTree.
236
        self.assertEquals(wt.pending_merges(), [])
1457.1.15 by Robert Collins
Move add_pending_merge to WorkingTree.
237
        wt.add_pending_merge('foo@azkhazan-123123-abcabc')
238
        self.assertEquals(wt.pending_merges(), ['foo@azkhazan-123123-abcabc'])
239
        wt.add_pending_merge('foo@azkhazan-123123-abcabc')
240
        self.assertEquals(wt.pending_merges(), ['foo@azkhazan-123123-abcabc'])
241
        wt.add_pending_merge('wibble@fofof--20050401--1928390812')
1457.1.14 by Robert Collins
Move pending_merges() to WorkingTree.
242
        self.assertEquals(wt.pending_merges(),
1092.2.27 by Robert Collins
reenable pending merge tests in testbranch.py
243
                          ['foo@azkhazan-123123-abcabc',
244
                           'wibble@fofof--20050401--1928390812'])
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.
245
        wt.commit("commit from base with two merges")
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
246
        rev = b.repository.get_revision(b.revision_history()[0])
1092.2.27 by Robert Collins
reenable pending merge tests in testbranch.py
247
        self.assertEquals(len(rev.parent_ids), 2)
248
        self.assertEquals(rev.parent_ids[0],
249
                          'foo@azkhazan-123123-abcabc')
250
        self.assertEquals(rev.parent_ids[1],
251
                           'wibble@fofof--20050401--1928390812')
252
        # list should be cleared when we do a commit
1457.1.14 by Robert Collins
Move pending_merges() to WorkingTree.
253
        self.assertEquals(wt.pending_merges(), [])
1425 by Robert Collins
merge from Aaron - unbreaks open_containing and the fetch progress bar
254
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
255
    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.
256
        wt = self.make_branch_and_tree('.')
257
        branch = wt.branch
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
258
        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
259
        from bzrlib.testament import Testament
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
260
        strategy = gpg.LoopbackGPGStrategy(None)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
261
        branch.repository.sign_revision('A', strategy)
262
        self.assertEqual(Testament.from_revision(branch.repository, 
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
263
                         'A').as_short_text(),
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
264
                         branch.repository.get_signature_text('A'))
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
265
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
266
    def test_store_signature(self):
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
267
        wt = self.make_branch_and_tree('.')
268
        branch = wt.branch
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
269
        branch.repository.store_revision_signature(
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
270
            gpg.LoopbackGPGStrategy(None), 'FOO', 'A')
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
271
        self.assertRaises(errors.NoSuchRevision,
272
                          branch.repository.has_signature_for_revision_id,
273
                          'A')
274
        wt.commit("base", allow_pointless=True, rev_id='A')
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
275
        self.assertEqual('FOO', 
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
276
                         branch.repository.get_signature_text('A'))
1469 by Robert Collins
Change Transport.* to work with URL's.
277
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
278
    def test_branch_keeps_signatures(self):
279
        wt = self.make_branch_and_tree('source')
280
        wt.commit('A', allow_pointless=True, rev_id='A')
281
        wt.branch.repository.sign_revision('A',
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
282
            gpg.LoopbackGPGStrategy(None))
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
283
        #FIXME: clone should work to urls,
284
        # wt.clone should work to disks.
285
        self.build_tree(['target/'])
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.
286
        d2 = wt.bzrdir.clone('target')
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
287
        self.assertEqual(wt.branch.repository.get_signature_text('A'),
288
                         d2.open_repository().get_signature_text('A'))
1534.4.30 by Robert Collins
Test signature preservation on clone and upgrade.
289
1185.35.11 by Aaron Bentley
Added support for branch nicks
290
    def test_nicks(self):
291
        """Branch nicknames"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
292
        t = get_transport(self.get_url())
293
        t.mkdir('bzr.dev')
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
294
        branch = self.make_branch('bzr.dev')
1185.35.11 by Aaron Bentley
Added support for branch nicks
295
        self.assertEqual(branch.nick, 'bzr.dev')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
296
        t.move('bzr.dev', 'bzr.ab')
297
        branch = Branch.open(self.get_url('bzr.ab'))
1185.35.11 by Aaron Bentley
Added support for branch nicks
298
        self.assertEqual(branch.nick, 'bzr.ab')
299
        branch.nick = "Aaron's branch"
1185.35.12 by Aaron Bentley
Got writes of existing tree configs working.
300
        branch.nick = "Aaron's branch"
1534.4.28 by Robert Collins
first cut at merge from integration.
301
        self.failUnless(
302
            t.has(
303
                t.relpath(
304
                    branch.control_files.controlfilename("branch.conf")
305
                    )
306
                )
307
            )
1185.35.11 by Aaron Bentley
Added support for branch nicks
308
        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.
309
        t.move('bzr.ab', 'integration')
310
        branch = Branch.open(self.get_url('integration'))
1185.35.11 by Aaron Bentley
Added support for branch nicks
311
        self.assertEqual(branch.nick, "Aaron's branch")
1185.35.12 by Aaron Bentley
Got writes of existing tree configs working.
312
        branch.nick = u"\u1234"
313
        self.assertEqual(branch.nick, u"\u1234")
1185.35.11 by Aaron Bentley
Added support for branch nicks
314
1185.35.15 by Aaron Bentley
Added branch nicks to revisions
315
    def test_commit_nicks(self):
316
        """Nicknames are committed to the revision"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
317
        get_transport(self.get_url()).mkdir('bzr.dev')
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.
318
        wt = self.make_branch_and_tree('bzr.dev')
319
        branch = wt.branch
1185.35.15 by Aaron Bentley
Added branch nicks to revisions
320
        branch.nick = "My happy 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.
321
        wt.commit('My commit respect da nick.')
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
322
        committed = branch.repository.get_revision(branch.last_revision())
1185.35.15 by Aaron Bentley
Added branch nicks to revisions
323
        self.assertEqual(committed.properties["branch-nick"], 
324
                         "My happy branch")
325
1534.6.4 by Robert Collins
Creating or opening a branch will use the repository if the format supports that.
326
    def test_create_open_branch_uses_repository(self):
327
        try:
328
            repo = self.make_repository('.', shared=True)
329
        except errors.IncompatibleFormat:
330
            return
331
        repo.bzrdir.root_transport.mkdir('child')
332
        child_dir = self.bzrdir_format.initialize('child')
333
        try:
334
            child_branch = self.branch_format.initialize(child_dir)
335
        except errors.UninitializableFormat:
336
            # branch references are not default init'able.
337
            return
338
        self.assertEqual(repo.bzrdir.root_transport.base,
339
                         child_branch.repository.bzrdir.root_transport.base)
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
340
        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.
341
        self.assertEqual(repo.bzrdir.root_transport.base,
342
                         child_branch.repository.bzrdir.root_transport.base)
343
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
344
    def test_format_description(self):
345
        tree = self.make_branch_and_tree('tree')
346
        text = tree.branch._format.get_format_description()
347
        self.failUnless(len(text))
348
1732.2.4 by Martin Pool
Split check into Branch.check and Repository.check
349
    def test_check_branch_report_results(self):
350
        """Checking a branch produces results which can be printed"""
351
        branch = self.make_branch('.')
352
        result = branch.check()
353
        # reports results through logging
354
        result.report_results(verbose=True)
355
        result.report_results(verbose=False)
356
1740.3.1 by Jelmer Vernooij
Introduce and use CommitBuilder objects.
357
    def test_get_commit_builder(self):
358
        self.assertIsInstance(self.make_branch(".").get_commit_builder([]), 
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
359
            repository.CommitBuilder)
1740.3.1 by Jelmer Vernooij
Introduce and use CommitBuilder objects.
360
1792.1.1 by Robert Collins
Factor out revision-history synthesis to make it reusable as Branch.generate_revision_history.
361
    def test_generate_revision_history(self):
362
        """Create a fake revision history easily."""
363
        tree = self.make_branch_and_tree('.')
364
        rev1 = tree.commit('foo')
365
        orig_history = tree.branch.revision_history()
366
        rev2 = tree.commit('bar', allow_pointless=True)
367
        tree.branch.generate_revision_history(rev1)
368
        self.assertEqual(orig_history, tree.branch.revision_history())
369
1836.3.1 by Robert Collins
(robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.
370
    def test_generate_revision_history_NULL_REVISION(self):
371
        tree = self.make_branch_and_tree('.')
372
        rev1 = tree.commit('foo')
373
        tree.branch.generate_revision_history(bzrlib.revision.NULL_REVISION)
374
        self.assertEqual([], tree.branch.revision_history())
375
1425 by Robert Collins
merge from Aaron - unbreaks open_containing and the fetch progress bar
376
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
377
class ChrootedTests(TestCaseWithBranch):
378
    """A support class that provides readonly urls outside the local namespace.
379
380
    This is done by checking if self.transport_server is a MemoryServer. if it
381
    is then we are chrooted already, if it is not then an HttpServer is used
382
    for readonly urls.
383
    """
384
385
    def setUp(self):
386
        super(ChrootedTests, self).setUp()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
387
        if not self.transport_server == MemoryServer:
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
388
            self.transport_readonly_server = HttpServer
1425 by Robert Collins
merge from Aaron - unbreaks open_containing and the fetch progress bar
389
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
390
    def test_open_containing(self):
391
        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.
392
                          self.get_readonly_url(''))
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
393
        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.
394
                          self.get_readonly_url('g/p/q'))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
395
        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.
396
        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).
397
        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.
398
        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).
399
        self.assertEqual('g/p/q', relpath)
1185.12.18 by Aaron Bentley
Fixed error handling when NotBranch on HTTP
400
        
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
401
402
class InstrumentedTransaction(object):
403
404
    def finish(self):
405
        self.calls.append('finish')
406
407
    def __init__(self):
408
        self.calls = []
409
410
1442.1.63 by Robert Collins
Remove self.lock_*...finally: self.unlock() dead chickens from branch.py.
411
class TestDecorator(object):
412
413
    def __init__(self):
414
        self._calls = []
415
416
    def lock_read(self):
417
        self._calls.append('lr')
418
419
    def lock_write(self):
420
        self._calls.append('lw')
421
422
    def unlock(self):
423
        self._calls.append('ul')
424
425
    @needs_read_lock
426
    def do_with_read(self):
427
        return 1
428
429
    @needs_read_lock
430
    def except_with_read(self):
431
        raise RuntimeError
432
433
    @needs_write_lock
434
    def do_with_write(self):
435
        return 2
436
437
    @needs_write_lock
438
    def except_with_write(self):
439
        raise RuntimeError
440
441
442
class TestDecorators(TestCase):
443
444
    def test_needs_read_lock(self):
445
        branch = TestDecorator()
446
        self.assertEqual(1, branch.do_with_read())
447
        self.assertEqual(['lr', 'ul'], branch._calls)
448
449
    def test_excepts_in_read_lock(self):
450
        branch = TestDecorator()
451
        self.assertRaises(RuntimeError, branch.except_with_read)
452
        self.assertEqual(['lr', 'ul'], branch._calls)
453
454
    def test_needs_write_lock(self):
455
        branch = TestDecorator()
456
        self.assertEqual(2, branch.do_with_write())
457
        self.assertEqual(['lw', 'ul'], branch._calls)
458
459
    def test_excepts_in_write_lock(self):
460
        branch = TestDecorator()
461
        self.assertRaises(RuntimeError, branch.except_with_write)
462
        self.assertEqual(['lw', 'ul'], branch._calls)
463
464
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
465
class TestBranchTransaction(TestCaseWithBranch):
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
466
467
    def setUp(self):
468
        super(TestBranchTransaction, self).setUp()
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
469
        self.branch = None
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
470
        
471
    def test_default_get_transaction(self):
472
        """branch.get_transaction on a new branch should give a PassThrough."""
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
473
        self.failUnless(isinstance(self.get_branch().get_transaction(),
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
474
                                   transactions.PassThroughTransaction))
475
476
    def test__set_new_transaction(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
477
        self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
478
479
    def test__set_over_existing_transaction_raises(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
480
        self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
481
        self.assertRaises(errors.LockError,
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
482
                          self.get_branch()._set_transaction,
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
483
                          transactions.ReadOnlyTransaction())
484
485
    def test_finish_no_transaction_raises(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
486
        self.assertRaises(errors.LockError, self.get_branch()._finish_transaction)
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
487
488
    def test_finish_readonly_transaction_works(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
489
        self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
490
        self.get_branch()._finish_transaction()
1534.4.28 by Robert Collins
first cut at merge from integration.
491
        self.assertEqual(None, self.get_branch().control_files._transaction)
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
492
493
    def test_unlock_calls_finish(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
494
        self.get_branch().lock_read()
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
495
        transaction = InstrumentedTransaction()
1534.4.28 by Robert Collins
first cut at merge from integration.
496
        self.get_branch().control_files._transaction = transaction
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
497
        self.get_branch().unlock()
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
498
        self.assertEqual(['finish'], transaction.calls)
499
500
    def test_lock_read_acquires_ro_transaction(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
501
        self.get_branch().lock_read()
502
        self.failUnless(isinstance(self.get_branch().get_transaction(),
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
503
                                   transactions.ReadOnlyTransaction))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
504
        self.get_branch().unlock()
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
505
        
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
506
    def test_lock_write_acquires_write_transaction(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
507
        self.get_branch().lock_write()
1417.1.6 by Robert Collins
introduce transactions for grouping actions done to and with branches
508
        # cannot use get_transaction as its magic
1534.4.28 by Robert Collins
first cut at merge from integration.
509
        self.failUnless(isinstance(self.get_branch().control_files._transaction,
1563.2.35 by Robert Collins
cleanup deprecation warnings and finish conversion so the inventory is knit based too.
510
                                   transactions.WriteTransaction))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
511
        self.get_branch().unlock()
512
513
514
class TestBranchPushLocations(TestCaseWithBranch):
515
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
516
    def test_get_push_location_unset(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
517
        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.
518
519
    def test_get_push_location_exact(self):
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
520
        from bzrlib.config import (locations_config_filename,
1185.31.43 by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp
521
                                   ensure_config_dir_exists)
522
        ensure_config_dir_exists()
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
523
        fn = locations_config_filename()
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
524
        print >> open(fn, 'wt'), ("[%s]\n"
525
                                  "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.
526
                                  self.get_branch().base[:-1])
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
527
        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.
528
529
    def test_set_push_location(self):
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
530
        from bzrlib.config import (locations_config_filename,
1185.31.43 by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp
531
                                   ensure_config_dir_exists)
532
        ensure_config_dir_exists()
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
533
        fn = locations_config_filename()
1878.1.3 by John Arbash Meinel
some test cleanups
534
        branch = self.get_branch()
535
        branch.set_push_location('foo')
536
        local_path = urlutils.local_path_from_url(branch.base[:-1])
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
537
        self.assertFileEqual("[%s]\n"
1878.1.3 by John Arbash Meinel
some test cleanups
538
                             "push_location = foo" % local_path,
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
539
                             fn)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
540
541
    # TODO RBC 20051029 test getting a push location from a branch in a 
542
    # recursive section - that is, it appends the branch name.
1534.4.1 by Robert Collins
Allow parameterisation of the branch initialisation for bzrlib.
543
544
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
545
class TestFormat(TestCaseWithBranch):
546
    """Tests for the format itself."""
547
548
    def test_format_initialize_find_open(self):
549
        # 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.
550
        if not self.branch_format.is_supported():
551
            # unsupported formats are not loopback testable
552
            # because the default open will not open them and
553
            # they may not be initializable.
554
            return
555
        # 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.
556
        t = get_transport(self.get_url())
557
        readonly_t = get_transport(self.get_readonly_url())
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
558
        made_branch = self.make_branch('.')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
559
        self.failUnless(isinstance(made_branch, branch.Branch))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
560
561
        # find it via bzrdir opening:
562
        opened_control = bzrdir.BzrDir.open(readonly_t.base)
563
        direct_opened_branch = opened_control.open_branch()
564
        self.assertEqual(direct_opened_branch.__class__, made_branch.__class__)
565
        self.assertEqual(opened_control, direct_opened_branch.bzrdir)
566
        self.failUnless(isinstance(direct_opened_branch._format,
567
                        self.branch_format.__class__))
568
569
        # find it via Branch.open
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
570
        opened_branch = branch.Branch.open(readonly_t.base)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
571
        self.failUnless(isinstance(opened_branch, made_branch.__class__))
572
        self.assertEqual(made_branch._format.__class__,
573
                         opened_branch._format.__class__)
574
        # if it has a unique id string, can we probe for it ?
575
        try:
576
            self.branch_format.get_format_string()
577
        except NotImplementedError:
578
            return
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
579
        self.assertEqual(self.branch_format,
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
580
                         branch.BranchFormat.find_format(opened_control))
1711.8.1 by John Arbash Meinel
Branch.lock_read/lock_write/unlock should handle failures
581
582