/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: Martin von Gagern
  • Date: 2010-04-20 08:47:38 UTC
  • mfrom: (5167 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5195.
  • Revision ID: martin.vgagern@gmx.net-20100420084738-ygymnqmdllzrhpfn
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2006-2010 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
 
18
18
"""Tests for the commit CLI of bzr."""
20
20
import os
21
21
import sys
22
22
 
23
 
import bzrlib
24
23
from bzrlib import (
25
24
    osutils,
26
25
    ignores,
 
26
    msgeditor,
27
27
    osutils,
 
28
    tests,
28
29
    )
29
30
from bzrlib.bzrdir import BzrDir
30
31
from bzrlib.tests import (
43
44
        self.build_tree(['hello.txt'])
44
45
        out,err = self.run_bzr('commit -m empty', retcode=3)
45
46
        self.assertEqual('', out)
46
 
        self.assertContainsRe(err, 'bzr: ERROR: no changes to commit\.'
47
 
                                  ' use --unchanged to commit anyhow\n')
 
47
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
 
48
                                  ' Use --unchanged to commit anyhow.\n')
48
49
 
49
50
    def test_commit_success(self):
50
51
        """Successful commit should not leave behind a bzr-commit-* file"""
106
107
                              'modified hello\.txt\n'
107
108
                              'Committed revision 2\.\n$')
108
109
 
 
110
    def test_warn_about_forgotten_commit_message(self):
 
111
        """Test that the lack of -m parameter is caught"""
 
112
        wt = self.make_branch_and_tree('.')
 
113
        self.build_tree(['one', 'two'])
 
114
        wt.add(['two'])
 
115
        out, err = self.run_bzr('commit -m one two')
 
116
        self.assertContainsRe(err, "The commit message is a file name")
 
117
 
109
118
    def test_verbose_commit_renamed(self):
110
119
        # Verbose commit of renamed file should say so
111
120
        wt = self.prepare_simple_history()
124
133
        wt.rename_one('hello.txt', 'subdir/hello.txt')
125
134
        out, err = self.run_bzr('commit -m renamed')
126
135
        self.assertEqual('', out)
127
 
        self.assertContainsRe(err, '^Committing to: .*\n'
128
 
                              'added subdir\n'
129
 
                              'renamed hello\.txt => subdir/hello\.txt\n'
130
 
                              'Committed revision 2\.\n$')
 
136
        self.assertEqual(set([
 
137
            'Committing to: %s/' % osutils.getcwd(),
 
138
            'added subdir',
 
139
            'renamed hello.txt => subdir/hello.txt',
 
140
            'Committed revision 2.',
 
141
            '',
 
142
            ]), set(err.split('\n')))
131
143
 
132
144
    def test_verbose_commit_with_unknown(self):
133
145
        """Unknown files should not be listed by default in verbose output"""
167
179
        self.assertEqual(err, 'Committing to: %s\n'
168
180
                         'Committed revision 2.\n' % expected)
169
181
 
 
182
    def test_commit_sanitizes_CR_in_message(self):
 
183
        # See bug #433779, basically Emacs likes to pass '\r\n' style line
 
184
        # endings to 'bzr commit -m ""' which breaks because we don't allow
 
185
        # '\r' in commit messages. (Mostly because of issues where XML style
 
186
        # formats arbitrarily strip it out of the data while parsing.)
 
187
        # To make life easier for users, we just always translate '\r\n' =>
 
188
        # '\n'. And '\r' => '\n'.
 
189
        a_tree = self.make_branch_and_tree('a')
 
190
        self.build_tree(['a/b'])
 
191
        a_tree.add('b')
 
192
        self.run_bzr(['commit',
 
193
                      '-m', 'a string\r\n\r\nwith mixed\r\rendings\n'],
 
194
                     working_dir='a')
 
195
        rev_id = a_tree.branch.last_revision()
 
196
        rev = a_tree.branch.repository.get_revision(rev_id)
 
197
        self.assertEqualDiff('a string\n\nwith mixed\n\nendings\n',
 
198
                             rev.message)
 
199
 
170
200
    def test_commit_merge_reports_all_modified_files(self):
171
201
        # the commit command should show all the files that are shown by
172
202
        # bzr diff or bzr status when committing, even when they were not
220
250
        os.chdir('this')
221
251
        out,err = self.run_bzr('commit -m added')
222
252
        self.assertEqual('', out)
223
 
        expected = '%s/' % (osutils.getcwd(), )
224
 
        self.assertEqualDiff(
225
 
            'Committing to: %s\n'
226
 
            'modified filetomodify\n'
227
 
            'added newdir\n'
228
 
            'added newfile\n'
229
 
            'renamed dirtorename => renameddir\n'
230
 
            'renamed filetorename => renamedfile\n'
231
 
            'renamed dirtoreparent => renameddir/reparenteddir\n'
232
 
            'renamed filetoreparent => renameddir/reparentedfile\n'
233
 
            'deleted dirtoremove\n'
234
 
            'deleted filetoremove\n'
235
 
            'Committed revision 2.\n' % (expected, ),
236
 
            err)
 
