/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: Robert Collins
  • Date: 2007-10-04 05:30:08 UTC
  • mfrom: (2881.1.1 knits)
  • mto: This revision was merged to the branch mainline in revision 2885.
  • Revision ID: robertc@robertcollins.net-20071004053008-aquje8fyntc8q69h
Fix knit test fallout from final readv api change.

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
23
    osutils,
26
24
    ignores,
27
 
    msgeditor,
28
 
    osutils,
29
 
    tests,
30
25
    )
31
26
from bzrlib.bzrdir import BzrDir
32
 
from bzrlib.tests import (
33
 
    probe_bad_non_ascii,
34
 
    TestSkipped,
35
 
    )
36
27
from bzrlib.tests.blackbox import ExternalBase
37
28
 
38
29
 
45
36
        self.build_tree(['hello.txt'])
46
37
        out,err = self.run_bzr('commit -m empty', retcode=3)
47
38
        self.assertEqual('', out)
48
 
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
49
 
                                  ' Use --unchanged to commit anyhow.\n')
 
39
        self.assertContainsRe(err, 'bzr: ERROR: no changes to commit\.'
 
40
                                  ' use --unchanged to commit anyhow\n')
50
41
 
51
42
    def test_commit_success(self):
52
43
        """Successful commit should not leave behind a bzr-commit-* file"""
85
76
        tree.add("hello.txt")
86
77
        out,err = self.run_bzr('commit -m added')
87
78
        self.assertEqual('', out)
88
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
79
        self.assertContainsRe(err, '^Committing revision 1 to ".*"\.\n'
89
80
                              'added hello.txt\n'
90
81
                              'Committed revision 1.\n$',)
91
82
 
104
95
        self.build_tree_contents([('hello.txt', 'new contents')])
105
96
        out, err = self.run_bzr('commit -m modified')
106
97
        self.assertEqual('', out)
107
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
98
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
108
99
                              'modified hello\.txt\n'
109
100
                              'Committed revision 2\.\n$')
110
101
 
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
102
    def test_verbose_commit_renamed(self):
154
103
        # Verbose commit of renamed file should say so
155
104
        wt = self.prepare_simple_history()
156
105
        wt.rename_one('hello.txt', 'gutentag.txt')
157
106
        out, err = self.run_bzr('commit -m renamed')
158
107
        self.assertEqual('', out)
159
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
108
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
160
109
                              'renamed hello\.txt => gutentag\.txt\n'
161
110
                              'Committed revision 2\.$\n')
162
111
 
168
117
        wt.rename_one('hello.txt', 'subdir/hello.txt')
169
118
        out, err = self.run_bzr('commit -m renamed')
170
119
        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')))
 
120
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
 
121
                              'added subdir\n'
 
122
                              'renamed hello\.txt => subdir/hello\.txt\n'
 
123
                              'Committed revision 2\.\n$')
178
124
 
179
125
    def test_verbose_commit_with_unknown(self):
180
126
        """Unknown files should not be listed by default in verbose output"""
184
130
        wt.add(['hello.txt'])
185
131
        out,err = self.run_bzr('commit -m added')
186
132
        self.assertEqual('', out)
187
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
133
        self.assertContainsRe(err, '^Committing revision 1 to ".*"\.\n'
188
134
                              'added hello\.txt\n'
189
135
                              'Committed revision 1\.\n$')
190
136
 
197
143
        tree.add("hello.txt")
198
144
        out,err = self.run_bzr('commit -m added')
199
145
        self.assertEqual('', out)
