/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

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

  • Committer: Ian Clatworthy
  • Date: 2007-09-18 07:14:35 UTC
  • mto: (2867.1.1 ianc-integration2)
  • mto: This revision was merged to the branch mainline in revision 2869.
  • Revision ID: ian.clatworthy@internode.on.net-20070918071435-cjetogmh16akg4v8
bzrdir.py code clean-ups

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 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
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
"""Tests for the commit CLI of bzr."""
19
19
 
20
20
import os
21
 
import re
22
 
import sys
23
21
 
24
22
from bzrlib import (
25
 
    osutils,
26
23
    ignores,
27
 
    msgeditor,
28
 
    osutils,
29
 
    tests,
30
24
    )
31
25
from bzrlib.bzrdir import BzrDir
32
 
from bzrlib.tests import (
33
 
    probe_bad_non_ascii,
34
 
    TestSkipped,
35
 
    )
36
26
from bzrlib.tests.blackbox import ExternalBase
37
27
 
38
28
 
45
35
        self.build_tree(['hello.txt'])
46
36
        out,err = self.run_bzr('commit -m empty', retcode=3)
47
37
        self.assertEqual('', out)
48
 
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
49
 
                                  ' Use --unchanged to commit anyhow.\n')
 
38
        self.assertContainsRe(err, 'bzr: ERROR: no changes to commit\.'
 
39
                                  ' use --unchanged to commit anyhow\n')
50
40
 
51
41
    def test_commit_success(self):
52
42
        """Successful commit should not leave behind a bzr-commit-* file"""
85
75
        tree.add("hello.txt")
86
76
        out,err = self.run_bzr('commit -m added')
87
77
        self.assertEqual('', out)
88
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
78
        self.assertContainsRe(err, '^Committing revision 1 to ".*"\.\n'
89
79
                              'added hello.txt\n'
90
80
                              'Committed revision 1.\n$',)
91
81
 
104
94
        self.build_tree_contents([('hello.txt', 'new contents')])
105
95
        out, err = self.run_bzr('commit -m modified')
106
96
        self.assertEqual('', out)
107
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
97
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
108
98
                              'modified hello\.txt\n'
109
99
                              'Committed revision 2\.\n$')
110
100
 
111
 
    def test_unicode_commit_message_is_filename(self):
112
 
        """Unicode commit message same as a filename (Bug #563646).
113
 
        """
114
 
        file_name = u'\N{euro sign}'
115
 
        self.run_bzr(['init'])
116
 
        open(file_name, 'w').write('hello world')
117
 
        self.run_bzr(['add'])
118
 
        out, err = self.run_bzr(['commit', '-m', file_name])
119
 
        reflags = re.MULTILINE|re.DOTALL|re.UNICODE
120
 
        te = osutils.get_terminal_encoding()
121
 
        self.assertContainsRe(err.decode(te),
122
 
            u'The commit message is a file name:',
123
 
            flags=reflags)
124
 
 
125
 
        # Run same test with a filename that causes encode
126
 
        # error for the terminal encoding. We do this
127
 
        # by forcing terminal encoding of ascii for
128
 
        # osutils.get_terminal_encoding which is used
129
 
        # by ui.text.show_warning
130
 
        default_get_terminal_enc = osutils.get_terminal_encoding
131
 
        try:
132
 
            osutils.get_terminal_encoding = lambda: 'ascii'
133
 
            file_name = u'foo\u1234'
134
 
            open(file_name, 'w').write('hello world')
135
 
            self.run_bzr(['add'])
136
 
            out, err = self.run_bzr(['commit', '-m', file_name])
137
 
            reflags = re.MULTILINE|re.DOTALL|re.UNICODE
138
 
            te = osutils.get_terminal_encoding()
139
 
            self.assertContainsRe(err.decode(te, 'replace'),
140
 
                u'The commit message is a file name:',
141
 
                flags=reflags)
142
 
        finally:
143
 
            osutils.get_terminal_encoding = default_get_terminal_enc
144
 
 
145
 
    def test_warn_about_forgotten_commit_message(self):
