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
result = self.run_bzr("commit", "-m", "empty", retcode=3)
39
self.assertEqual(('', 'bzr: ERROR: no changes to commit.'
40
' use --unchanged to commit anyhow\n'),
43
def test_commit_with_path(self):
44
"""Commit tree with path of root specified"""
45
self.run_bzr('init', 'a')
46
self.build_tree(['a/a_file'])
47
self.run_bzr('add', 'a/a_file')
48
self.run_bzr('commit', '-m', 'first commit', 'a')
50
self.run_bzr('branch', 'a', 'b')
51
self.build_tree_contents([('b/a_file', 'changes in b')])
52
self.run_bzr('commit', '-m', 'first commit in b', 'b')
54
self.build_tree_contents([('a/a_file', 'new contents')])
55
self.run_bzr('commit', '-m', 'change in a', 'a')
58
self.run_bzr('merge', '../a', retcode=1) # will conflict
60
self.run_bzr('resolved', 'b/a_file')
61
self.run_bzr('commit', '-m', 'merge into b', 'b')
42
64
def test_10_verbose_commit(self):
43
65
"""Add one file and examine verbose commit output"""
50
72
'Committed revision 1.\n',
53
def test_15_verbose_commit_with_unknown(self):
75
def prepare_simple_history(self):
76
"""Prepare and return a working tree with one commit of one file"""
77
# Commit with modified file should say so
78
wt = BzrDir.create_standalone_workingtree('.')
79
self.build_tree(['hello.txt', 'extra.txt'])
81
wt.commit(message='added')
84
def test_verbose_commit_modified(self):
85
# Verbose commit of modified file should say so
86
wt = self.prepare_simple_history()
87
self.build_tree_contents([('hello.txt', 'new contents')])
88
out, err = self.run_bzr("commit", "-m", "modified")
89
self.assertEqual('', out)
90
self.assertEqual('modified hello.txt\n'
91
'Committed revision 2.\n',
94
def test_verbose_commit_renamed(self):
95
# Verbose commit of renamed file should say so
96
wt = self.prepare_simple_history()
97
wt.rename_one('hello.txt', 'gutentag.txt')
98
out, err = self.run_bzr("commit", "-m", "renamed")
99
self.assertEqual('', out)
100
self.assertEqual('renamed hello.txt => gutentag.txt\n'
101
'Committed revision 2.\n',
104
def test_verbose_commit_moved(self):
105
# Verbose commit of file moved to new directory should say so
106
wt = self.prepare_simple_history()
109
wt.rename_one('hello.txt', 'subdir/hello.txt')
110
out, err = self.run_bzr("commit", "-m", "renamed")
111
self.assertEqual('', out)
112
self.assertEqualDiff('added subdir\n'
113
'renamed hello.txt => subdir/hello.txt\n'
114
'Committed revision 2.\n',
117
def test_verbose_commit_with_unknown(self):
54
118
"""Unknown files should not be listed by default in verbose output"""
55
119
# Is that really the best policy?
120
wt = BzrDir.create_standalone_workingtree('.')
57
121
self.build_tree(['hello.txt', 'extra.txt'])
58
self.runbzr("add hello.txt")
122
wt.add(['hello.txt'])
59
123
out,err = self.run_bzr("commit", "-m", "added")
60
124
self.assertEqual('', out)
61
125
self.assertEqual('added hello.txt\n'
62
126
'Committed revision 1.\n',
65
def test_16_verbose_commit_with_unchanged(self):
129
def test_verbose_commit_with_unchanged(self):
66
130
"""Unchanged files should not be listed by default in verbose output"""
67
131
self.runbzr("init")
68
132
self.build_tree(['hello.txt', 'unchanged.txt'])
75
139
'Committed revision 2.\n',
142
def test_commit_merge_reports_all_modified_files(self):
143
# the commit command should show all the files that are shown by
144
# bzr diff or bzr status when committing, even when they were not
145
# changed by the user but rather through doing a merge.
146
this_tree = self.make_branch_and_tree('this')
147
# we need a bunch of files and dirs, to perform one action on each.
150
'this/dirtoreparent/',
153
'this/filetoreparent',
170
this_tree.commit('create_files')
171
other_dir = this_tree.bzrdir.sprout('other')
172
other_tree = other_dir.open_workingtree()
173
other_tree.lock_write()
174
# perform the needed actions on the files and dirs.
176
other_tree.rename_one('dirtorename', 'renameddir')
177
other_tree.rename_one('dirtoreparent', 'renameddir/reparenteddir')
178
other_tree.rename_one('filetorename', 'renamedfile')
179
other_tree.rename_one('filetoreparent', 'renameddir/reparentedfile')
180
other_tree.remove(['dirtoremove', 'filetoremove'])
181
self.build_tree_contents([
183
('other/filetomodify', 'new content'),
184
('other/newfile', 'new file content')])
185
other_tree.add('newfile')
186
other_tree.add('newdir/')
187
other_tree.commit('modify all sample files and dirs.')
190
this_tree.merge_from_branch(other_tree.branch)
192
out,err = self.run_bzr("commit", "-m", "added")
194
self.assertEqual('', out)
195
self.assertEqualDiff(
196
'modified filetomodify\n'
199
'renamed dirtorename => renameddir\n'
200
'renamed dirtoreparent => renameddir/reparenteddir\n'
201
'renamed filetoreparent => renameddir/reparentedfile\n'
202
'renamed filetorename => renamedfile\n'
203
'deleted dirtoremove\n'
204
'deleted filetoremove\n'
205
'Committed revision 2.\n',
78
208
def test_empty_commit_message(self):
79
209
self.runbzr("init")
80
210
file('foo.c', 'wt').write('int main() {}')
125
255
self.assertEqualDiff('', out)
126
256
self.assertEqualDiff('bzr: ERROR: Cannot perform local-only commits '
127
257
'on unbound branches.\n', err)
259
def test_commit_a_text_merge_in_a_checkout(self):
260
# checkouts perform multiple actions in a transaction across bond
261
# branches and their master, and have been observed to fail in the
262
# past. This is a user story reported to fail in bug #43959 where
263
# a merge done in a checkout (using the update command) failed to
265
self.run_bzr('init', 'trunk')
267
self.run_bzr('checkout', 'trunk', 'u1')
268
self.build_tree_contents([('u1/hosts', 'initial contents')])
269
self.run_bzr('add', 'u1/hosts')
270
self.run_bzr('commit', '-m', 'add hosts', 'u1')
272
self.run_bzr('checkout', 'trunk', 'u2')
273
self.build_tree_contents([('u2/hosts', 'altered in u2')])
274
self.run_bzr('commit', '-m', 'checkin from u2', 'u2')
276
# make an offline commits
277
self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
278
self.run_bzr('commit', '-m', 'checkin offline', '--local', 'u1')
280
# now try to pull in online work from u2, and then commit our offline
282
# retcode 1 as we expect a text conflict
283
self.run_bzr('update', 'u1', retcode=1)
284
self.run_bzr('resolved', 'u1/hosts')
285
# add a text change here to represent resolving the merge conflicts in
286
# favour of a new version of the file not identical to either the u1
287
# version or the u2 version.
288
self.build_tree_contents([('u1/hosts', 'merge resolution\n')])
289
self.run_bzr('commit', '-m', 'checkin merge of the offline work from u1', 'u1')
291
def test_commit_respects_spec_for_removals(self):
292
"""Commit with a file spec should only commit removals that match"""
293
t = self.make_branch_and_tree('.')
294
self.build_tree(['file-a', 'dir-a/', 'dir-a/file-b'])
295
t.add(['file-a', 'dir-a', 'dir-a/file-b'])
297
t.remove(['file-a', 'dir-a/file-b'])
299
result = self.run_bzr('commit', '.', '-m' 'removed file-b')[1]
300
self.assertNotContainsRe(result, 'file-a')
301
result = self.run_bzr('status')[0]
302
self.assertContainsRe(result, 'removed:\n file-a')