1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2006-2011 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
23
27
from bzrlib import (
30
34
from bzrlib.bzrdir import BzrDir
31
35
from bzrlib.tests import (
32
36
probe_bad_non_ascii,
39
UnicodeFilenameFeature,
35
from bzrlib.tests.blackbox import ExternalBase
38
class TestCommit(ExternalBase):
41
from bzrlib.tests import TestCaseWithTransport
44
class TestCommit(TestCaseWithTransport):
40
46
def test_05_empty_commit(self):
41
47
"""Commit of tree with no versioned files should fail"""
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
aborting commit write group: PointlessCommit(No changes to commit)
61
bzr: ERROR: No changes to commit.\
62
Please 'bzr add' the files you want to commit,\
63
or use --unchanged to force an empty commit.
64
""", flags=doctest.ELLIPSIS|doctest.REPORT_UDIFF))
50
66
def test_commit_success(self):
51
67
"""Successful commit should not leave behind a bzr-commit-* file"""
57
73
self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
58
74
self.assertEqual('', self.run_bzr('unknowns')[0])
76
def test_commit_lossy_native(self):
77
"""A --lossy option to commit is supported."""
78
self.make_branch_and_tree('.')
79
self.run_bzr('commit --lossy --unchanged -m message')
80
self.assertEqual('', self.run_bzr('unknowns')[0])
82
def test_commit_lossy_foreign(self):
83
test_foreign.register_dummy_foreign_for_test(self)
84
self.make_branch_and_tree('.',
85
format=test_foreign.DummyForeignVcsDirFormat())
86
self.run_bzr('commit --lossy --unchanged -m message')
87
output = self.run_bzr('revision-info')[0]
88
self.assertTrue(output.startswith('1 dummy-'))
60
90
def test_commit_with_path(self):
61
91
"""Commit tree with path of root specified"""
62
92
a_tree = self.make_branch_and_tree('a')
76
106
self.run_bzr('resolved b/a_file')
77
107
self.run_bzr(['commit', '-m', 'merge into b', 'b'])
80
109
def test_10_verbose_commit(self):
81
110
"""Add one file and examine verbose commit output"""
82
111
tree = self.make_branch_and_tree('.')
107
136
'modified hello\.txt\n'
108
137
'Committed revision 2\.\n$')
139
def test_unicode_commit_message_is_filename(self):
140
"""Unicode commit message same as a filename (Bug #563646).
142
self.requireFeature(UnicodeFilenameFeature)
143
file_name = u'\N{euro sign}'
144
self.run_bzr(['init'])
145
open(file_name, 'w').write('hello world')
146
self.run_bzr(['add'])
147
out, err = self.run_bzr(['commit', '-m', file_name])
148
reflags = re.MULTILINE|re.DOTALL|re.UNICODE
149
te = osutils.get_terminal_encoding()
150
self.assertContainsRe(err.decode(te),
151
u'The commit message is a file name:',
154
# Run same test with a filename that causes encode
155
# error for the terminal encoding. We do this
156
# by forcing terminal encoding of ascii for
157
# osutils.get_terminal_encoding which is used
158
# by ui.text.show_warning
159
default_get_terminal_enc = osutils.get_terminal_encoding
161
osutils.get_terminal_encoding = lambda trace=None: 'ascii'
162
file_name = u'foo\u1234'
163
open(file_name, 'w').write('hello world')
164
self.run_bzr(['add'])
165
out, err = self.run_bzr(['commit', '-m', file_name])
166
reflags = re.MULTILINE|re.DOTALL|re.UNICODE
167
te = osutils.get_terminal_encoding()
168
self.assertContainsRe(err.decode(te, 'replace'),
169
u'The commit message is a file name:',
172
osutils.get_terminal_encoding = default_get_terminal_enc
110
174
def test_warn_about_forgotten_commit_message(self):
111
175
"""Test that the lack of -m parameter is caught"""
112
176
wt = self.make_branch_and_tree('.')
271
335
tree.add('foo.c')
272
336
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
338
def test_other_branch_commit(self):
295
339
# this branch is to ensure consistent behaviour, whether we're run
296
340
# inside a branch, or not.
663
707
self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
665
709
def test_commit_readonly_checkout(self):
666
# https://bugs.edge.launchpad.net/bzr/+bug/129701
710
# https://bugs.launchpad.net/bzr/+bug/129701
667
711
# "UnlockableTransport error trying to commit in checkout of readonly
669
713
self.make_branch('master')
681
725
f = file('fed.bat', 'w')
682
726
f.write('@rem dummy fed')
684
osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
728
self.overrideEnv('BZR_EDITOR', "fed.bat")
686
730
f = file('fed.sh', 'wb')
687
731
f.write('#!/bin/sh\n')
689
733
os.chmod('fed.sh', 0755)
690
osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
734
self.overrideEnv('BZR_EDITOR', "./fed.sh")
692
736
def setup_commit_with_template(self):
693
737
self.setup_editor()
710
754
out, err = self.run_bzr_error(["empty commit message"],
711
755
"commit tree/hello.txt", stdin="n\n")
712
756
self.assertEqual(expected, tree.last_revision())
758
def test_commit_without_username(self):
759
"""Ensure commit error if username is not set.
761
self.run_bzr(['init', 'foo'])
763
open('foo.txt', 'w').write('hello')
764
self.run_bzr(['add'])
765
self.overrideEnv('EMAIL', None)
766
self.overrideEnv('BZR_EMAIL', None)
767
# Also, make sure that it's not inferred from mailname.
768
self.overrideAttr(config, '_auto_user_id',
769
lambda: (None, None))
770
out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
771
self.assertContainsRe(err, 'Unable to determine your name')
773
def test_commit_recursive_checkout(self):
774
"""Ensure that a commit to a recursive checkout fails cleanly.
776
self.run_bzr(['init', 'test_branch'])
777
self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
778
os.chdir('test_checkout')
779
self.run_bzr(['bind', '.']) # bind to self
780
open('foo.txt', 'w').write('hello')
781
self.run_bzr(['add'])
782
out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
783
self.assertEqual(out, '')
784
self.assertContainsRe(err,
785
'Branch.*test_checkout.*appears to be bound to itself')