253
        self.assertEqual(set([
 
254
            'Committing to: %s/' % osutils.getcwd(),
 
255
            'modified filetomodify',
 
256
            'added newdir',
 
257
            'added newfile',
 
258
            'renamed dirtorename => renameddir',
 
259
            'renamed filetorename => renamedfile',
 
260
            'renamed dirtoreparent => renameddir/reparenteddir',
 
261
            'renamed filetoreparent => renameddir/reparentedfile',
 
262
            'deleted dirtoremove',
 
263
            'deleted filetoremove',
 
264
            'Committed revision 2.',
 
265
            ''
 
266
            ]), set(err.split('\n')))
237
267
 
238
268
    def test_empty_commit_message(self):
239
269
        tree = self.make_branch_and_tree('.')
242
272
        self.run_bzr('commit -m ""', retcode=3)
243
273
 
244
274
    def test_unsupported_encoding_commit_message(self):
 
275
        if sys.platform == 'win32':
 
276
            raise tests.TestNotApplicable('Win32 parses arguments directly'
 
277
                ' as Unicode, so we can\'t pass invalid non-ascii')
245
278
        tree = self.make_branch_and_tree('.')
246
279
        self.build_tree_contents([('foo.c', 'int main() {}')])
247
280
        tree.add('foo.c')
248
281
        # LANG env variable has no effect on Windows
249
282
        # but some characters anyway cannot be represented
250
283
        # in default user encoding
251
 
        char = probe_bad_non_ascii(bzrlib.user_encoding)
 
284
        char = probe_bad_non_ascii(osutils.get_user_encoding())
252
285
        if char is None:
253
286
            raise TestSkipped('Cannot find suitable non-ascii character'
254
 
                'for user_encoding (%s)' % bzrlib.user_encoding)
 
287
                'for user_encoding (%s)' % osutils.get_user_encoding())
255
288
        out,err = self.run_bzr_subprocess('commit -m "%s"' % char,
256
289
                                          retcode=1,
257
290
                                          env_changes={'LANG': 'C'})
266
299
        self.build_tree_contents([
267
300
            ('branch/foo.c', 'int main() {}'),
268
301
            ('branch/bar.c', 'int main() {}')])
269
 
        inner_tree.add('foo.c')
270
 
        inner_tree.add('bar.c')
 
302
        inner_tree.add(['foo.c', 'bar.c'])
271
303
        # can't commit files in different trees; sane error
272
304
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
 
305
        # can commit to branch - records foo.c only
273
306
        self.run_bzr('commit -m newstuff branch/foo.c')
 
307
        # can commit to branch - records bar.c
274
308
        self.run_bzr('commit -m newstuff branch')
275
 
        self.run_bzr('commit -m newstuff branch', retcode=3)
 
309
        # No changes left
 
310
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
276
311
 
277
312
    def test_out_of_date_tree_commit(self):
278
313
        # check we get an error code and a clear message committing with an out
302
337
    def test_commit_a_text_merge_in_a_checkout(self):
303
338
        # checkouts perform multiple actions in a transaction across bond
304
339
        # branches and their master, and have been observed to fail in the
305
 
        # past. This is a user story reported to fail in bug #43959 where 
 
340
        # past. This is a user story reported to fail in bug #43959 where
306
341
        # a merge done in a checkout (using the update command) failed to
307
342
        # commit correctly.
308
343
        trunk = self.make_branch_and_tree('trunk')
309
344
 
310
345
        u1 = trunk.branch.create_checkout('u1')
311
 
        self.build_tree_contents([('u1/hosts', 'initial contents')])
 
346
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
312
347
        u1.add('hosts')
313
348
        self.run_bzr('commit -m add-hosts u1')
314
349
 
315
350
        u2 = trunk.branch.create_checkout('u2')
316
 
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
 
351
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
317
352
        self.run_bzr('commit -m checkin-from-u2 u2')
318
353
 
319
354
        # make an offline commits
320
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
 
355
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
321
356
        self.run_bzr('commit -m checkin-offline --local u1')
322
357
 
323
358
        # now try to pull in online work from u2, and then commit our offline
324
359
        # work as a merge
325
360
        # retcode 1 as we expect a text conflict
326
361
        self.run_bzr('update u1', retcode=1)
 
362
        self.assertFileEqual('''\
 
363
<<<<<<< TREE
 
364
first offline change in u1
 
365
=======
 
366
altered in u2
 
367
>>>>>>> MERGE-SOURCE
 
368
''',
 
369
                             'u1/hosts')
 
370
 
327
371
        self.run_bzr('resolved u1/hosts')
328
372
        # add a text change here to represent resolving the merge conflicts in
329
373
        # favour of a new version of the file not identical to either the u1
392
436
 
393
437
        # With no changes, it should just be 'no changes'
394
438
        # Make sure that commit is failing because there is nothing to do