146
 
        """Test that the lack of -m parameter is caught"""
147
 
        wt = self.make_branch_and_tree('.')
148
 
        self.build_tree(['one', 'two'])
149
 
        wt.add(['two'])
150
 
        out, err = self.run_bzr('commit -m one two')
151
 
        self.assertContainsRe(err, "The commit message is a file name")
152
 
 
153
101
    def test_verbose_commit_renamed(self):
154
102
        # Verbose commit of renamed file should say so
155
103
        wt = self.prepare_simple_history()
156
104
        wt.rename_one('hello.txt', 'gutentag.txt')
157
105
        out, err = self.run_bzr('commit -m renamed')
158
106
        self.assertEqual('', out)
159
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
107
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
160
108
                              'renamed hello\.txt => gutentag\.txt\n'
161
109
                              'Committed revision 2\.$\n')
162
110
 
168
116
        wt.rename_one('hello.txt', 'subdir/hello.txt')
169
117
        out, err = self.run_bzr('commit -m renamed')
170
118
        self.assertEqual('', out)
171
 
        self.assertEqual(set([
172
 
            'Committing to: %s/' % osutils.getcwd(),
173
 
            'added subdir',
174
 
            'renamed hello.txt => subdir/hello.txt',
175
 
            'Committed revision 2.',
176
 
            '',
177
 
            ]), set(err.split('\n')))
 
119
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
 
120
                              'added subdir\n'
 
121
                              'renamed hello\.txt => subdir/hello\.txt\n'
 
122
                              'Committed revision 2\.\n$')
178
123
 
179
124
    def test_verbose_commit_with_unknown(self):
180
125
        """Unknown files should not be listed by default in verbose output"""
184
129
        wt.add(['hello.txt'])
185
130
        out,err = self.run_bzr('commit -m added')
186
131
        self.assertEqual('', out)
187
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
132
        self.assertContainsRe(err, '^Committing revision 1 to ".*"\.\n'
188
133
                              'added hello\.txt\n'
189
134
                              'Committed revision 1\.\n$')
190
135
 
197
142
        tree.add("hello.txt")
198
143
        out,err = self.run_bzr('commit -m added')
199
144
        self.assertEqual('', out)
200
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
145
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
201
146
                              'added hello\.txt\n'
202
147
                              'Committed revision 2\.$\n')
203
148
 
209
154
        a_tree.commit(message='Initial message')
210
155
 
211
156
        b_tree = a_tree.branch.create_checkout('b')
212
 
        expected = "%s/" % (osutils.abspath('a'), )
 
157
        expected = "%s/" % (os.path.abspath('a'), )
213
158
        out, err = self.run_bzr('commit -m blah --unchanged', working_dir='b')
