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
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')
76
105
self.run_bzr('resolved b/a_file')
77
106
self.run_bzr(['commit', '-m', 'merge into b', 'b'])
80
108
def test_10_verbose_commit(self):
81
109
"""Add one file and examine verbose commit output"""
82
110
tree = self.make_branch_and_tree('.')
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(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.
663
706
self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
665
708
def test_commit_readonly_checkout(self):
666
# https://bugs.edge.launchpad.net/bzr/+bug/129701
709
# https://bugs.launchpad.net/bzr/+bug/129701
667
710
# "UnlockableTransport error trying to commit in checkout of readonly
669
712
self.make_branch('master')
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")
692
735
def setup_commit_with_template(self):
693
736
self.setup_editor()
710
753
out, err = self.run_bzr_error(["empty commit message"],
711
754
"commit tree/hello.txt", stdin="n\n")
712
755
self.assertEqual(expected, tree.last_revision())
757
def test_commit_without_username(self):
758
"""Ensure commit error if username is not set.
760
self.run_bzr(['init', 'foo'])
762
open('foo.txt', 'w').write('hello')
763
self.run_bzr(['add'])
764
self.overrideEnv('EMAIL', None)
765
self.overrideEnv('BZR_EMAIL', None)
766
# Also, make sure that it's not inferred from mailname.
767
self.overrideAttr(config, '_auto_user_id',
768
lambda: (None, None))
769
out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
770
self.assertContainsRe(err, 'Unable to determine your name')
772
def test_commit_recursive_checkout(self):
773
"""Ensure that a commit to a recursive checkout fails cleanly.
775
self.run_bzr(['init', 'test_branch'])
776
self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
777
os.chdir('test_checkout')
778
self.run_bzr(['bind', '.']) # bind to self
779
open('foo.txt', 'w').write('hello')
780
self.run_bzr(['add'])
781
out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
782
self.assertEqual(out, '')
783
self.assertContainsRe(err,
784
'Branch.*test_checkout.*appears to be bound to itself')