395
 
        self.run_bzr_error(['no changes to commit'],
 
439
        self.run_bzr_error(['No changes to commit'],
396
440
                           'commit --strict -m no-changes',
397
441
                           working_dir='tree')
398
442
 
517
561
        self.build_tree(['tree/hello.txt'])
518
562
        tree.add('hello.txt')
519
563
        self.run_bzr_error(
520
 
            ["Invalid bug identifier for %s. Commit refused." % 'lp:orange'],
 
564
            ["Did not understand bug identifier orange: Must be an integer. "
 
565
             "See \"bzr help bugs\" for more information on this feature.\n"
 
566
             "Commit refused."],
521
567
            'commit -m add-b --fixes=lp:orange',
522
568
            working_dir='tree')
523
569
 
527
573
        self.build_tree(['tree/hello.txt'])
528
574
        tree.add('hello.txt')
529
575
        self.run_bzr_error(
530
 
            [r"Invalid bug orange. Must be in the form of 'tag:id'\. "
 
576
            [r"Invalid bug orange. Must be in the form of 'tracker:id'\. "
 
577
             r"See \"bzr help bugs\" for more information on this feature.\n"
531
578
             r"Commit refused\."],
532
579
            'commit -m add-b --fixes=orange',
533
580
            working_dir='tree')
554
601
                     "tree/hello.txt"])
555
602
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
556
603
        properties = last_rev.properties
557
 
        self.assertEqual(u'John D\xf6 <jdoe@example.com>', properties['author'])
 
604
        self.assertEqual(u'John D\xf6 <jdoe@example.com>', properties['authors'])
558
605
 
559
606
    def test_author_no_email(self):
560
607
        """Author's name without an email address is allowed, too."""
565
612
                                "tree/hello.txt")
566
613
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
567
614
        properties = last_rev.properties
568
 
        self.assertEqual('John Doe', properties['author'])
 
615
        self.assertEqual('John Doe', properties['authors'])
 
616
 
 
617
    def test_multiple_authors(self):
 
618
        """Multiple authors can be specyfied, and all are stored."""
 
619
        tree = self.make_branch_and_tree('tree')
 
620
        self.build_tree(['tree/hello.txt'])
 
621
        tree.add('hello.txt')
 
622
        out, err = self.run_bzr("commit -m hello --author='John Doe' "
 
623
                                "--author='Jane Rey' tree/hello.txt")
 
624
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
 
625
        properties = last_rev.properties
 
626
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
 
627
 
 
628
    def test_commit_time(self):
 
629
        tree = self.make_branch_and_tree('tree')
 
630
        self.build_tree(['tree/hello.txt'])
 
631
        tree.add('hello.txt')
 
632
        out, err = self.run_bzr("commit -m hello "
 
633
            "--commit-time='2009-10-10 08:00:00 +0100' tree/hello.txt")
 
634
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
 
635
        self.assertEqual(
 
636
            'Sat 2009-10-10 08:00:00 +0100',
 
637
            osutils.format_date(last_rev.timestamp, last_rev.timezone))
 
638
        
 
639
    def test_commit_time_bad_time(self):
 
640
        tree = self.make_branch_and_tree('tree')
 
641
        self.build_tree(['tree/hello.txt'])
 
642
        tree.add('hello.txt')
 
643
        out, err = self.run_bzr("commit -m hello "
 
644
            "--commit-time='NOT A TIME' tree/hello.txt", retcode=3)
 
645
        self.assertStartsWith(
 
646
            err, "bzr: ERROR: Could not parse --commit-time:")
569
647
 
570
648
    def test_partial_commit_with_renames_in_tree(self):
571
649
        # this test illustrates bug #140419
596
674
            retcode=3)
597
675
        self.assertContainsRe(err,
598
676
            r'^bzr: ERROR: Cannot lock.*readonly transport')
 
677
 
 
678
    def setup_editor(self):
 
679
        # Test that commit template hooks work
 
680
        if sys.platform == "win32":
 
681
            f = file('fed.bat', 'w')
 
682
            f.write('@rem dummy fed')
 
683
            f.close()
 
684
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
685
        else:
 
686
            f = file('fed.sh', 'wb')
 
687
            f.write('#!/bin/sh\n')
 
688
            f.close()
 
689
            os.chmod('fed.sh', 0755)
 
690
            osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
691
 
 
692
    def setup_commit_with_template(self):
 
693
        self.setup_editor()
 
694
        msgeditor.hooks.install_named_hook("commit_message_template",
 
695
                lambda commit_obj, msg: "save me some typing\n", None)
 
696
        tree = self.make_branch_and_tree('tree')
 
697
        self.build_tree(['tree/hello.txt'])
 
698
        tree.add('hello.txt')
 
699
        return tree
 
700
 
 
701
    def test_commit_hook_template_accepted(self):
 
702
        tree = self.setup_commit_with_template()
 
703
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
 
704
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
 
705
        self.assertEqual('save me some typing\n', last_rev.message)
 
706
 
 
707
    def test_commit_hook_template_rejected(self):
 
708
        tree = self.setup_commit_with_template()
 
709
        expected = tree.last_revision()
 
710
        out, err = self.run_bzr_error(["empty commit message"],
 
711
            "commit tree/hello.txt", stdin="n\n")
 
712
        self.assertEqual(expected, tree.last_revision())