200
 
        self.assertContainsRe(err, '^Committing to: .*\n'
 
146
        self.assertContainsRe(err, '^Committing revision 2 to ".*"\.\n'
201
147
                              'added hello\.txt\n'
202
148
                              'Committed revision 2\.$\n')
203
149
 
211
157
        b_tree = a_tree.branch.create_checkout('b')
212
158
        expected = "%s/" % (osutils.abspath('a'), )
213
159
        out, err = self.run_bzr('commit -m blah --unchanged', working_dir='b')
214
 
        self.assertEqual(err, 'Committing to: %s\n'
 
160
        self.assertEqual(err, 'Committing revision 2 to "%s".\n'
215
161
                         'Committed revision 2.\n' % expected)
216
162
 
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
163
    def test_commit_merge_reports_all_modified_files(self):
236
164
        # the commit command should show all the files that are shown by
237
165
        # bzr diff or bzr status when committing, even when they were not
285
213
        os.chdir('this')
286
214
        out,err = self.run_bzr('commit -m added')
287
215
        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')))
 
216
        expected = '%s/' % (osutils.getcwd(), )
 
217
        self.assertEqualDiff(
 
218
            'Committing revision 2 to "%s".\n'
 
219
            'modified filetomodify\n'
 
220
            'added newdir\n'
 
221
            'added newfile\n'
 
222
            'renamed dirtorename => renameddir\n'
 
223
            'renamed filetorename => renamedfile\n'
 
224
            'renamed dirtoreparent => renameddir/reparenteddir\n'
 
225
            'renamed filetoreparent => renameddir/reparentedfile\n'
 
226
            'deleted dirtoremove\n'
 
227
            'deleted filetoremove\n'
 
228
            'Committed revision 2.\n' % (expected, ),
 
229
            err)
302
230
 
303
231
    def test_empty_commit_message(self):
304
232
        tree = self.make_branch_and_tree('.')
307
235
        self.run_bzr('commit -m ""', retcode=3)
308
236
 
309
237
    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
238
        tree = self.make_branch_and_tree('.')
314
239
        self.build_tree_contents([('foo.c', 'int main() {}')])
315
240
        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'})
 
241
        out,err = self.run_bzr_subprocess('commit -m "\xff"', retcode=1,
 
242
                                                    env_changes={'LANG': 'C'})
326
243
        self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
327
244
                                    'unsupported by the current encoding.')
328
245
 
334
251
        self.build_tree_contents([
335
252
            ('branch/foo.c', 'int main() {}'),
336
253
            ('branch/bar.c', 'int main() {}')])
337
 
        inner_tree.add(['foo.c', 'bar.c'])
 
254
        inner_tree.add('foo.c')
 
255
        inner_tree.add('bar.c')
338
256
        # can't commit files in different trees; sane error
339
257
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
340
 
        # can commit to branch - records foo.c only
341
258
        self.run_bzr('commit -m newstuff branch/foo.c')
342
 
        # can commit to branch - records bar.c
343
259
        self.run_bzr('commit -m newstuff branch')
344
 
        # No changes left
345
 
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
 
260
        self.run_bzr('commit -m newstuff branch', retcode=3)
346
261
 
347
262
    def test_out_of_date_tree_commit(self):
348
263
        # check we get an error code and a clear message committing with an out
372
287
    def test_commit_a_text_merge_in_a_checkout(self):
373
288
        # checkouts perform multiple actions in a transaction across bond
374
289
        # 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
 
290
        # past. This is a user story reported to fail in bug #43959 where 
376
291
        # a merge done in a checkout (using the update command) failed to
377
292
        # commit correctly.
378
293
        trunk = self.make_branch_and_tree('trunk')
379
294
 
380
295
        u1 = trunk.branch.create_checkout('u1')
381
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
296
        self.build_tree_contents([('u1/hosts', 'initial contents')])
382
297
        u1.add('hosts')
383
298
        self.run_bzr('commit -m add-hosts u1')
384
299
 
385
300
        u2 = trunk.branch.create_checkout('u2')
386
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
301
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
387
302
        self.run_bzr('commit -m checkin-from-u2 u2')
388
303
 
389
304
        # make an offline commits
390
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
305
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
391
306
        self.run_bzr('commit -m checkin-offline --local u1')
392
307
 
393
308
        # now try to pull in online work from u2, and then commit our offline
394
309
        # work as a merge
395
310
        # retcode 1 as we expect a text conflict
396
311
        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
312
        self.run_bzr('resolved u1/hosts')
407
313
        # add a text change here to represent resolving the merge conflicts in
408
314
        # favour of a new version of the file not identical to either the u1
410
316
        self.build_tree_contents([('u1/hosts', 'merge resolution\n')])
411
317
        self.run_bzr('commit -m checkin-merge-of-the-offline-work-from-u1 u1')
412
318
 
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
319
    def test_commit_respects_spec_for_removals(self):
443
320
        """Commit with a file spec should only commit removals that match"""
444
321
        t = self.make_branch_and_tree('.')
471
348
 
472
349
        # With no changes, it should just be 'no changes'
473
350
        # Make sure that commit is failing because there is nothing to do
474
 
        self.run_bzr_error(['No changes to commit'],
 
351
        self.run_bzr_error(['no changes to commit'],
475
352
                           'commit --strict -m no-changes',
476
353
                           working_dir='tree')
477
354
 
505
382
        output, err = self.run_bzr(
506
383
            'commit -m hello --fixes=lp:23452 tree/hello.txt')
507
384
        self.assertEqual('', output)
508
 
        self.assertContainsRe(err, 'Committing to: .*\n'
 
385
        self.assertContainsRe(err, 'Committing revision 1 to ".*"\.\n'
509
386
                              'added hello\.txt\n'
510
387
                              'Committed revision 1\.\n')
511
388
 
596
473
        self.build_tree(['tree/hello.txt'])
597
474
        tree.add('hello.txt')
598
475
        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."],
 
476
            ["Invalid bug identifier for %s. Commit refused." % 'lp:orange'],
602
477
            'commit -m add-b --fixes=lp:orange',
603
478
            working_dir='tree')
604
479
 
608
483
        self.build_tree(['tree/hello.txt'])
609
484
        tree.add('hello.txt')
610
485
        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"
 
486
            [r"Invalid bug orange. Must be in the form of 'tag:id'\. "
613
487
             r"Commit refused\."],
614
488
            'commit -m add-b --fixes=orange',
615
489
            working_dir='tree')
631
505
        tree = self.make_branch_and_tree('tree')
632
506
        self.build_tree(['tree/hello.txt'])
633
507
        tree.add('hello.txt')
634
 
        self.run_bzr(["commit", '-m', 'hello',
635
 
                      '--author', u'John D\xf6 <jdoe@example.com>',
636
 
                     "tree/hello.txt"])
 
508
        self.run_bzr("commit -m hello --author='John Doe <jdoe@example.com>' "
 
509
                     "tree/hello.txt")
637
510
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
638
511
        properties = last_rev.properties
639
 
        self.assertEqual(u'John D\xf6 <jdoe@example.com>', properties['authors'])
 
512
        self.assertEqual('John Doe <jdoe@example.com>', properties['author'])
640
513
 
641
514
    def test_author_no_email(self):
642
515
        """Author's name without an email address is allowed, too."""
647
520
                                "tree/hello.txt")
648
521
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
649
522
        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:")
 
523
        self.assertEqual('John Doe', properties['author'])
682
524
 
683
525
    def test_partial_commit_with_renames_in_tree(self):
684
526
        # this test illustrates bug #140419
696
538
        out, err = self.run_bzr('commit test -m "partial commit"')
697
539
        self.assertEquals('', out)
698
540
        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')