~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_bound_branches.py

  • Committer: John Arbash Meinel
  • Date: 2005-11-14 17:02:35 UTC
  • mto: (1587.1.6 bound-branches)
  • mto: This revision was merged to the branch mainline in revision 1590.
  • Revision ID: john@arbash-meinel.com-20051114170235-f85afa458bae956e
Fixing up the error message for a failed bind.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
"""Tests of bound branches (binding, unbinding, commit, etc) command.
 
19
 
19
20
"""
20
21
 
21
22
import os
22
23
from cStringIO import StringIO
23
24
 
 
25
from bzrlib.selftest import TestCaseInTempDir
24
26
from bzrlib.branch import Branch
25
 
from bzrlib.bzrdir import (BzrDir, BzrDirFormat, BzrDirMetaFormat1)
26
 
from bzrlib.osutils import getcwd
27
 
from bzrlib.tests import TestCaseWithTransport
28
 
import bzrlib.urlutils as urlutils
29
 
from bzrlib.workingtree import WorkingTree
30
 
 
31
 
 
32
 
class TestLegacyFormats(TestCaseWithTransport):
33
 
    
34
 
    def setUp(self):
35
 
        super(TestLegacyFormats, self).setUp()
36
 
        self.build_tree(['master/', 'child/'])
37
 
        self.run_bzr('init', 'master')
38
 
        self.run_bzr('init', '--format=weave', 'child')
39
 
        os.chdir('child')
40
 
    
41
 
    def test_bind_format_6_bzrdir(self):
42
 
        # bind on a format 6 bzrdir should error
43
 
        out,err = self.run_bzr('bind', '../master', retcode=3)
44
 
        self.assertEqual('', out)
45
 
        # TODO: jam 20060427 Probably something like this really should
46
 
        #       print out the actual path, rather than the URL
47
 
        cwd = urlutils.local_path_to_url(getcwd())
48
 
        self.assertEqual('bzr: ERROR: To use this feature you must '
49
 
                         'upgrade your branch at %s/.\n' % cwd, err)
50
 
    
51
 
    def test_unbind_format_6_bzrdir(self):
52
 
        # bind on a format 6 bzrdir should error
53
 
        out,err = self.run_bzr('unbind', retcode=3)
54
 
        self.assertEqual('', out)
55
 
        cwd = urlutils.local_path_to_url(getcwd())
56
 
        self.assertEqual('bzr: ERROR: To use this feature you must '
57
 
                         'upgrade your branch at %s/.\n' % cwd, err)
58
 
 
59
 
 
60
 
class TestBoundBranches(TestCaseWithTransport):
61
 
 
 
27
 
 
28
class TestBoundBranches(TestCaseInTempDir):
 
29
    
62
30
    def create_branches(self):
63
31
        bzr = self.run_bzr
64
32
        self.build_tree(['base/', 'base/a', 'base/b'])
65
33
 
66
 
        branch = self.init_meta_branch('base')
67
 
        tree = branch.bzrdir.open_workingtree()
68
 
        tree.lock_write()
69
 
        tree.add(['a', 'b'])
70
 
        tree.commit('init')
71
 
        tree.unlock()
72
 
 
73
 
        self.run_bzr('checkout', 'base', 'child')
74
 
 
75
 
        self.check_revno(1, 'child')
76
 
        d = BzrDir.open('child')
77
 
        self.assertNotEqual(None, d.open_branch().get_master_branch())
78
 
 
79
 
    def check_revno(self, val, loc='.'):
80
 
        self.assertEqual(
81
 
            val, len(BzrDir.open(loc).open_branch().revision_history()))
 
34
        os.chdir('base')
 
35
        bzr('init')
 
36
        bzr('add')
 
37
        bzr('commit', '-m', 'init')
 
38
 
 
39
        os.chdir('..')
 
40
 
 
41
        bzr('get', '--bound', 'base', 'child')
 
42
 
 
43
        self.failUnlessExists('child')
 
44
 
 
45
        os.chdir('child')
 
46
        self.check_revno(1)
 
47
        self.failUnlessExists('.bzr/bound')
 
48
        os.chdir('..')
 
49
 
 
50
    def check_revno(self, val, loc=None):
 
51
        if loc is not None:
 
52
            cwd = os.getcwd()
 
53
            os.chdir(loc)
 
54
        self.assertEquals(self.capture('revno').strip(), str(val))
 
55
        if loc is not None:
 
56
            os.chdir(cwd)
82
57
 
83
58
    def test_simple_binding(self):
 
59
        bzr = self.run_bzr
84
60
        self.build_tree(['base/', 'base/a', 'base/b'])
85
61
 
86
 
        self.init_meta_branch('base')
87
 
        self.run_bzr('add', 'base')
88
 
        self.run_bzr('commit', '-m', 'init', 'base')
 
62
        os.chdir('base')
 
63
        bzr('init')
 
64
        bzr('add')
 
65
        bzr('commit', '-m', 'init')
89
66
 
90
 
        self.run_bzr('branch', 'base', 'child')
 
