~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

  • Committer: Martin Pool
  • Date: 2009-01-13 03:11:04 UTC
  • mto: This revision was merged to the branch mainline in revision 3937.
  • Revision ID: mbp@sourcefrog.net-20090113031104-03my054s02i9l2pe
Bump version to 1.12 and add news template

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2008 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
import os
19
19
 
20
20
import bzrlib
21
21
from bzrlib import (
22
 
    config,
23
 
    controldir,
 
22
    bzrdir,
24
23
    errors,
 
24
    lockdir,
 
25
    osutils,
 
26
    tests,
25
27
    )
26
28
from bzrlib.branch import Branch
27
 
from bzrlib.bzrdir import BzrDirMetaFormat1
 
29
from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
28
30
from bzrlib.commit import Commit, NullCommitReporter
29
 
from bzrlib.errors import (
30
 
    PointlessCommit,
31
 
    BzrError,
32
 
    SigningFailed,
33
 
    LockContention,
34
 
    )
35
 
from bzrlib.tests import (
36
 
    TestCaseWithTransport,
37
 
    test_foreign,
38
 
    )
39
 
from bzrlib.tests.features import (
40
 
    SymlinkFeature,
41
 
    )
42
 
from bzrlib.tests.matchers import MatchesAncestry
 
31
from bzrlib.config import BranchConfig
 
32
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed, 
 
33
                           LockContention)
 
34
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
 
35
from bzrlib.workingtree import WorkingTree
43
36
 
44
37
 
45
38
# TODO: Test commit with some added, and added-but-missing files
46
39
 
47
 
class MustSignConfig(config.MemoryStack):
48
 
 
49
 
    def __init__(self):
50
 
        super(MustSignConfig, self).__init__('''
51
 
gpg_signing_command=cat -
52
 
create_signatures=always
53
 
''')
 
40
class MustSignConfig(BranchConfig):
 
41
 
 
42
    def signature_needed(self):
 
43
        return True
 
44
 
 
45
    def gpg_signing_command(self):
 
46
        return ['cat', '-']
 
47
 
 
48
 
 
49
class BranchWithHooks(BranchConfig):
 
50
 
 
51
    def post_commit(self):
 
52
        return "bzrlib.ahook bzrlib.ahook"
54
53
 
55
54
 
56
55
class CapturingReporter(NullCommitReporter):
82
81
        """Commit and check two versions of a single file."""
83
82
        wt = self.make_branch_and_tree('.')
84
83
        b = wt.branch
85
 
        with file('hello', 'w') as f: f.write('hello world')
 
84
        file('hello', 'w').write('hello world')
86
85
        wt.add('hello')
87
 
        rev1 = wt.commit(message='add hello')
 
86
        wt.commit(message='add hello')
88
87
        file_id = wt.path2id('hello')
89
88
 
90
 
        with file('hello', 'w') as f: f.write('version 2')
91
 
        rev2 = wt.commit(message='commit 2')
 
89
        file('hello', 'w').write('version 2')
 
90
        wt.commit(message='commit 2')
92
91
 
93
92
        eq = self.assertEquals
94
93
        eq(b.revno(), 2)
95
 
        rev = b.repository.get_revision(rev1)
 
94
        rh = b.revision_history()
 
95
        rev = b.repository.get_revision(rh[0])
96
96
        eq(rev.message, 'add hello')
97
97
 
98
 
        tree1 = b.repository.revision_tree(rev1)
 
98
        tree1 = b.repository.revision_tree(rh[0])
99
99
        tree1.lock_read()
100
100
        text = tree1.get_file_text(file_id)
101
101
        tree1.unlock()
102
102
        self.assertEqual('hello world', text)
103
103
 
104
 
        tree2 = b.repository.revision_tree(rev2)
 
104
        tree2 = b.repository.revision_tree(rh[1])
105
105
        tree2.lock_read()
106
106
        text = tree2.get_file_text(file_id)
107
107
        tree2.unlock()
108
108
        self.assertEqual('version 2', text)
109
109
 
110
 
    def test_commit_lossy_native(self):
111
 
        """Attempt a lossy commit to a native branch."""
112
 
        wt = self.make_branch_and_tree('.')
113
 
        b = wt.branch
114
 
        with file('hello', 'w') as f: f.write('hello world')
115
 
        wt.add('hello')
116
 
        revid = wt.commit(message='add hello', rev_id='revid', lossy=True)
117
 
        self.assertEquals('revid', revid)
