1
# Copyright (C) 2005, 2006 by Canonical Ltd
1
# Copyright (C) 2005, 2006 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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35
33
def test_05_empty_commit(self):
36
34
"""Commit of tree with no versioned files should fail"""
37
35
# If forced, it should succeed, but this is not tested here.
39
37
self.build_tree(['hello.txt'])
40
self.runbzr("commit -m empty", retcode=3)
38
out,err = self.run_bzr("commit", "-m", "empty", retcode=3)
39
self.assertEqual('', out)
40
self.assertStartsWith(err, 'bzr: ERROR: no changes to commit.'
41
' use --unchanged to commit anyhow\n')
43
def test_save_commit_message(self):
44
"""Failed commit should save the message in a file"""
46
out,err = self.run_bzr("commit", "-m", "message", retcode=3)
47
self.assertEqual('', out)
48
self.assertStartsWith(err, 'bzr: ERROR: no changes to commit.'
49
' use --unchanged to commit anyhow\n'
50
'Commit message saved. To reuse the message,'
51
' do\nbzr commit --file ')
52
message_file = re.compile('bzr-commit-\S*').search(err).group()
53
self.check_file_contents(message_file, 'message')
55
def test_commit_success(self):
56
"""Successful commit should not leave behind a bzr-commit-* file"""
58
self.run_bzr("commit", "--unchanged", "-m", "message")
59
self.assertEqual('', self.capture('unknowns'))
61
# same for unicode messages
62
self.run_bzr("commit", "--unchanged", "-m", u'foo\xb5')
63
self.assertEqual('', self.capture('unknowns'))
65
def test_commit_with_path(self):
66
"""Commit tree with path of root specified"""
67
self.run_bzr('init', 'a')
68
self.build_tree(['a/a_file'])
69
self.run_bzr('add', 'a/a_file')
70
self.run_bzr('commit', '-m', 'first commit', 'a')
72
self.run_bzr('branch', 'a', 'b')
73
self.build_tree_contents([('b/a_file', 'changes in b')])
74
self.run_bzr('commit', '-m', 'first commit in b', 'b')
76
self.build_tree_contents([('a/a_file', 'new contents')])
77
self.run_bzr('commit', '-m', 'change in a', 'a')
80
self.run_bzr('merge', '../a', retcode=1) # will conflict
82
self.run_bzr('resolved', 'b/a_file')
83
self.run_bzr('commit', '-m', 'merge into b', 'b')
42
86
def test_10_verbose_commit(self):
43
87
"""Add one file and examine verbose commit output"""
50
94
'Committed revision 1.\n',
53
def test_15_verbose_commit_with_unknown(self):
97
def prepare_simple_history(self):
98
"""Prepare and return a working tree with one commit of one file"""
99
# Commit with modified file should say so
100
wt = BzrDir.create_standalone_workingtree('.')
101
self.build_tree(['hello.txt', 'extra.txt'])
102
wt.add(['hello.txt'])
103
wt.commit(message='added')
106
def test_verbose_commit_modified(self):
107
# Verbose commit of modified file should say so
108
wt = self.prepare_simple_history()
109
self.build_tree_contents([('hello.txt', 'new contents')])
110
out, err = self.run_bzr("commit", "-m", "modified")
111
self.assertEqual('', out)
112
self.assertEqual('modified hello.txt\n'
113
'Committed revision 2.\n',
116
def test_verbose_commit_renamed(self):
117
# Verbose commit of renamed file should say so
118
wt = self.prepare_simple_history()
119
wt.rename_one('hello.txt', 'gutentag.txt')
120
out, err = self.run_bzr("commit", "-m", "renamed")
121
self.assertEqual('', out)
122
self.assertEqual('renamed hello.txt => gutentag.txt\n'
123
'Committed revision 2.\n',
126
def test_verbose_commit_moved(self):
127
# Verbose commit of file moved to new directory should say so
128
wt = self.prepare_simple_history()
131
wt.rename_one('hello.txt', 'subdir/hello.txt')
132
out, err = self.run_bzr("commit", "-m", "renamed")
133
self.assertEqual('', out)
134
self.assertEqualDiff('added subdir\n'
135
'renamed hello.txt => subdir/hello.txt\n'
136
'Committed revision 2.\n',
139
def test_verbose_commit_with_unknown(self):
54
140
"""Unknown files should not be listed by default in verbose output"""
55
141
# Is that really the best policy?
142
wt = BzrDir.create_standalone_workingtree('.')
57
143
self.build_tree(['hello.txt', 'extra.txt'])
58
self.runbzr("add hello.txt")
144
wt.add(['hello.txt'])
59
145
out,err = self.run_bzr("commit", "-m", "added")
60
146
self.assertEqual('', out)
61
147
self.assertEqual('added hello.txt\n'
62
148
'Committed revision 1.\n',
65
def test_16_verbose_commit_with_unchanged(self):
151
def test_verbose_commit_with_unchanged(self):
66
152
"""Unchanged files should not be listed by default in verbose output"""
67
153
self.runbzr("init")
68
154
self.build_tree(['hello.txt', 'unchanged.txt'])
75
161
'Committed revision 2.\n',
164
def test_commit_merge_reports_all_modified_files(self):
165
# the commit command should show all the files that are shown by
166
# bzr diff or bzr status when committing, even when they were not
167
# changed by the user but rather through doing a merge.
168
this_tree = self.make_branch_and_tree('this')
169
# we need a bunch of files and dirs, to perform one action on each.
172
'this/dirtoreparent/',
175
'this/filetoreparent',
192
this_tree.commit('create_files')
193
other_dir = this_tree.bzrdir.sprout('other')
194
other_tree = other_dir.open_workingtree()
195
other_tree.lock_write()
196
# perform the needed actions on the files and dirs.
198
other_tree.rename_one('dirtorename', 'renameddir')
199
other_tree.rename_one('dirtoreparent', 'renameddir/reparenteddir')
200
other_tree.rename_one('filetorename', 'renamedfile')
201
other_tree.rename_one('filetoreparent', 'renameddir/reparentedfile')
202
other_tree.remove(['dirtoremove', 'filetoremove'])
203
self.build_tree_contents([
205
('other/filetomodify', 'new content'),
206
('other/newfile', 'new file content')])
207
other_tree.add('newfile')
208
other_tree.add('newdir/')
209
other_tree.commit('modify all sample files and dirs.')
212
this_tree.merge_from_branch(other_tree.branch)
214
out,err = self.run_bzr("commit", "-m", "added")
216
self.assertEqual('', out)
217
self.assertEqualDiff(
218
'modified filetomodify\n'
221
'renamed dirtorename => renameddir\n'
222
'renamed dirtoreparent => renameddir/reparenteddir\n'
223
'renamed filetoreparent => renameddir/reparentedfile\n'
224
'renamed filetorename => renamedfile\n'
225
'deleted dirtoremove\n'
226
'deleted filetoremove\n'
227
'Committed revision 2.\n',
78
230
def test_empty_commit_message(self):
79
231
self.runbzr("init")
80
232
file('foo.c', 'wt').write('int main() {}')
125
277
self.assertEqualDiff('', out)
126
278
self.assertEqualDiff('bzr: ERROR: Cannot perform local-only commits '
127
279
'on unbound branches.\n', err)
281
def test_commit_a_text_merge_in_a_checkout(self):
282
# checkouts perform multiple actions in a transaction across bond
283
# branches and their master, and have been observed to fail in the
284
# past. This is a user story reported to fail in bug #43959 where
285
# a merge done in a checkout (using the update command) failed to
287
self.run_bzr('init', 'trunk')
289
self.run_bzr('checkout', 'trunk', 'u1')
290
self.build_tree_contents([('u1/hosts', 'initial contents')])
291
self.run_bzr('add', 'u1/hosts')
292
self.run_bzr('commit', '-m', 'add hosts', 'u1')
294
self.run_bzr('checkout', 'trunk', 'u2')
295
self.build_tree_contents([('u2/hosts', 'altered in u2')])
296
self.run_bzr('commit', '-m', 'checkin from u2', 'u2')
298
# make an offline commits
299
self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
300
self.run_bzr('commit', '-m', 'checkin offline', '--local', 'u1')
302
# now try to pull in online work from u2, and then commit our offline
304
# retcode 1 as we expect a text conflict
305
self.run_bzr('update', 'u1', retcode=1)
306
self.run_bzr('resolved', 'u1/hosts')
307
# add a text change here to represent resolving the merge conflicts in
308
# favour of a new version of the file not identical to either the u1
309
# version or the u2 version.
310
self.build_tree_contents([('u1/hosts', 'merge resolution\n')])
311
self.run_bzr('commit', '-m', 'checkin merge of the offline work from u1', 'u1')
313
def test_commit_respects_spec_for_removals(self):
314
"""Commit with a file spec should only commit removals that match"""
315
t = self.make_branch_and_tree('.')
316
self.build_tree(['file-a', 'dir-a/', 'dir-a/file-b'])
317
t.add(['file-a', 'dir-a', 'dir-a/file-b'])
319
t.remove(['file-a', 'dir-a/file-b'])
321
result = self.run_bzr('commit', '.', '-m' 'removed file-b')[1]
322
self.assertNotContainsRe(result, 'file-a')
323
result = self.run_bzr('status')[0]
324
self.assertContainsRe(result, 'removed:\n file-a')
326
def test_strict_commit(self):
327
"""Commit with --strict works if everything is known"""
328
tree = self.make_branch_and_tree('tree')
329
self.build_tree(['tree/a'])
331
# A simple change should just work
332
self.run_bzr('commit', '--strict', '-m', 'adding a',
335
def test_strict_commit_no_changes(self):
336
"""commit --strict gives "no changes" if there is nothing to commit"""
337
tree = self.make_branch_and_tree('tree')
338
self.build_tree(['tree/a'])
340
tree.commit('adding a')
342
# With no changes, it should just be 'no changes'
343
# Make sure that commit is failing because there is nothing to do
344
self.run_bzr_error(['no changes to commit'],
345
'commit', '--strict', '-m', 'no changes',
348
# But --strict doesn't care if you supply --unchanged
349
self.run_bzr('commit', '--strict', '--unchanged', '-m', 'no changes',
352
def test_strict_commit_unknown(self):
353
"""commit --strict fails if a file is unknown"""
354
tree = self.make_branch_and_tree('tree')
355
self.build_tree(['tree/a'])
357
tree.commit('adding a')
359
# Add one file so there is a change, but forget the other
360
self.build_tree(['tree/b', 'tree/c'])
362
self.run_bzr_error(['Commit refused because there are unknown files'],
363
'commit', '--strict', '-m', 'add b',
366
# --no-strict overrides --strict
367
self.run_bzr('commit', '--strict', '-m', 'add b', '--no-strict',