214
 
        self.assertEqual(err, 'Committing to: %s\n'
 
159
        self.assertEqual(err, 'Committing revision 2 to "%s".\n'
215
160
                         'Committed revision 2.\n' % expected)
216
161
 
217
 
    def test_commit_sanitizes_CR_in_message(self):
218
 
        # See bug #433779, basically Emacs likes to pass '\r\n' style line
219
 
        # endings to 'bzr commit -m ""' which breaks because we don't allow
220
 
        # '\r' in commit messages. (Mostly because of issues where XML style
221
 
        # formats arbitrarily strip it out of the data while parsing.)
222
 
        # To make life easier for users, we just always translate '\r\n' =>
223
 
        # '\n'. And '\r' => '\n'.
224
 
        a_tree = self.make_branch_and_tree('a')
225
 
        self.build_tree(['a/b'])
226
 
        a_tree.add('b')
227
 
        self.run_bzr(['commit',
228
 
                      '-m', 'a string\r\n\r\nwith mixed\r\rendings\n'],
229
 
                     working_dir='a')
230
 
        rev_id = a_tree.branch.last_revision()
231
 
        rev = a_tree.branch.repository.get_revision(rev_id)
232
 
        self.assertEqualDiff('a string\n\nwith mixed\n\nendings\n',
233
 
                             rev.message)
234
 
 
235
162
    def test_commit_merge_reports_all_modified_files(self):
236
163
        # the commit command should show all the files that are shown by
237
164
        # bzr diff or bzr status when committing, even when they were not
285
212
        os.chdir('this')
286
213
        out,err = self.run_bzr('commit -m added')
287
214
        self.assertEqual('', out)
288
 
        self.assertEqual(set([
289
 
            'Committing to: %s/' % osutils.getcwd(),
290
 
            'modified filetomodify',
291
 
            'added newdir',
292
 
            'added newfile',
293
 
            'renamed dirtorename => renameddir',
294
 
            'renamed filetorename => renamedfile',
295
 
            'renamed dirtoreparent => renameddir/reparenteddir',
296
 
            'renamed filetoreparent => renameddir/reparentedfile',
297
 
            'deleted dirtoremove',
298
 
            'deleted filetoremove',
299
 
            'Committed revision 2.',
300
 
            ''
301
 
            ]), set(err.split('\n')))
 
215
        expected = '%s/' % (os.getcwd(), )
 
216
        self.assertEqualDiff(
 
217
            'Committing revision 2 to "%s".\n'
 
218
            'modified filetomodify\n'
 
219
            'added newdir\n'
 
220
            'added newfile\n'
 
221
            'renamed dirtorename => renameddir\n'
 
222
            'renamed filetorename => renamedfile\n'
 
223
            'renamed dirtoreparent => renameddir/reparenteddir\n'
 
224
            'renamed filetoreparent => renameddir/reparentedfile\n'
 
225
            'deleted dirtoremove\n'
 
226
            'deleted filetoremove\n'
 
227
            'Committed revision 2.\n' % (expected, ),
 
228
            err)
302
229
 
303
230
    def test_empty_commit_message(self):
304
231
        tree = self.make_branch_and_tree('.')
307
234
        self.run_bzr('commit -m ""', retcode=3)
308
235
 
309
236
    def test_unsupported_encoding_commit_message(self):
310
 
        if sys.platform == 'win32':
311
 
            raise tests.TestNotApplicable('Win32 parses arguments directly'
312
 
                ' as Unicode, so we can\'t pass invalid non-ascii')
313
237
        tree = self.make_branch_and_tree('.')
314
238
        self.build_tree_contents([('foo.c', 'int main() {}')])
315
239
        tree.add('foo.c')
316
 
        # LANG env variable has no effect on Windows
317
 
        # but some characters anyway cannot be represented
318
 
        # in default user encoding
319
 
        char = probe_bad_non_ascii(osutils.get_user_encoding())
320
 
        if char is None:
321
 
            raise TestSkipped('Cannot find suitable non-ascii character'
322
 
                'for user_encoding (%s)' % osutils.get_user_encoding())
323
 
        out,err = self.run_bzr_subprocess('commit -m "%s"' % char,
324
 
                                          retcode=1,
325
 
                                          env_changes={'LANG': 'C'})
 
240
        out,err = self.run_bzr_subprocess('commit -m "\xff"', retcode=1,
 
241
                                                    env_changes={'LANG': 'C'})
326
242
        self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
327
243
                                    'unsupported by the current encoding.')
328
244
 
334
250
        self.build_tree_contents([
335
251
            ('branch/foo.c', 'int main() {}'),
336
252
            ('branch/bar.c', 'int main() {}')])
337
 
        inner_tree.add(['foo.c', 'bar.c'])
 
253
        inner_tree.add('foo.c')
 
254
        inner_tree.add('bar.c')
338
255
        # can't commit files in different trees; sane error
339
256
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
340
 
        # can commit to branch - records foo.c only
341
257
        self.run_bzr('commit -m newstuff branch/foo.c')
342
 
        # can commit to branch - records bar.c
343
258
        self.run_bzr('commit -m newstuff branch')
344
 
        # No changes left
345
 
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
 
259
        self.run_bzr('commit -m newstuff branch', retcode=3)
346
260
 
347
261
    def test_out_of_date_tree_commit(self):
