1
# Copyright (C) 2006-2011 Canonical Ltd
1
# Copyright (C) 2006-2010 Canonical Ltd
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
18
18
"""Tests for the commit CLI of bzr."""
25
from testtools.matchers import DocTestMatches
27
24
from bzrlib import (
33
31
from bzrlib.bzrdir import BzrDir
34
32
from bzrlib.tests import (
38
from bzrlib.tests import TestCaseWithTransport
41
class TestCommit(TestCaseWithTransport):
36
from bzrlib.tests.blackbox import ExternalBase
39
class TestCommit(ExternalBase):
43
41
def test_05_empty_commit(self):
44
42
"""Commit of tree with no versioned files should fail"""
47
45
self.build_tree(['hello.txt'])
48
46
out,err = self.run_bzr('commit -m empty', retcode=3)
49
47
self.assertEqual('', out)
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 '\'
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))
48
self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
49
' Use --unchanged to commit anyhow.\n')
62
51
def test_commit_success(self):
63
52
"""Successful commit should not leave behind a bzr-commit-* file"""
69
58
self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
70
59
self.assertEqual('', self.run_bzr('unknowns')[0])
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])
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-'))
86
61
def test_commit_with_path(self):
87
62
"""Commit tree with path of root specified"""
88
63
a_tree = self.make_branch_and_tree('a')
102
77
self.run_bzr('resolved b/a_file')
103
78
self.run_bzr(['commit', '-m', 'merge into b', 'b'])
105
81
def test_10_verbose_commit(self):
106
82
"""Add one file and examine verbose commit output"""
107
83
tree = self.make_branch_and_tree('.')
135
111
def test_unicode_commit_message_is_filename(self):
136
112
"""Unicode commit message same as a filename (Bug #563646).
138
self.requireFeature(features.UnicodeFilenameFeature)
139
114
file_name = u'\N{euro sign}'
140
115
self.run_bzr(['init'])
141
116
open(file_name, 'w').write('hello world')
154
129
# by ui.text.show_warning
155
130
default_get_terminal_enc = osutils.get_terminal_encoding
157
osutils.get_terminal_encoding = lambda trace=None: 'ascii'
132
osutils.get_terminal_encoding = lambda: 'ascii'
158
133
file_name = u'foo\u1234'
159
134
open(file_name, 'w').write('hello world')
160
135
self.run_bzr(['add'])
329
304
tree = self.make_branch_and_tree('.')
330
305
self.build_tree_contents([('foo.c', 'int main() {}')])
331
306
tree.add('foo.c')
332
self.run_bzr('commit -m ""')
307
self.run_bzr('commit -m ""', retcode=3)
309
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
tree = self.make_branch_and_tree('.')
314
self.build_tree_contents([('foo.c', 'int main() {}')])
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())
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,
325
env_changes={'LANG': 'C'})
326
self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
327
'unsupported by the current encoding.')
334
329
def test_other_branch_commit(self):
335
330
# this branch is to ensure consistent behaviour, whether we're run
596
591
'commit -m add-b --fixes=xxx:123',
597
592
working_dir='tree')
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')
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. "
610
'commit -m add-b --fixes=123',
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'])
618
594
def test_fixes_invalid_bug_number(self):
619
595
tree = self.make_branch_and_tree('tree')
620
596
self.build_tree(['tree/hello.txt'])
632
608
self.build_tree(['tree/hello.txt'])
633
609
tree.add('hello.txt')
634
610
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',
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"
613
r"Commit refused\."],
614
'commit -m add-b --fixes=orange',
639
615
working_dir='tree')
641
617
def test_no_author(self):
740
716
f = file('fed.bat', 'w')
741
717
f.write('@rem dummy fed')
743
self.overrideEnv('BZR_EDITOR', "fed.bat")
719
osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
745
721
f = file('fed.sh', 'wb')
746
722
f.write('#!/bin/sh\n')
748
724
os.chmod('fed.sh', 0755)
749
self.overrideEnv('BZR_EDITOR', "./fed.sh")
725
osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
751
727
def setup_commit_with_template(self):
752
728
self.setup_editor()
757
733
tree.add('hello.txt')
760
def test_edit_empty_message(self):
761
tree = self.make_branch_and_tree('tree')
763
self.build_tree(['tree/hello.txt'])
764
tree.add('hello.txt')
765
out, err = self.run_bzr("commit tree/hello.txt", retcode=3,
767
self.assertContainsRe(err,
768
"bzr: ERROR: Empty commit message specified")
770
736
def test_commit_hook_template_accepted(self):
771
737
tree = self.setup_commit_with_template()
772
738
out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
776
742
def test_commit_hook_template_rejected(self):
777
743
tree = self.setup_commit_with_template()
778
744
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 \"\"."],
745
out, err = self.run_bzr_error(["empty commit message"],
783
746
"commit tree/hello.txt", stdin="n\n")
784
747
self.assertEqual(expected, tree.last_revision())
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)
796
749
def test_commit_without_username(self):
797
750
"""Ensure commit error if username is not set.
801
754
open('foo.txt', 'w').write('hello')
802
755
self.run_bzr(['add'])
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))
756
osutils.set_or_unset_env('EMAIL', None)
757
osutils.set_or_unset_env('BZR_EMAIL', None)
808
758
out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
809
759
self.assertContainsRe(err, 'Unable to determine your name')
811
def test_commit_recursive_checkout(self):
812
"""Ensure that a commit to a recursive checkout fails cleanly.
814
self.run_bzr(['init', 'test_branch'])
815
self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
816
os.chdir('test_checkout')
817
self.run_bzr(['bind', '.']) # bind to self
818
open('foo.txt', 'w').write('hello')
819
self.run_bzr(['add'])
820
out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
821
self.assertEqual(out, '')
822
self.assertContainsRe(err,
823
'Branch.*test_checkout.*appears to be bound to itself')