~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

(jameinel) Allow 'bzr serve' to interpret SIGHUP as a graceful shutdown.
 (bug #795025) (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2011 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
17
17
 
18
18
"""Tests for the commit CLI of bzr."""
19
19
 
 
20
import doctest
20
21
import os
21
22
import re
22
23
import sys
23
24
 
 
25
from testtools.matchers import DocTestMatches
 
26
 
24
27
from bzrlib import (
25
 
    bzrdir,
 
28
    config,
26
29
    osutils,
27
30
    ignores,
28
31
    msgeditor,
29
 
    osutils,
30
 
    tests,
31
32
    )
32
33
from bzrlib.bzrdir import BzrDir
33
34
from bzrlib.tests import (
34
 
    probe_bad_non_ascii,
35
 
    TestSkipped,
36
 
    UnicodeFilenameFeature,
 
35
    test_foreign,
 
36
    features,
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
 
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
51
 
                                  ' Use --unchanged to commit anyhow.\n')
 
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))
52
61
 
53
62
    def test_commit_success(self):
54
63
        """Successful commit should not leave behind a bzr-commit-* file"""
60
69
        self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
61
70
        self.assertEqual('', self.run_bzr('unknowns')[0])
62
71
 
 
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
 
63
86
    def test_commit_with_path(self):
64
87
        """Commit tree with path of root specified"""
65
88
        a_tree = self.make_branch_and_tree('a')
79
102
        self.run_bzr('resolved b/a_file')
80
103
        self.run_bzr(['commit', '-m', 'merge into b', 'b'])
81
104
 
82
 
 
83
105
    def test_10_verbose_commit(self):
84
106
        """Add one file and examine verbose commit output"""
85
107
        tree = self.make_branch_and_tree('.')
113
135
    def test_unicode_commit_message_is_filename(self):
114
136
        """Unicode commit message same as a filename (Bug #563646).
115
137
        """
116
 
        self.requireFeature(UnicodeFilenameFeature)
 
138
        self.requireFeature(features.UnicodeFilenameFeature)
117
139
        file_name = u'\N{euro sign}'
118
140
        self.run_bzr(['init'])
119
141
        open(file_name, 'w').write('hello world')
307
329
        tree = self.make_branch_and_tree('.')
308
330
        self.build_tree_contents([('foo.c', 'int main() {}')])
309
331
        tree.add('foo.c')
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.')
 
332
        self.run_bzr('commit -m ""')
331
333
 
332
334
    def test_other_branch_commit(self):
333
335
        # this branch is to ensure consistent behaviour, whether we're run
594
596
            'commit -m add-b --fixes=xxx:123',
595
597
            working_dir='tree')
596
598
 
 
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
 
597
618
    def test_fixes_invalid_bug_number(self):
598
619
        tree = self.make_branch_and_tree('tree')
599
620
        self.build_tree(['tree/hello.txt'])
611
632
        self.build_tree(['tree/hello.txt'])
612
633
        tree.add('hello.txt')
613
634
        self.run_bzr_error(
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',
 
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',
618
639
            working_dir='tree')
619
640
 
620
641
    def test_no_author(self):
719
740
            f = file('fed.bat', 'w')
720
741
            f.write('@rem dummy fed')
721
742
            f.close()
722
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
743
            self.overrideEnv('BZR_EDITOR', "fed.bat")
723
744
        else:
724
745
            f = file('fed.sh', 'wb')
725
746
            f.write('#!/bin/sh\n')
726
747
            f.close()
727
748
            os.chmod('fed.sh', 0755)
728
 
            osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
749
            self.overrideEnv('BZR_EDITOR', "./fed.sh")
729
750
 
730
751
    def setup_commit_with_template(self):
731
752
        self.setup_editor()
736
757
        tree.add('hello.txt')
737
758
        return tree
738
759
 
 
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
 
739
770
    def test_commit_hook_template_accepted(self):
740
771
        tree = self.setup_commit_with_template()
741
772
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
745
776
    def test_commit_hook_template_rejected(self):
746
777
        tree = self.setup_commit_with_template()
747
778
        expected = tree.last_revision()
748
 
        out, err = self.run_bzr_error(["empty commit message"],
 
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 \"\"."],
749
783
            "commit tree/hello.txt", stdin="n\n")
750
784
        self.assertEqual(expected, tree.last_revision())
751
785
 
 
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
 
752
796
    def test_commit_without_username(self):
753
797
        """Ensure commit error if username is not set.
754
798
        """
756
800
        os.chdir('foo')
757
801
        open('foo.txt', 'w').write('hello')
758
802
        self.run_bzr(['add'])
759
 
        osutils.set_or_unset_env('EMAIL', None)
760
 
        osutils.set_or_unset_env('BZR_EMAIL', None)
 
803
        self.overrideEnv('EMAIL', None)
 
804
        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))
761
808
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
762
809
        self.assertContainsRe(err, 'Unable to determine your name')
763
810
 
774
821
        self.assertEqual(out, '')
775
822
        self.assertContainsRe(err,
776
823
            'Branch.*test_checkout.*appears to be bound to itself')
777