348
262
        # check we get an error code and a clear message committing with an out
372
286
    def test_commit_a_text_merge_in_a_checkout(self):
373
287
        # checkouts perform multiple actions in a transaction across bond
374
288
        # branches and their master, and have been observed to fail in the
375
 
        # past. This is a user story reported to fail in bug #43959 where
 
289
        # past. This is a user story reported to fail in bug #43959 where 
376
290
        # a merge done in a checkout (using the update command) failed to
377
291
        # commit correctly.
378
292
        trunk = self.make_branch_and_tree('trunk')
379
293
 
380
294
        u1 = trunk.branch.create_checkout('u1')
381
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
295
        self.build_tree_contents([('u1/hosts', 'initial contents')])
382
296
        u1.add('hosts')
383
297
        self.run_bzr('commit -m add-hosts u1')
384
298
 
385
299
        u2 = trunk.branch.create_checkout('u2')
386
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
300
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
387
301
        self.run_bzr('commit -m checkin-from-u2 u2')
388
302
 
389
303
        # make an offline commits
390
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
304
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
391
305
        self.run_bzr('commit -m checkin-offline --local u1')
392
306
 
393
307
        # now try to pull in online work from u2, and then commit our offline
394
308
        # work as a merge
395
309
        # retcode 1 as we expect a text conflict
396
310
        self.run_bzr('update u1', retcode=1)
397
 
        self.assertFileEqual('''\
398
 
<<<<<<< TREE
399
 
first offline change in u1
400
 
=======
401
 
altered in u2
402
 
>>>>>>> MERGE-SOURCE
403
 
''',
404
 
                             'u1/hosts')
405
 
 
406
311
        self.run_bzr('resolved u1/hosts')
407
312
        # add a text change here to represent resolving the merge conflicts in
408
313
        # favour of a new version of the file not identical to either the u1
410
315
        self.build_tree_contents([('u1/hosts', 'merge resolution\n')])
411
316
        self.run_bzr('commit -m checkin-merge-of-the-offline-work-from-u1 u1')
412
317
 
413
 
    def test_commit_exclude_excludes_modified_files(self):
414
 
        """Commit -x foo should ignore changes to foo."""
415
 
        tree = self.make_branch_and_tree('.')
416
 
        self.build_tree(['a', 'b', 'c'])
417
 
        tree.smart_add(['.'])
418
 
        out, err = self.run_bzr(['commit', '-m', 'test', '-x', 'b'])
419
 
        self.assertFalse('added b' in out)
420
 
        self.assertFalse('added b' in err)
421
 
        # If b was excluded it will still be 'added' in status.
422
 
        out, err = self.run_bzr(['added'])
423
 
        self.assertEqual('b\n', out)
424
 
        self.assertEqual('', err)
425
 
 
426
 
    def test_commit_exclude_twice_uses_both_rules(self):
427
 
        """Commit -x foo -x bar should ignore changes to foo and bar."""
428
 
        tree = self.make_branch_and_tree('.')
429
 
        self.build_tree(['a', 'b', 'c'])
430
 
        tree.smart_add(['.'])
431
 
        out, err = self.run_bzr(['commit', '-m', 'test', '-x', 'b', '-x', 'c'])
432
 
        self.assertFalse('added b' in out)
433
 
        self.assertFalse('added c' in out)
434
 
        self.assertFalse('added b' in err)
435
 
        self.assertFalse('added c' in err)
436
 
        # If b was excluded it will still be 'added' in status.
437
 
        out, err = self.run_bzr(['added'])
438
 
        self.assertTrue('b\n' in out)
439
 
        self.assertTrue('c\n' in out)
440
 
        self.assertEqual('', err)
441
 
 
442
318
    def test_commit_respects_spec_for_removals(self):
443
319
        """Commit with a file spec should only commit removals that match"""
444
320
        t = self.make_branch_and_tree('.')
471
347
 
472
348
        # With no changes, it should just be 'no changes'
473
349
        # Make sure that commit is failing because there is nothing to do