118
 
 
119
 
    def test_commit_lossy_foreign(self):
120
 
        """Attempt a lossy commit to a foreign branch."""
121
 
        test_foreign.register_dummy_foreign_for_test(self)
122
 
        wt = self.make_branch_and_tree('.',
123
 
            format=test_foreign.DummyForeignVcsDirFormat())
124
 
        b = wt.branch
125
 
        with file('hello', 'w') as f: f.write('hello world')
126
 
        wt.add('hello')
127
 
        revid = wt.commit(message='add hello', lossy=True,
128
 
            timestamp=1302659388, timezone=0)
129
 
        self.assertEquals('dummy-v1:1302659388.0-0-UNKNOWN', revid)
130
 
 
131
 
    def test_commit_bound_lossy_foreign(self):
132
 
        """Attempt a lossy commit to a bzr branch bound to a foreign branch."""
133
 
        test_foreign.register_dummy_foreign_for_test(self)
134
 
        foreign_branch = self.make_branch('foreign',
135
 
            format=test_foreign.DummyForeignVcsDirFormat())
136
 
        wt = foreign_branch.create_checkout("local")
137
 
        b = wt.branch
138
 
        with file('local/hello', 'w') as f: f.write('hello world')
139
 
        wt.add('hello')
140
 
        revid = wt.commit(message='add hello', lossy=True,
141
 
            timestamp=1302659388, timezone=0)
142
 
        self.assertEquals('dummy-v1:1302659388.0-0-0', revid)
143
 
        self.assertEquals('dummy-v1:1302659388.0-0-0',
144
 
            foreign_branch.last_revision())
145
 
        self.assertEquals('dummy-v1:1302659388.0-0-0',
146
 
            wt.branch.last_revision())
147
 
 
148
 
    def test_missing_commit(self):
149
 
        """Test a commit with a missing file"""
150
 
        wt = self.make_branch_and_tree('.')
151
 
        b = wt.branch
152
 
        with file('hello', 'w') as f: f.write('hello world')
 
110
    def test_delete_commit(self):
 
111
        """Test a commit with a deleted file"""
 
112
        wt = self.make_branch_and_tree('.')
 
113
        b = wt.branch
 
114
        file('hello', 'w').write('hello world')
153
115
        wt.add(['hello'], ['hello-id'])
154
116
        wt.commit(message='add hello')
155
117
 
156
118
        os.remove('hello')
157
 
        reporter = CapturingReporter()
158
 
        wt.commit('removed hello', rev_id='rev2', reporter=reporter)
159
 
        self.assertEquals(
160
 
            [('missing', u'hello'), ('deleted', u'hello')],
161
 
            reporter.calls)
 
119
        wt.commit('removed hello', rev_id='rev2')
162
120
 
163
121
        tree = b.repository.revision_tree('rev2')
164
122
        self.assertFalse(tree.has_id('hello-id'))
167
125
        """Test a partial commit where a file was renamed but not committed.
168
126
 
169
127
        https://bugs.launchpad.net/bzr/+bug/83039
170
 
 
 
128
        
171
129
        If not handled properly, commit will try to snapshot
172
 
        dialog.py with olive/ as a parent, while
 
130
        dialog.py with olive/ as a parent, while 
173
131
        olive/ has not been snapshotted yet.
174
132
        """
175
133
        wt = self.make_branch_and_tree('.')
187
145
        """Commit refuses unless there are changes or it's forced."""
188
146
        wt = self.make_branch_and_tree('.')
189
147
        b = wt.branch
190
 
        with file('hello', 'w') as f: f.write('hello')
 
148
        file('hello', 'w').write('hello')
191
149
        wt.add(['hello'])
192
150
        wt.commit(message='add hello')
193
151
        self.assertEquals(b.revno(), 1)
196
154
                          message='fails',
197
155
                          allow_pointless=False)
198
156
        self.assertEquals(b.revno(), 1)
199
 
 
 
157
        
200
158
    def test_commit_empty(self):
201
159
        """Commiting an empty tree works."""
202
160
        wt = self.make_branch_and_tree('.')
213
171
        """Selective commit in tree with deletions"""
214
172
        wt = self.make_branch_and_tree('.')
215
173
        b = wt.branch
216
 
        with file('hello', 'w') as f: f.write('hello')
217
 
        with file('buongia', 'w') as f: f.write('buongia')
 
174
        file('hello', 'w').write('hello')
 
175
        file('buongia', 'w').write('buongia')
