~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_branch.py

  • Committer: Aaron Bentley
  • Date: 2007-02-06 14:52:16 UTC
  • mfrom: (2266 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2268.
  • Revision ID: abentley@panoramicfeedback.com-20070206145216-fcpi8o3ufvuzwbp9
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2008 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
19
19
 
20
20
import os
21
21
 
22
 
from bzrlib import (branch, bzrdir, errors, repository)
23
 
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
 
22
from bzrlib import branch, bzrdir
 
23
from bzrlib.repository import RepositoryFormatKnit1
24
24
from bzrlib.tests.blackbox import ExternalBase
25
 
from bzrlib.tests import HardlinkFeature
26
 
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
27
25
from bzrlib.workingtree import WorkingTree
28
26
 
29
27
 
30
28
class TestBranch(ExternalBase):
31
29
 
32
 
    def example_branch(self, path='.'):
33
 
        tree = self.make_branch_and_tree(path)
34
 
        self.build_tree_contents([(path + '/hello', 'foo')])
35
 
        tree.add('hello')
36
 
        tree.commit(message='setup')
37
 
        self.build_tree_contents([(path + '/goodbye', 'baz')])
38
 
        tree.add('goodbye')
39
 
        tree.commit(message='setup')
 
30
    def example_branch(test):
 
31
        test.runbzr('init')
 
32
        file('hello', 'wt').write('foo')
 
33
        test.runbzr('add hello')
 
34
        test.runbzr('commit -m setup hello')
 
35
        file('goodbye', 'wt').write('baz')
 
36
        test.runbzr('add goodbye')
 
37
        test.runbzr('commit -m setup goodbye')
40
38
 
41
39
    def test_branch(self):
42
40
        """Branch from one branch to another."""
43
 
        self.example_branch('a')
44
 
        self.run_bzr('branch a b')
 
41
        os.mkdir('a')
 
42
        os.chdir('a')
 
43
        self.example_branch()
 
44
        os.chdir('..')
 
45
        self.runbzr('branch a b')
45
46
        b = branch.Branch.open('b')
46
 
        self.run_bzr('branch a c -r 1')
47
 
        # previously was erroneously created by branching
48
 
        self.assertFalse(b._transport.has('branch-name'))
49
 
        b.bzrdir.open_workingtree().commit(message='foo', allow_pointless=True)
 
47
        self.assertEqual('b\n', b.control_files.get_utf8('branch-name').read())
 
48
        self.runbzr('branch a c -r 1')
 
49
        os.chdir('b')
 
50
        self.runbzr('commit -m foo --unchanged')
 
51
        os.chdir('..')
 
52
 
 
53
    def test_branch_basis(self):
 
54
        # ensure that basis really does grab from the basis by having incomplete source
 
55
        tree = self.make_branch_and_tree('commit_tree')
 
56
        self.build_tree(['foo'], transport=tree.bzrdir.transport.clone('..'))
 
57
        tree.add('foo')
 
58
        tree.commit('revision 1', rev_id='1')
 
59
        source = self.make_branch_and_tree('source')
 
60
        # this gives us an incomplete repository
 
61
        tree.bzrdir.open_repository().copy_content_into(source.branch.repository)
 
62
        tree.commit('revision 2', rev_id='2', allow_pointless=True)
 
63
        tree.bzrdir.open_branch().copy_content_into(source.branch)
 
64
        tree.copy_content_into(source)
 
65
        self.assertFalse(source.branch.repository.has_revision('2'))
 
66
        dir = source.bzrdir
 
67
        self.runbzr('branch source target --basis commit_tree')
 
68
        target = bzrdir.BzrDir.open('target')
 
69
        self.assertEqual('2', target.open_branch().last_revision())
 
70
        self.assertEqual(['2'], target.open_workingtree().get_parent_ids())
 
71
        self.assertTrue(target.open_branch().repository.has_revision('2'))
50
72
 
51
73
    def test_branch_only_copies_history(self):
52
74
        # Knit branches should only push the history for the current revision.
79
101
 
80
102
        # Now that we have a repository with shared files, make sure
81
103
        # that things aren't copied out by a 'branch'
82
 
        self.run_bzr('branch repo/b branch-b')
 
104
        self.run_bzr('branch', 'repo/b', 'branch-b')
83
105
        pushed_tree = WorkingTree.open('branch-b')
84
106
        pushed_repo = pushed_tree.branch.repository
85
107
        self.assertFalse(pushed_repo.has_revision('a-1'))
86
108
        self.assertFalse(pushed_repo.has_revision('a-2'))
87
109
        self.assertTrue(pushed_repo.has_revision('b-1'))
88
110
 
89
 
    def test_branch_hardlink(self):
90
 
        self.requireFeature(HardlinkFeature)
91
 
        source = self.make_branch_and_tree('source')
92
 
        self.build_tree(['source/file1'])
93
 
        source.add('file1')
94
 
        source.commit('added file')
95
 
        self.run_bzr(['branch', 'source', 'target', '--hardlink'])
96
 
        source_stat = os.stat('source/file1')
97
 
        target_stat = os.stat('target/file1')
98
 
        self.assertEqual(source_stat, target_stat)
99
 
 
100
 
class TestBranchStacked(ExternalBase):
101
 
    """Tests for branch --stacked"""
102
 
 
103
 
    def check_shallow_branch(self, branch_revid, stacked_on):
104
 
        """Assert that the branch 'newbranch' has been published correctly.
105
 
        
106
 
        :param stacked_on: url of a branch this one is stacked upon.
107
 
        :param branch_revid: a revision id that should be the only 
108
 
            revision present in the stacked branch, and it should not be in
109
 
            the reference branch.
110
 
        """
111
 
        new_branch = branch.Branch.open('newbranch')
112
 
        # The branch refers to the mainline
113
 
        self.assertEqual(stacked_on, new_branch.get_stacked_on_url())
114
 
        # and the branch's work was pushed
115
 
        self.assertTrue(new_branch.repository.has_revision(branch_revid))
116
 
        # The newly committed revision shoud be present in the stacked branch,
117
 
        # but not in the stacked-on branch.  Because stacking is set up by the
118
 
        # branch object, if we open the stacked branch's repository directly,
119
 
        # bypassing the branch, we see only what's in the stacked repository.
120
 
        stacked_repo = bzrdir.BzrDir.open('newbranch').open_repository()
121
 
        stacked_repo_revisions = set(stacked_repo.all_revision_ids())
122
 
        if len(stacked_repo_revisions) != 1:
123
 
            self.fail("wrong revisions in stacked repository: %r"
124
 
                % (stacked_repo_revisions,))
125
 
 
126
 
    def assertRevisionInRepository(self, repo_path, revid):
127
 
        """Check that a revision is in a repository, disregarding stacking."""
128
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
129
 
        self.assertTrue(repo.has_revision(revid))
130
 
 
131
 
    def assertRevisionNotInRepository(self, repo_path, revid):
132
 
        """Check that a revision is not in a repository, disregarding stacking."""
133
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
134
 
        self.assertFalse(repo.has_revision(revid))
135
 
 
136
 
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
137
 
        repo = branch.Branch.open(branch_path).repository
138
 
        self.assertEqual(set(revid_list),
139
 
            repo.has_revisions(revid_list))
140
 
 
141
 
    def test_branch_stacked_branch_not_stacked(self):
142
 
        """Branching a stacked branch is not stacked by default"""
143
 
        # We have a mainline
144
 
        trunk_tree = self.make_branch_and_tree('target',
145
 
            format='development')
146
 
        trunk_tree.commit('mainline')
147
 
        # and a branch from it which is stacked
148
 
        branch_tree = self.make_branch_and_tree('branch',
149
 
            format='development')
150
 
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
151
 
        # with some work on it
152
 
        branch_tree.commit('moar work plz')
153
 
        # branching our local branch gives us a new stacked branch pointing at
154
 
        # mainline.
155
 
        out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
156
 
        self.assertEqual('', out)
157
 
        self.assertEqual('Branched 1 revision(s).\n',
158
 
            err)
159
 
        # it should have preserved the branch format, and so it should be
160
 
        # capable of supporting stacking, but not actually have a stacked_on
161
 
        # branch configured
162
 
        self.assertRaises(errors.NotStacked,
163
 
            bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
164
 
 
165
 
    def test_branch_stacked_branch_stacked(self):
166
 
        """Asking to stack on a stacked branch does work"""
167
 
        # We have a mainline
168
 
        trunk_tree = self.make_branch_and_tree('target',
169
 
            format='development')
170
 
        trunk_revid = trunk_tree.commit('mainline')
171
 
        # and a branch from it which is stacked
172
 
        branch_tree = self.make_branch_and_tree('branch',
173
 
            format='development')
174
 
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
175
 
        # with some work on it
176
 
        branch_revid = branch_tree.commit('moar work plz')
177
 
        # you can chain branches on from there
178
 
        out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
179
 
        self.assertEqual('', out)
180
 
        self.assertEqual('Created new stacked branch referring to %s.\n' %
181
 
            branch_tree.branch.base, err)
182
 
        self.assertEqual(branch_tree.branch.base,
183
 
            branch.Branch.open('branch2').get_stacked_on_url())
184
 
        branch2_tree = WorkingTree.open('branch2')
185
 
        branch2_revid = branch2_tree.commit('work on second stacked branch')
186
 
        self.assertRevisionInRepository('branch2', branch2_revid)
187
 
        self.assertRevisionsInBranchRepository(
188
 
            [trunk_revid, branch_revid, branch2_revid],
189
 
            'branch2')
190
 
 
191
 
    def test_branch_stacked(self):
192
 
        # We have a mainline
193
 
        trunk_tree = self.make_branch_and_tree('mainline',
194
 
            format='development')
195
 
        original_revid = trunk_tree.commit('mainline')
196
 
        self.assertRevisionInRepository('mainline', original_revid)
197
 
        # and a branch from it which is stacked
198
 
        out, err = self.run_bzr(['branch', '--stacked', 'mainline',
199
 
            'newbranch'])
200
 
        self.assertEqual('', out)
201
 
        self.assertEqual('Created new stacked branch referring to %s.\n' %
202
 
            trunk_tree.branch.base, err)
203
 
        self.assertRevisionNotInRepository('newbranch', original_revid)
204
 
        new_tree = WorkingTree.open('newbranch')
205
 
        new_revid = new_tree.commit('new work')
206
 
        self.check_shallow_branch(new_revid, trunk_tree.branch.base)
207
 
 
208
 
    def test_branch_stacked_from_smart_server(self):
209
 
        # We can branch stacking on a smart server
210
 
        from bzrlib.smart.server import SmartTCPServer_for_testing
211
 
        self.transport_server = SmartTCPServer_for_testing
212
 
        trunk = self.make_branch('mainline', format='development')
213
 
        out, err = self.run_bzr(
214
 
            ['branch', '--stacked', self.get_url('mainline'), 'shallow'])
215
 
 
216
 
    def test_branch_stacked_from_non_stacked_format(self):
217
 
        """The origin format doesn't support stacking"""
218
 
        trunk = self.make_branch('trunk', format='pack-0.92')
219
 
        out, err = self.run_bzr(
220
 
            ['branch', '--stacked', 'trunk', 'shallow'])
221
 
 
222
 
 
223
 
class TestRemoteBranch(TestCaseWithSFTPServer):
224
 
 
225
 
    def setUp(self):
226
 
        super(TestRemoteBranch, self).setUp()
227
 
        tree = self.make_branch_and_tree('branch')
228
 
        self.build_tree_contents([('branch/file', 'file content\n')])
229
 
        tree.add('file')
230
 
        tree.commit('file created')
231
 
 
232
 
    def test_branch_local_remote(self):
233
 
        self.run_bzr(['branch', 'branch', self.get_url('remote')])
234
 
        t = self.get_transport()
235
 
        # Ensure that no working tree what created remotely
236
 
        self.assertFalse(t.has('remote/file'))
237
 
 
238
 
    def test_branch_remote_remote(self):
239
 
        # Light cheat: we access the branch remotely
240
 
        self.run_bzr(['branch', self.get_url('branch'),
241
 
                      self.get_url('remote')])
242
 
        t = self.get_transport()
243
 
        # Ensure that no working tree what created remotely
244
 
        self.assertFalse(t.has('remote/file'))
245
111