474
 
        self.run_bzr_error(['No changes to commit'],
 
350
        self.run_bzr_error(['no changes to commit'],
475
351
                           'commit --strict -m no-changes',
476
352
                           working_dir='tree')
477
353
 
505
381
        output, err = self.run_bzr(
506
382
            'commit -m hello --fixes=lp:23452 tree/hello.txt')
507
383
        self.assertEqual('', output)
508
 
        self.assertContainsRe(err, 'Committing to: .*\n'
 
384
        self.assertContainsRe(err, 'Committing revision 1 to ".*"\.\n'
509
385
                              'added hello\.txt\n'
510
386
                              'Committed revision 1\.\n')
511
387
 
596
472
        self.build_tree(['tree/hello.txt'])
597
473
        tree.add('hello.txt')
598
474
        self.run_bzr_error(
599
 
            ["Did not understand bug identifier orange: Must be an integer. "
600
 
             "See \"bzr help bugs\" for more information on this feature.\n"
601
 
             "Commit refused."],
 
475
            ["Invalid bug identifier for %s. Commit refused." % 'lp:orange'],
602
476
            'commit -m add-b --fixes=lp:orange',
603
477
            working_dir='tree')
604
478
 
608
482
        self.build_tree(['tree/hello.txt'])
609
483
        tree.add('hello.txt')
610
484
        self.run_bzr_error(
611
 
            [r"Invalid bug orange. Must be in the form of 'tracker:id'\. "
612
 
             r"See \"bzr help bugs\" for more information on this feature.\n"
 
485
            [r"Invalid bug orange. Must be in the form of 'tag:id'\. "
613
486
             r"Commit refused\."],
614
487
            'commit -m add-b --fixes=orange',
615
488
            working_dir='tree')
631
504
        tree = self.make_branch_and_tree('tree')
632
505
        self.build_tree(['tree/hello.txt'])
633
506
        tree.add('hello.txt')
634
 
        self.run_bzr(["commit", '-m', 'hello',
635
 
                      '--author', u'John D\xf6 <jdoe@example.com>',
636
 
                     "tree/hello.txt"])
 
507
        self.run_bzr("commit -m hello --author='John Doe <jdoe@example.com>' "
 
508
                     "tree/hello.txt")
637
509
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
638
510
        properties = last_rev.properties
639
 
        self.assertEqual(u'John D\xf6 <jdoe@example.com>', properties['authors'])
 
511
        self.assertEqual('John Doe <jdoe@example.com>', properties['author'])
640
512
 
641
513
    def test_author_no_email(self):
642
514
        """Author's name without an email address is allowed, too."""
647
519
                                "tree/hello.txt")
648
520
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
649
521
        properties = last_rev.properties
650
 
        self.assertEqual('John Doe', properties['authors'])
651
 
 
652
 
    def test_multiple_authors(self):
653
 
        """Multiple authors can be specyfied, and all are stored."""
654
 
        tree = self.make_branch_and_tree('tree')
655
 
        self.build_tree(['tree/hello.txt'])
656
 
        tree.add('hello.txt')
657
 
        out, err = self.run_bzr("commit -m hello --author='John Doe' "
658
 
                                "--author='Jane Rey' tree/hello.txt")
659
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
660
 
        properties = last_rev.properties
661
 
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
662
 
 
663
 
    def test_commit_time(self):
664
 
        tree = self.make_branch_and_tree('tree')
665
 
        self.build_tree(['tree/hello.txt'])
666
 
        tree.add('hello.txt')
667
 
        out, err = self.run_bzr("commit -m hello "
668
 
            "--commit-time='2009-10-10 08:00:00 +0100' tree/hello.txt")
669
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
670
 
        self.assertEqual(
671
 
            'Sat 2009-10-10 08:00:00 +0100',
672
 
            osutils.format_date(last_rev.timestamp, last_rev.timezone))
673
 
        
674
 
    def test_commit_time_bad_time(self):
675
 
        tree = self.make_branch_and_tree('tree')
676
 
        self.build_tree(['tree/hello.txt'])
677
 
        tree.add('hello.txt')
678
 
        out, err = self.run_bzr("commit -m hello "
679
 
            "--commit-time='NOT A TIME' tree/hello.txt", retcode=3)
680
 
        self.assertStartsWith(
681
 
            err, "bzr: ERROR: Could not parse --commit-time:")
682
 
 
683
 
    def test_partial_commit_with_renames_in_tree(self):
684
 
        # this test illustrates bug #140419
685
 
        t = self.make_branch_and_tree('.')
686
 
        self.build_tree(['dir/', 'dir/a', 'test'])
687
 
        t.add(['dir/', 'dir/a', 'test'])
688
 
        t.commit('initial commit')
689
 
        # important part: file dir/a should change parent
690
 
        # and should appear before old parent
691
 
        # then during partial commit we have error
692
 
        # parent_id {dir-XXX} not in inventory
693
 
        t.rename_one('dir/a', 'a')
694
 
        self.build_tree_contents([('test', 'changes in test')])
695
 
        # partial commit
696
 
        out, err = self.run_bzr('commit test -m "partial commit"')
697
 
        self.assertEquals('', out)
698
 
        self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
699
 
 
700
 
    def test_commit_readonly_checkout(self):
701
 
        # https://bugs.edge.launchpad.net/bzr/+bug/129701
702
 
        # "UnlockableTransport error trying to commit in checkout of readonly
703
 
        # branch"
704
 
        self.make_branch('master')
705
 
        master = BzrDir.open_from_transport(
706
 
            self.get_readonly_transport('master')).open_branch()
707
 
        master.create_checkout('checkout')
708
 
        out, err = self.run_bzr(['commit', '--unchanged', '-mfoo', 'checkout'],
709
 
            retcode=3)
710
 
        self.assertContainsRe(err,
711
 
            r'^bzr: ERROR: Cannot lock.*readonly transport')
712
 
 
713
 
    def setup_editor(self):
714
 
        # Test that commit template hooks work
715
 
        if sys.platform == "win32":
716
 
            f = file('fed.bat', 'w')
717
 
            f.write('@rem dummy fed')
718
 
            f.close()
719
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
720
 
        else:
721
 
            f = file('fed.sh', 'wb')
722
 
            f.write('#!/bin/sh\n')
723
 
            f.close()
724
 
            os.chmod('fed.sh', 0755)
725
 
            osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
726
 
 
727
 
    def setup_commit_with_template(self):
728
 
        self.setup_editor()
729
 
        msgeditor.hooks.install_named_hook("commit_message_template",
730
 
                lambda commit_obj, msg: "save me some typing\n", None)
731
 
        tree = self.make_branch_and_tree('tree')
732
 
        self.build_tree(['tree/hello.txt'])
733
 
        tree.add('hello.txt')
734
 
        return tree
735
 
 
736
 
    def test_commit_hook_template_accepted(self):
737
 
        tree = self.setup_commit_with_template()
738
 
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
739
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
740
 
        self.assertEqual('save me some typing\n', last_rev.message)
741
 
 
742
 
    def test_commit_hook_template_rejected(self):
743
 
        tree = self.setup_commit_with_template()
744
 
        expected = tree.last_revision()
745
 
        out, err = self.run_bzr_error(["empty commit message"],
746
 
            "commit tree/hello.txt", stdin="n\n")
747
 
        self.assertEqual(expected, tree.last_revision())
748
 
 
749
 
    def test_commit_without_username(self):
750
 
        """Ensure commit error if username is not set.
751
 
        """
752
 
        self.run_bzr(['init', 'foo'])
753
 
        os.chdir('foo')
754
 
        open('foo.txt', 'w').write('hello')
755
 
        self.run_bzr(['add'])
756
 
        osutils.set_or_unset_env('EMAIL', None)
757
 
        osutils.set_or_unset_env('BZR_EMAIL', None)
758
 
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
759
 
        self.assertContainsRe(err, 'Unable to determine your name')
 
522
        self.assertEqual('John Doe', properties['author'])