218
176
        wt.add(['hello', 'buongia'],
219
177
              ['hello-id', 'buongia-id'])
220
178
        wt.commit(message='add files',
221
179
                 rev_id='test@rev-1')
222
 
 
 
180
        
223
181
        os.remove('hello')
224
 
        with file('buongia', 'w') as f: f.write('new text')
 
182
        file('buongia', 'w').write('new text')
225
183
        wt.commit(message='update text',
226
184
                 specific_files=['buongia'],
227
185
                 allow_pointless=False,
241
199
        self.assertTrue(tree2.has_filename('hello'))
242
200
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
243
201
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
244
 
 
 
202
        
245
203
        tree3 = b.repository.revision_tree('test@rev-3')
246
204
        tree3.lock_read()
247
205
        self.addCleanup(tree3.unlock)
266
224
        eq(tree1.id2path('hello-id'), 'hello')
267
225
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
268
226
        self.assertFalse(tree1.has_filename('fruity'))
269
 
        self.check_tree_shape(tree1, ['hello'])
270
 
        eq(tree1.get_file_revision('hello-id'), 'test@rev-1')
 
227
        self.check_inventory_shape(tree1.inventory, ['hello'])
 
228
        ie = tree1.inventory['hello-id']
 
229
        eq(ie.revision, 'test@rev-1')
271
230
 
272
231
        tree2 = b.repository.revision_tree('test@rev-2')
273
232
        tree2.lock_read()
274
233
        self.addCleanup(tree2.unlock)
275
234
        eq(tree2.id2path('hello-id'), 'fruity')
276
235
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
277
 
        self.check_tree_shape(tree2, ['fruity'])
278
 
        eq(tree2.get_file_revision('hello-id'), 'test@rev-2')
 
236
        self.check_inventory_shape(tree2.inventory, ['fruity'])
 
237
        ie = tree2.inventory['hello-id']
 
238
        eq(ie.revision, 'test@rev-2')
279
239
 
280
240
    def test_reused_rev_id(self):
281
241
        """Test that a revision id cannot be reused in a branch"""
302
262
        wt.commit('two', rev_id=r2, allow_pointless=False)
303
263
        wt.lock_read()
304
264
        try:
305
 
            self.check_tree_shape(wt, ['a/', 'a/hello', 'b/'])
 
265
            self.check_inventory_shape(wt.read_working_inventory(),
 
266
                                       ['a/', 'a/hello', 'b/'])
306
267
        finally:
307
268
            wt.unlock()
308
269
 
311
272
        wt.commit('three', rev_id=r3, allow_pointless=False)
312
273
        wt.lock_read()
313
274
        try:
314
 
            self.check_tree_shape(wt,
 
275
            self.check_inventory_shape(wt.read_working_inventory(),
315
276
                                       ['a/', 'a/hello', 'a/b/'])
316
 
            self.check_tree_shape(b.repository.revision_tree(r3),
 
277
            self.check_inventory_shape(b.repository.get_revision_inventory(r3),
317
278
                                       ['a/', 'a/hello', 'a/b/'])
318
279
        finally:
319
280
            wt.unlock()
323
284
        wt.commit('four', rev_id=r4, allow_pointless=False)
324
285
        wt.lock_read()
325
286
        try:
326
 
            self.check_tree_shape(wt, ['a/', 'a/b/hello', 'a/b/'])
 
287
            self.check_inventory_shape(wt.read_working_inventory(),
 
288
                                       ['a/', 'a/b/hello', 'a/b/'])
327
289
        finally:
328
290
            wt.unlock()
329
291
 
330
 
        inv = b.repository.get_inventory(r4)
 
292
        inv = b.repository.get_revision_inventory(r4)
331
293
        eq(inv['hello-id'].revision, r4)
332
294
        eq(inv['a-id'].revision, r1)
333
295
        eq(inv['b-id'].revision, r3)
336
298
        """Commit with a removed file"""
337
299
        wt = self.make_branch_and_tree('.')
338
300
        b = wt.branch
339
 
        with file('hello', 'w') as f: f.write('hello world')
 
301
        file('hello', 'w').write('hello world')
340
302
        wt.add(['hello'], ['hello-id'])
341
303
        wt.commit(message='add hello')
342
304
        wt.remove('hello')
351
313
        b = wt.branch
352
314
        rev_ids = []
353
315
        for i in range(4):
354
 
            with file('hello', 'w') as f: f.write((str(i) * 4) + '\n')
 
316
            file('hello', 'w').write((str(i) * 4) + '\n')
355
317
            if i == 0:
356
318
                wt.add(['hello'], ['hello-id'])
357
319
            rev_id = 'test@rev-%d' % (i+1)
358
320
            rev_ids.append(rev_id)
359
321
            wt.commit(message='rev %d' % (i+1),
360
322
                     rev_id=rev_id)
 
323
        eq = self.assertEquals
 
324
        eq(b.revision_history(), rev_ids)
361
325
        for i in range(4):
362
 
            self.assertThat(rev_ids[:i+1],
363
 
                MatchesAncestry(b.repository, rev_ids[i]))
 
326
            anc = b.repository.get_ancestry(rev_ids[i])
 
327
            eq(anc, [None] + rev_ids[:i+1])
364
328
 
365
329
    def test_commit_new_subdir_child_selective(self):
366
330
        wt = self.make_branch_and_tree('.')
380
344
        from bzrlib.errors import StrictCommitFailed
381
345
        wt = self.make_branch_and_tree('.')
382
346
        b = wt.branch
383
 
        with file('hello', 'w') as f: f.write('hello world')
 
347
        file('hello', 'w').write('hello world')
384
348
        wt.add('hello')
385
 
        with file('goodbye', 'w') as f: f.write('goodbye cruel world!')
 
349
        file('goodbye', 'w').write('goodbye cruel world!')
386
350
        self.assertRaises(StrictCommitFailed, wt.commit,
387
351
            message='add hello but not goodbye', strict=True)
388
352
 
389
353
    def test_strict_commit_without_unknowns(self):
390
354
        """Try and commit with no unknown files and strict = True,
391
355
        should work."""
 
356
        from bzrlib.errors import StrictCommitFailed
392
357
        wt = self.make_branch_and_tree('.')
393
358
        b = wt.branch
394
 
        with file('hello', 'w') as f: f.write('hello world')
 
359
        file('hello', 'w').write('hello world')
395
360
        wt.add('hello')
396
361
        wt.commit(message='add hello', strict=True)
397
362
 
399
364
        """Try and commit with unknown files and strict = False, should work."""
400
365
        wt = self.make_branch_and_tree('.')
401
366
        b = wt.branch
402
 
        with file('hello', 'w') as f: f.write('hello world')
 
367
        file('hello', 'w').write('hello world')
403
368
        wt.add('hello')
404
 
        with file('goodbye', 'w') as f: f.write('goodbye cruel world!')
 
369
        file('goodbye', 'w').write('goodbye cruel world!')
405
370
        wt.commit(message='add hello but not goodbye', strict=False)
406
371
 
407
372
    def test_nonstrict_commit_without_unknowns(self):
409
374
        should work."""
410
375
        wt = self.make_branch_and_tree('.')
411
376
        b = wt.branch
412
 
        with file('hello', 'w') as f: f.write('hello world')
 
377
        file('hello', 'w').write('hello world')
413
378
        wt.add('hello')
414
379
        wt.commit(message='add hello', strict=False)
415
380
 
420
385
        wt = self.make_branch_and_tree('.')
421
386
        branch = wt.branch
422
387
        wt.commit("base", allow_pointless=True, rev_id='A')
423
 
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
 
388
        self.failIf(branch.repository.has_signature_for_revision_id('A'))
424
389
        try:
425
390
            from bzrlib.testament import Testament
426
391
            # monkey patch gpg signing mechanism
427
392
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
428
 
            conf = config.MemoryStack('''
429
 
gpg_signing_command=cat -
430
 
create_signatures=always
431
 
''')
432
 
            commit.Commit(config_stack=conf).commit(
433
 
                message="base", allow_pointless=True, rev_id='B',
434
 
                working_tree=wt)
 
393
            commit.Commit(config=MustSignConfig(branch)).commit(message="base",
 
394
                                                      allow_pointless=True,
 
395
                                                      rev_id='B',
 
396
                                                      working_tree=wt)
435
397
            def sign(text):
436
398
                return bzrlib.gpg.LoopbackGPGStrategy(None).sign(text)
437
399
            self.assertEqual(sign(Testament.from_revision(branch.repository,
438
 
                                                          'B').as_short_text()),
 
400
                             'B').as_short_text()),
439
401
                             branch.repository.get_signature_text('B'))
440
402
        finally:
441
403
            bzrlib.gpg.GPGStrategy = oldstrategy
447
409
        wt = self.make_branch_and_tree('.')
448
410
        branch = wt.branch
449
411
        wt.commit("base", allow_pointless=True, rev_id='A')
450
 
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
 
412
        self.failIf(branch.repository.has_signature_for_revision_id('A'))
451
413
        try:
 
414
            from bzrlib.testament import Testament
452
415
            # monkey patch gpg signing mechanism
453
416
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
454
 
            conf = config.MemoryStack('''
455
 
gpg_signing_command=cat -
456
 
create_signatures=always
457
 
''')
 
417
            config = MustSignConfig(branch)
458
418
            self.assertRaises(SigningFailed,
459
 
                              commit.Commit(config_stack=conf).commit,
 
419
                              commit.Commit(config=config).commit,
460
420
                              message="base",
461
421
                              allow_pointless=True,
462
422
                              rev_id='B',
463
423
                              working_tree=wt)
464
424
            branch = Branch.open(self.get_url('.'))
465
 
            self.assertEqual(branch.last_revision(), 'A')
466
 
            self.assertFalse(branch.repository.has_revision('B'))
 
425
            self.assertEqual(branch.revision_history(), ['A'])
 
426
            self.failIf(branch.repository.has_revision('B'))
467
427
        finally:
468
428
            bzrlib.gpg.GPGStrategy = oldstrategy
469
429
 
476
436
            calls.append('called')
477
437
        bzrlib.ahook = called
478
438
        try:
479
 
            conf = config.MemoryStack('post_commit=bzrlib.ahook bzrlib.ahook')
480
 
            commit.Commit(config_stack=conf).commit(
481
 
                message = "base", allow_pointless=True, rev_id='A',
482
 
                working_tree = wt)
 
439
            config = BranchWithHooks(branch)
 
440
            commit.Commit(config=config).commit(
 
441
                            message = "base",
 
442
                            allow_pointless=True,
 
443
                            rev_id='A', working_tree = wt)
483
444
            self.assertEqual(['called', 'called'], calls)
484
445
        finally:
485
446
            del bzrlib.ahook
523
484
        other_bzrdir = master_branch.bzrdir.sprout('other')
524
485
        other_tree = other_bzrdir.open_workingtree()
525
486
 
526
 
        # do a commit to the other branch changing the content file so
 
487
        # do a commit to the the other branch changing the content file so
527
488
        # that our commit after merging will have a merged revision in the
528
489
        # content file history.
529
490
        self.build_tree_contents([('other/content_file', 'change in other\n')])
540
501
        bound_tree.commit(message='commit of merge in bound tree')
541
502
 
542
503
    def test_commit_reporting_after_merge(self):
543
 
        # when doing a commit of a merge, the reporter needs to still
 
504
        # when doing a commit of a merge, the reporter needs to still 
544
505
        # be called for each item that is added/removed/deleted.
545
506
        this_tree = self.make_branch_and_tree('this')
546
507
        # we need a bunch of files and dirs, to perform one action on each.
589
550
        this_tree.merge_from_branch(other_tree.branch)
590
551
        reporter = CapturingReporter()
591
552
        this_tree.commit('do the commit', reporter=reporter)
592
 
        expected = set([
 
553
        self.assertEqual([
 
554
            ('change', 'unchanged', ''),
 
555
            ('change', 'unchanged', 'dirtoleave'),
 
556
            ('change', 'unchanged', 'filetoleave'),
593
557
            ('change', 'modified', 'filetomodify'),
594
558
            ('change', 'added', 'newdir'),
595
559
            ('change', 'added', 'newfile'),
599
563
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
600
564
            ('deleted', 'dirtoremove'),
601
565
            ('deleted', 'filetoremove'),
602
 
            ])
603
 
        result = set(reporter.calls)
604
 
        missing = expected - result
605
 
        new = result - expected
606
 
        self.assertEqual((set(), set()), (missing, new))
 
566
            ],
 
567
            reporter.calls)
607
568
 
608
569
    def test_commit_removals_respects_filespec(self):
609
570
        """Commit respects the specified_files for removals."""
699
660
    def test_commit_unversioned_specified(self):
700
661
        """Commit should raise if specified files isn't in basis or worktree"""
701
662
        tree = self.make_branch_and_tree('.')
702
 
        self.assertRaises(errors.PathsNotVersionedError, tree.commit,
 
663
        self.assertRaises(errors.PathsNotVersionedError, tree.commit, 
703
664
                          'message', specific_files=['bogus'])
704
665
 
705
666
    class Callback(object):
706
 
 
 
667
        
707
668
        def __init__(self, message, testcase):
708
669
            self.called = False
709
670
            self.message = message
737
698
        """Callback should not be invoked for pointless commit"""
738
699
        tree = self.make_branch_and_tree('.')
739
700
        cb = self.Callback(u'commit 2', self)
740
 
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
 
701
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb, 
741
702
                          allow_pointless=False)
742
703
        self.assertFalse(cb.called)
743
704
 
747
708
        cb = self.Callback(u'commit 2', self)
748
709
        repository = tree.branch.repository
749
710
        # simulate network failure
750
 
        def raise_(self, arg, arg2, arg3=None, arg4=None):
 
711
        def raise_(self, arg, arg2):
751
712
            raise errors.NoSuchFile('foo')
752
713
        repository.add_inventory = raise_
753
 
        repository.add_inventory_by_delta = raise_
754
714
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
755
715
        self.assertFalse(cb.called)
756
716
 
778
738
        tree.add('a/c/d')
779
739
        tree.rename_one('a/z/x', 'a/c/d/x')
780
740
        tree.commit('test', specific_files=['a/z/y'])
781
 
 
 
741
 
782
742
    def test_commit_no_author(self):
783
743
        """The default kwarg author in MutableTree.commit should not add
784
744
        the 'author' revision property.
787
747
        rev_id = tree.commit('commit 1')
788
748
        rev = tree.branch.repository.get_revision(rev_id)
789
749
        self.assertFalse('author' in rev.properties)
790
 
        self.assertFalse('authors' in rev.properties)
791
750
 
792
751
    def test_commit_author(self):
793
752
        """Passing a non-empty author kwarg to MutableTree.commit should add
794
753
        the 'author' revision property.
795
754
        """
796
755
        tree = self.make_branch_and_tree('foo')
797
 
        rev_id = self.callDeprecated(['The parameter author was '
798
 
                'deprecated in version 1.13. Use authors instead'],
799
 
                tree.commit, 'commit 1', author='John Doe <jdoe@example.com>')
 
756
        rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
800
757
        rev = tree.branch.repository.get_revision(rev_id)
801
758
        self.assertEqual('John Doe <jdoe@example.com>',
802
 
                         rev.properties['authors'])
803
 
        self.assertFalse('author' in rev.properties)
804
 
 
805
 
    def test_commit_empty_authors_list(self):
806
 
        """Passing an empty list to authors shouldn't add the property."""
807
 
        tree = self.make_branch_and_tree('foo')
808
 
        rev_id = tree.commit('commit 1', authors=[])
809
 
        rev = tree.branch.repository.get_revision(rev_id)
810
 
        self.assertFalse('author' in rev.properties)
811
 
        self.assertFalse('authors' in rev.properties)
812
 
 
813
 
    def test_multiple_authors(self):
814
 
        tree = self.make_branch_and_tree('foo')
815
 
        rev_id = tree.commit('commit 1',
816
 
                authors=['John Doe <jdoe@example.com>',
817
 
                         'Jane Rey <jrey@example.com>'])
818
 
        rev = tree.branch.repository.get_revision(rev_id)
819
 
        self.assertEqual('John Doe <jdoe@example.com>\n'
820
 
                'Jane Rey <jrey@example.com>', rev.properties['authors'])
821
 
        self.assertFalse('author' in rev.properties)
822
 
 
823
 
    def test_author_and_authors_incompatible(self):
824
 
        tree = self.make_branch_and_tree('foo')
825
 
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
826
 
                authors=['John Doe <jdoe@example.com>',
827
 
                         'Jane Rey <jrey@example.com>'],
828
 
                author="Jack Me <jme@example.com>")
829
 
 
830
 
    def test_author_with_newline_rejected(self):
831
 
        tree = self.make_branch_and_tree('foo')
832
 
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
833
 
                authors=['John\nDoe <jdoe@example.com>'])
 
759
                         rev.properties['author'])
834
760
 
835
761
    def test_commit_with_checkout_and_branch_sharing_repo(self):
836
762
        repo = self.make_repository('repo', shared=True)
837
763
        # make_branch_and_tree ignores shared repos
838
 
        branch = controldir.ControlDir.create_branch_convenience('repo/branch')
 
764
        branch = bzrdir.BzrDir.create_branch_convenience('repo/branch')
839
765
        tree2 = branch.create_checkout('repo/tree2')
840
766
        tree2.commit('message', rev_id='rev1')
841
767
        self.assertTrue(tree2.branch.repository.has_revision('rev1'))