44
50
self.build_tree(['hello.txt'])
45
51
out,err = self.run_bzr('commit -m empty', retcode=3)
46
52
self.assertEqual('', out)
47
self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
48
' Use --unchanged to commit anyhow.\n')
54
# 1) We really don't want 'aborting commit write group' anymore.
55
# 2) bzr: ERROR: is a really long line, so we wrap it with '\'
60
bzr: ERROR: No changes to commit.\
61
Please 'bzr add' the files you want to commit,\
62
or use --unchanged to force an empty commit.
63
""", flags=doctest.ELLIPSIS|doctest.REPORT_UDIFF))
50
65
def test_commit_success(self):
51
66
"""Successful commit should not leave behind a bzr-commit-* file"""
57
72
self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
58
73
self.assertEqual('', self.run_bzr('unknowns')[0])
75
def test_commit_lossy_native(self):
76
"""A --lossy option to commit is supported."""
77
self.make_branch_and_tree('.')
78
self.run_bzr('commit --lossy --unchanged -m message')
79
self.assertEqual('', self.run_bzr('unknowns')[0])
81
def test_commit_lossy_foreign(self):
82
test_foreign.register_dummy_foreign_for_test(self)
83
self.make_branch_and_tree('.',
84
format=test_foreign.DummyForeignVcsDirFormat())
85
self.run_bzr('commit --lossy --unchanged -m message')
86
output = self.run_bzr('revision-info')[0]
87
self.assertTrue(output.startswith('1 dummy-'))
60
89
def test_commit_with_path(self):
61
90
"""Commit tree with path of root specified"""
62
91
a_tree = self.make_branch_and_tree('a')
107
135
'modified hello\.txt\n'
108
136
'Committed revision 2\.\n$')
138
def test_unicode_commit_message_is_filename(self):
139
"""Unicode commit message same as a filename (Bug #563646).
141
self.requireFeature(features.UnicodeFilenameFeature)
142
file_name = u'\N{euro sign}'
143
self.run_bzr(['init'])
144
open(file_name, 'w').write('hello world')
145
self.run_bzr(['add'])
146
out, err = self.run_bzr(['commit', '-m', file_name])
147
reflags = re.MULTILINE|re.DOTALL|re.UNICODE
148
te = osutils.get_terminal_encoding()
149
self.assertContainsRe(err.decode(te),
150
u'The commit message is a file name:',
153
# Run same test with a filename that causes encode
154
# error for the terminal encoding. We do this
155
# by forcing terminal encoding of ascii for
156
# osutils.get_terminal_encoding which is used
157
# by ui.text.show_warning
158
default_get_terminal_enc = osutils.get_terminal_encoding
160
osutils.get_terminal_encoding = lambda trace=None: 'ascii'
161
file_name = u'foo\u1234'
162
open(file_name, 'w').write('hello world')
163
self.run_bzr(['add'])
164
out, err = self.run_bzr(['commit', '-m', file_name])
165
reflags = re.MULTILINE|re.DOTALL|re.UNICODE
166
te = osutils.get_terminal_encoding()
167
self.assertContainsRe(err.decode(te, 'replace'),
168
u'The commit message is a file name:',
171
osutils.get_terminal_encoding = default_get_terminal_enc
110
173
def test_warn_about_forgotten_commit_message(self):
111
174
"""Test that the lack of -m parameter is caught"""
112
175
wt = self.make_branch_and_tree('.')
271
334
tree.add('foo.c')
272
335
self.run_bzr('commit -m ""', retcode=3)
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')
278
tree = self.make_branch_and_tree('.')
279
self.build_tree_contents([('foo.c', 'int main() {}')])
281
# LANG env variable has no effect on Windows
282
# but some characters anyway cannot be represented
283
# in default user encoding
284
char = probe_bad_non_ascii(osutils.get_user_encoding())
286
raise TestSkipped('Cannot find suitable non-ascii character'
287
'for user_encoding (%s)' % osutils.get_user_encoding())
288
out,err = self.run_bzr_subprocess('commit -m "%s"' % char,
290
env_changes={'LANG': 'C'})
291
self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
292
'unsupported by the current encoding.')
294
337
def test_other_branch_commit(self):
295
338
# this branch is to ensure consistent behaviour, whether we're run
296
339
# inside a branch, or not.
675
718
self.assertContainsRe(err,
676
719
r'^bzr: ERROR: Cannot lock.*readonly transport')
678
def test_commit_hook_template(self):
721
def setup_editor(self):
679
722
# Test that commit template hooks work
680
723
if sys.platform == "win32":
681
724
f = file('fed.bat', 'w')
682
725
f.write('@rem dummy fed')
684
osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
727
self.overrideEnv('BZR_EDITOR', "fed.bat")
686
729
f = file('fed.sh', 'wb')
687
730
f.write('#!/bin/sh\n')
689
732
os.chmod('fed.sh', 0755)
690
osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
733
self.overrideEnv('BZR_EDITOR', "./fed.sh")
735
def setup_commit_with_template(self):
691
737
msgeditor.hooks.install_named_hook("commit_message_template",
692
738
lambda commit_obj, msg: "save me some typing\n", None)
693
739
tree = self.make_branch_and_tree('tree')
694
740
self.build_tree(['tree/hello.txt'])
695
741
tree.add('hello.txt')
744
def test_commit_hook_template_accepted(self):
745
tree = self.setup_commit_with_template()
746
out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
747
last_rev = tree.branch.repository.get_revision(tree.last_revision())
748
self.assertEqual('save me some typing\n', last_rev.message)
750
def test_commit_hook_template_rejected(self):
751
tree = self.setup_commit_with_template()
752
expected = tree.last_revision()
753
out, err = self.run_bzr_error(["Empty commit message specified."
754
" Please specify a commit message with either"
755
" --message or --file or leave a blank message"
756
" with --message \"\"."],
757
"commit tree/hello.txt", stdin="n\n")
758
self.assertEqual(expected, tree.last_revision())
760
def test_set_commit_message(self):
761
msgeditor.hooks.install_named_hook("set_commit_message",
762
lambda commit_obj, msg: "save me some typing\n", None)
763
tree = self.make_branch_and_tree('tree')
764
self.build_tree(['tree/hello.txt'])
765
tree.add('hello.txt')
696
766
out, err = self.run_bzr("commit tree/hello.txt")
697
767
last_rev = tree.branch.repository.get_revision(tree.last_revision())
698
768
self.assertEqual('save me some typing\n', last_rev.message)
770
def test_commit_without_username(self):
771
"""Ensure commit error if username is not set.
773
self.run_bzr(['init', 'foo'])
775
open('foo.txt', 'w').write('hello')
776
self.run_bzr(['add'])
777
self.overrideEnv('EMAIL', None)
778
self.overrideEnv('BZR_EMAIL', None)
779
# Also, make sure that it's not inferred from mailname.
780
self.overrideAttr(config, '_auto_user_id',
781
lambda: (None, None))
782
out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
783
self.assertContainsRe(err, 'Unable to determine your name')
785
def test_commit_recursive_checkout(self):
786
"""Ensure that a commit to a recursive checkout fails cleanly.
788
self.run_bzr(['init', 'test_branch'])
789
self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
790
os.chdir('test_checkout')
791
self.run_bzr(['bind', '.']) # bind to self
792
open('foo.txt', 'w').write('hello')
793
self.run_bzr(['add'])
794
out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
795
self.assertEqual(out, '')
796
self.assertContainsRe(err,
797
'Branch.*test_checkout.*appears to be bound to itself')