67
        os.chdir('..')
 
68
        bzr('branch', 'base', 'child')
91
69
 
92
70
        os.chdir('child')
93
 
        self.run_bzr('bind', '../base')
94
 
 
95
 
        d = BzrDir.open('')
96
 
        self.assertNotEqual(None, d.open_branch().get_master_branch())
97
 
 
98
 
        self.run_bzr('unbind')
99
 
        self.assertEqual(None, d.open_branch().get_master_branch())
100
 
 
101
 
        self.run_bzr('unbind', retcode=3)
102
 
 
103
 
    def init_meta_branch(self, path):
104
 
        old_format = BzrDirFormat.get_default_format()
105
 
        BzrDirFormat.set_default_format(BzrDirMetaFormat1())
106
 
        try:
107
 
            return BzrDir.create_branch_convenience(
108
 
                path, BzrDirMetaFormat1())
109
 
        finally:
110
 
            BzrDirFormat.set_default_format(old_format)
 
71
        bzr('bind', '../base')
 
72
 
 
73
        self.failUnlessExists('.bzr/bound')
 
74
 
 
75
        bzr('unbind')
 
76
        self.failIf(os.path.lexists('.bzr/bound'))
 
77
 
 
78
        # TODO: Should unbinding a non-bound branch fail?
 
79
        #bzr('unbind')
111
80
 
112
81
    def test_bound_commit(self):
113
82
        bzr = self.run_bzr
120
89
        self.check_revno(2)
121
90
 
122
91
        # Make sure it committed on the parent
123
 
        self.check_revno(2, '../base')
 
92
        os.chdir('../base')
 
93
        self.check_revno(2)
124
94
 
125
95
    def test_bound_fail(self):
126
 
        # Make sure commit fails if out of date.
 
96
        """Make sure commit fails if out of date."""
127
97
        bzr = self.run_bzr
128
98
        self.create_branches()
129
99
 
130
100
        os.chdir('base')
131
101
        open('a', 'wb').write('new base contents\n')
132
102
        bzr('commit', '-m', 'base')
133
 
        self.check_revno(2)
134
103
 
135
104
        os.chdir('../child')
136
 
        self.check_revno(1)
137
105
        open('b', 'wb').write('new b child contents\n')
138
 
        bzr('commit', '-m', 'child', retcode=3)
139
 
        self.check_revno(1)
 
106
        bzr('commit', '-m', 'child', retcode=1)
140
107
 
141
 
        bzr('update')
 
108
        bzr('pull')
142
109
        self.check_revno(2)
143
110
 
144
111
        bzr('commit', '-m', 'child')
145
112
        self.check_revno(3)
146
 
        self.check_revno(3, '../base')
 
113
        os.chdir('../base')
 
114
        self.check_revno(3)
147
115
 
148
116
    def test_double_binding(self):
149
117
        bzr = self.run_bzr
155
123
        # Double binding succeeds, but committing to child2 should fail
156
124
        bzr('bind', '../child')
157
125
 
158
 
        bzr('commit', '-m', 'child2', '--unchanged', retcode=3)
 
126
        bzr('commit', '-m', 'child2', '--unchanged', retcode=1)
159
127
 
160
128
    def test_unbinding(self):
161
129
        bzr = self.run_bzr
169
137
        os.chdir('../child')
170
138
        open('b', 'wb').write('new b child contents\n')
171
139
        self.check_revno(1)
172
 
        bzr('commit', '-m', 'child', retcode=3)
 
140
        bzr('commit', '-m', 'child', retcode=1)
173
141
        self.check_revno(1)
174
142
        bzr('unbind')
175
143
        bzr('commit', '-m', 'child')
176
144
        self.check_revno(2)
177
145
 
178
 
        bzr('bind', retcode=3)
 
146
        bzr('bind', retcode=1)
179
147
 
180
148
    def test_commit_remote_bound(self):
181
149
        # It is not possible to commit to a branch
191
159
        bzr('bind', '../newbase')
192
160
 
193
161
        os.chdir('../child')
194
 
        bzr('commit', '-m', 'failure', '--unchanged', retcode=3)
 
162
        bzr('commit', '-m', 'failure', '--unchanged', retcode=1)
 
163
        
195
164
 
196
165
    def test_pull_updates_both(self):
197
166
        bzr = self.run_bzr
208
177
        bzr('pull', '../newchild')
209
178
        self.check_revno(2)
210
179
 
211
 
        self.check_revno(2, '../base')
 
180
        os.chdir('../base')
 
181
        self.check_revno(2)
212
182
 
213
183
    def test_bind_diverged(self):
214
184
        bzr = self.run_bzr
227
197
 
228
198
        os.chdir('../child')
229
199
        # These branches have diverged
230
 
        bzr('bind', '../base', retcode=3)
 
200
        bzr('bind', '../base', retcode=1)
231
201
 
232
202
        # TODO: In the future, this might require actual changes
233
203
        # to have occurred, rather than just a new revision entry
235
205
        bzr('commit', '-m', 'merged')
