~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

(gz) Fix test failure on alpha by correcting format string for
 gc_chk_sha1_record (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""Tests for the commit CLI of bzr."""
19
19
 
20
 
import doctest
21
20
import os
22
21
import re
23
22
import sys
24
23
 
25
 
from testtools.matchers import DocTestMatches
26
 
 
27
24
from bzrlib import (
28
 
    config,
 
25
    bzrdir,
29
26
    osutils,
30
27
    ignores,
31
28
    msgeditor,
 
29
    osutils,
 
30
    tests,
32
31
    )
33
32
from bzrlib.bzrdir import BzrDir
34
33
from bzrlib.tests import (
35
 
    test_foreign,
36
 
    features,
 
34
    probe_bad_non_ascii,
 
35
    TestSkipped,
 
36
    UnicodeFilenameFeature,
37
37
    )
38
38
from bzrlib.tests import TestCaseWithTransport
39
39
 
47
47
        self.build_tree(['hello.txt'])
48
48
        out,err = self.run_bzr('commit -m empty', retcode=3)
49
49
        self.assertEqual('', out)
50
 
        # Two ugly bits here.
51
 
        # 1) We really don't want 'aborting commit write group' anymore.
52
 
        # 2) bzr: ERROR: is a really long line, so we wrap it with '\'
53
 
        self.assertThat(
54
 
            err,
55
 
            DocTestMatches("""\
56
 
Committing to: ...
57
 
bzr: ERROR: No changes to commit.\
58
 
 Please 'bzr add' the files you want to commit,\
59
 
 or use --unchanged to force an empty commit.
60
 
""", flags=doctest.ELLIPSIS|doctest.REPORT_UDIFF))
 
50
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
 
51
                                  ' Use --unchanged to commit anyhow.\n')
61
52
 
62
53
    def test_commit_success(self):
63
54
        """Successful commit should not leave behind a bzr-commit-* file"""
69
60
        self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
70
61
        self.assertEqual('', self.run_bzr('unknowns')[0])
71
62
 
72
 
    def test_commit_lossy_native(self):
73
 
        """A --lossy option to commit is supported."""
74
 
        self.make_branch_and_tree('.')
75
 
        self.run_bzr('commit --lossy --unchanged -m message')
76
 
        self.assertEqual('', self.run_bzr('unknowns')[0])
77
 
 
78
 
    def test_commit_lossy_foreign(self):
79
 
        test_foreign.register_dummy_foreign_for_test(self)
80
 
        self.make_branch_and_tree('.',
81
 
            format=test_foreign.DummyForeignVcsDirFormat())
82
 
        self.run_bzr('commit --lossy --unchanged -m message')
83
 
        output = self.run_bzr('revision-info')[0]
84
 
        self.assertTrue(output.startswith('1 dummy-'))
85
 
 
86
63
    def test_commit_with_path(self):
87
64
        """Commit tree with path of root specified"""
88
65
        a_tree = self.make_branch_and_tree('a')
102
79
        self.run_bzr('resolved b/a_file')
103
80
        self.run_bzr(['commit', '-m', 'merge into b', 'b'])
104
81
 
 
82
 
105
83
    def test_10_verbose_commit(self):
106
84
        """Add one file and examine verbose commit output"""
107
85
        tree = self.make_branch_and_tree('.')
135
113
    def test_unicode_commit_message_is_filename(self):
136
114
        """Unicode commit message same as a filename (Bug #563646).
137
115
        """
138
 
        self.requireFeature(features.UnicodeFilenameFeature)
 
116
        self.requireFeature(UnicodeFilenameFeature)
139
117
        file_name = u'\N{euro sign}'
140
118
        self.run_bzr(['init'])
141
119
        open(file_name, 'w').write('hello world')
329
307
        tree = self.make_branch_and_tree('.')
330
308
        self.build_tree_contents([('foo.c', 'int main() {}')])
331
309
        tree.add('foo.c')
332
 
        self.run_bzr('commit -m ""')
 
310
        self.run_bzr('commit -m ""', retcode=3)
 
311
 
 
312
    def test_unsupported_encoding_commit_message(self):
 
313
        if sys.platform == 'win32':
 
314
            raise tests.TestNotApplicable('Win32 parses arguments directly'
 
315
                ' as Unicode, so we can\'t pass invalid non-ascii')
 
316
        tree = self.make_branch_and_tree('.')
 
317
        self.build_tree_contents([('foo.c', 'int main() {}')])
 
318
        tree.add('foo.c')
 
319
        # LANG env variable has no effect on Windows
 
320
        # but some characters anyway cannot be represented
 
321
        # in default user encoding
 
322
        char = probe_bad_non_ascii(osutils.get_user_encoding())
 
323
        if char is None:
 
324
            raise TestSkipped('Cannot find suitable non-ascii character'
 
325
                'for user_encoding (%s)' % osutils.get_user_encoding())
 
326
        out,err = self.run_bzr_subprocess('commit -m "%s"' % char,
 
327
                                          retcode=1,
 
328
                                          env_changes={'LANG': 'C'})
 
329
        self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
 
330
                                    'unsupported by the current encoding.')
333
331
 
334
332
    def test_other_branch_commit(self):
335
333
        # this branch is to ensure consistent behaviour, whether we're run
596
594
            'commit -m add-b --fixes=xxx:123',
597
595
            working_dir='tree')
598
596
 
599
 
    def test_fixes_bug_with_default_tracker(self):
600
 
        """commit --fixes=234 uses the default bug tracker."""
601
 
        tree = self.make_branch_and_tree('tree')
602
 
        self.build_tree(['tree/hello.txt'])
603
 
        tree.add('hello.txt')
604
 
        self.run_bzr_error(
605
 
            ["bzr: ERROR: No tracker specified for bug 123. Use the form "
606
 
            "'tracker:id' or specify a default bug tracker using the "
607
 
            "`bugtracker` option.\n"
608
 
            "See \"bzr help bugs\" for more information on this feature. "
609
 
            "Commit refused."],
610
 
            'commit -m add-b --fixes=123',
611
 
            working_dir='tree')
612
 
        tree.branch.get_config().set_user_option("bugtracker", "lp")
613
 
        self.run_bzr('commit -m hello --fixes=234 tree/hello.txt')
614
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
615
 
        self.assertEqual('https://launchpad.net/bugs/234 fixed',
616
 
                         last_rev.properties['bugs'])
617
 
 
618
597
    def test_fixes_invalid_bug_number(self):
619
598
        tree = self.make_branch_and_tree('tree')
620
599
        self.build_tree(['tree/hello.txt'])
632
611
        self.build_tree(['tree/hello.txt'])
633
612
        tree.add('hello.txt')
634
613
        self.run_bzr_error(
635
 
            [r"Invalid bug orange:apples:bananas. Must be in the form of "
636
 
             r"'tracker:id'\. See \"bzr help bugs\" for more information on "
637
 
             r"this feature.\nCommit refused\."],
638
 
            'commit -m add-b --fixes=orange:apples:bananas',
 
614
            [r"Invalid bug orange. Must be in the form of 'tracker:id'\. "
 
615
             r"See \"bzr help bugs\" for more information on this feature.\n"
 
616
             r"Commit refused\."],
 
617
            'commit -m add-b --fixes=orange',
639
618
            working_dir='tree')
640
619
 
641
620
    def test_no_author(self):
757
736
        tree.add('hello.txt')
758
737
        return tree
759
738
 
760
 
    def test_edit_empty_message(self):
761
 
        tree = self.make_branch_and_tree('tree')
762
 
        self.setup_editor()
763
 
        self.build_tree(['tree/hello.txt'])
764
 
        tree.add('hello.txt')
765
 
        out, err = self.run_bzr("commit tree/hello.txt", retcode=3,
766
 
            stdin="y\n")
767
 
        self.assertContainsRe(err,
768
 
            "bzr: ERROR: Empty commit message specified")
769
 
 
770
739
    def test_commit_hook_template_accepted(self):
771
740
        tree = self.setup_commit_with_template()
772
741
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
776
745
    def test_commit_hook_template_rejected(self):
777
746
        tree = self.setup_commit_with_template()
778
747
        expected = tree.last_revision()
779
 
        out, err = self.run_bzr_error(["Empty commit message specified."
780
 
                  " Please specify a commit message with either"
781
 
                  " --message or --file or leave a blank message"
782
 
                  " with --message \"\"."],
 
748
        out, err = self.run_bzr_error(["empty commit message"],
783
749
            "commit tree/hello.txt", stdin="n\n")
784
750
        self.assertEqual(expected, tree.last_revision())
785
751
 
786
 
    def test_set_commit_message(self):
787
 
        msgeditor.hooks.install_named_hook("set_commit_message",
788
 
                lambda commit_obj, msg: "save me some typing\n", None)
789
 
        tree = self.make_branch_and_tree('tree')
790
 
        self.build_tree(['tree/hello.txt'])
791
 
        tree.add('hello.txt')
792
 
        out, err = self.run_bzr("commit tree/hello.txt")
793
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
794
 
        self.assertEqual('save me some typing\n', last_rev.message)
795
 
 
796
752
    def test_commit_without_username(self):
797
753
        """Ensure commit error if username is not set.
798
754
        """
802
758
        self.run_bzr(['add'])
803
759
        self.overrideEnv('EMAIL', None)
804
760
        self.overrideEnv('BZR_EMAIL', None)
805
 
        # Also, make sure that it's not inferred from mailname.
806
 
        self.overrideAttr(config, '_auto_user_id',
807
 
            lambda: (None, None))
808
761
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
809
762
        self.assertContainsRe(err, 'Unable to determine your name')
810
763
 
821
774
        self.assertEqual(out, '')
822
775
        self.assertContainsRe(err,
823
776
            'Branch.*test_checkout.*appears to be bound to itself')
 
777