236
206
        self.check_revno(3)
237
207
 
238
 
        # After a merge, trying to bind again should succeed
239
 
        # by pushing the new change to base
 
208
        # This should also be possible by doing a 'bzr push' to the
 
209
        # base, rather than doing 'bzr pull' from it
 
210
        os.chdir('../base')
 
211
        bzr('pull', '../child')
 
212
        self.check_revno(3)
 
213
 
 
214
        os.chdir('../child')
240
215
        bzr('bind', '../base')
241
 
        self.check_revno(3)
242
 
        self.check_revno(3, '../base')
243
216
 
244
217
        # After binding, the revision history should be identical
245
 
        child_rh = bzr('revision-history')[0]
 
218
        child_rh = self.capture('revision-history')
246
219
        os.chdir('../base')
247
 
        base_rh = bzr('revision-history')[0]
 
220
        base_rh = self.capture('revision-history')
248
221
        self.assertEquals(child_rh, base_rh)
249
222
 
250
223
    def test_bind_parent_ahead(self):
273
246
 
274
247
        os.chdir('../child')
275
248
        self.check_revno(2)
276
 
        bzr('bind', '../base')
 
249
        bzr('bind')
277
250
        self.check_revno(5)
278
251
 
279
252
    def test_bind_child_ahead(self):
280
 
        # test binding when the master branches history is a prefix of the 
281
 
        # childs
282
253
        bzr = self.run_bzr
283
254
        self.create_branches()
284
 
        return
285
255
 
286
256
        os.chdir('child')
287
257
        bzr('unbind')
300
270
        self.check_revno(5)
301
271
 
302
272
        self.check_revno(2, '../base')
303
 
        bzr('bind', '../base')
 
273
        bzr('bind')
304
274
        self.check_revno(5, '../base')
305
275
 
306
 
    def test_commit_after_merge(self):
307
 
        bzr = self.run_bzr
308
 
        self.create_branches()
309
 
 
310
 
        # We want merge to be able to be a local only
311
 
        # operation, because it can be without violating
312
 
        # the binding invariants.
313
 
        # But we can't fail afterwards
314
 
 
315
 
        bzr('branch', 'child', 'other')
316
 
 
317
 
        os.chdir('other')
318
 
        open('c', 'wb').write('file c\n')
319
 
        bzr('add', 'c')
320
 
        bzr('commit', '-m', 'adding c')
321
 
        new_rev_id = bzr('revision-history')[0].strip().split('\n')[-1]
322
 
 
323
 
        os.chdir('../child')
324
 
        bzr('merge', '../other')
325
 
 
326
 
        self.failUnlessExists('c')
327
 
        tree = WorkingTree.open('.')
328
 
        self.assertEqual([new_rev_id], tree.pending_merges())
329
 
 
330
 
        # Make sure the local branch has the installed revision
331
 
        bzr('cat-revision', new_rev_id)
332
 
        
333
 
        # And make sure that the base tree does not
334
 
        os.chdir('../base')
335
 
        bzr('cat-revision', new_rev_id, retcode=3)
336
 
 
337
 
        # Commit should succeed, and cause merged revisions to
338
 
        # be pulled into base
339
 
        os.chdir('../child')
340
 
        bzr('commit', '-m', 'merge other')
341
 
 
342
 
        self.check_revno(2)
343
 
 
344
 
        os.chdir('../base')
345
 
        self.check_revno(2)
346
 
 
347
 
        bzr('cat-revision', new_rev_id)
348
 
 
349
 
    def test_pull_overwrite_fails(self):
350
 
        bzr = self.run_bzr
351
 
        self.create_branches()
352
 
 
353
 
        bzr('branch', 'child', 'other')
354
 
        
355
 
        os.chdir('other')
356
 
        open('a', 'wb').write('new contents\n')
357
 
        bzr('commit', '-m', 'changed a')
358
 
        self.check_revno(2)
359
 
        open('a', 'ab').write('and then some\n')
360
 
        bzr('commit', '-m', 'another a')
361
 
        self.check_revno(3)
362
 
        open('a', 'ab').write('and some more\n')
363
 
        bzr('commit', '-m', 'yet another a')
364
 
        self.check_revno(4)
365
 
 
366
 
        os.chdir('../child')
367
 
        open('a', 'wb').write('also changed a\n')
368
 
        bzr('commit', '-m', 'child modified a')
369
 
 
370
 
        self.check_revno(2)
371
 
        self.check_revno(2, '../base')
372
 
 
373
 
        # It might be possible that we want pull --overwrite to
374
 
        # actually succeed.
375
 
        # If we want it, just change this test to make sure that 
376
 
        # both base and child are updated properly
377
 
        bzr('pull', '--overwrite', '../other', retcode=3)
378
 
 
379
 
        # It should fail without changing the local revision
380
 
        self.check_revno(2)
381
 
        self.check_revno(2, '../base')
382
 
 
383
 
    # TODO: jam 20051230 Test that commit & pull fail when the branch we 
384
 
    #       are bound to is not available
385
 
 
386