31
34
class TestCommit(ExternalBase):
33
def test_05_empty_commit(self):
34
"""Commit of tree with no versioned files should fail"""
35
# If forced, it should succeed, but this is not tested here.
37
self.build_tree(['hello.txt'])
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')
64
def test_10_verbose_commit(self):
65
"""Add one file and examine verbose commit output"""
67
self.build_tree(['hello.txt'])
68
self.runbzr("add hello.txt")
69
out,err = self.run_bzr("commit", "-m", "added")
70
self.assertEqual('', out)
71
self.assertEqual('added hello.txt\n'
72
'Committed revision 1.\n',
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):
118
"""Unknown files should not be listed by default in verbose output"""
119
# Is that really the best policy?
120
wt = BzrDir.create_standalone_workingtree('.')
121
self.build_tree(['hello.txt', 'extra.txt'])
122
wt.add(['hello.txt'])
123
out,err = self.run_bzr("commit", "-m", "added")
124
self.assertEqual('', out)
125
self.assertEqual('added hello.txt\n'
126
'Committed revision 1.\n',
129
def test_verbose_commit_with_unchanged(self):
130
"""Unchanged files should not be listed by default in verbose output"""
132
self.build_tree(['hello.txt', 'unchanged.txt'])
133
self.runbzr('add unchanged.txt')
134
self.runbzr('commit -m unchanged unchanged.txt')
135
self.runbzr("add hello.txt")
136
out,err = self.run_bzr("commit", "-m", "added")
137
self.assertEqual('', out)
138
self.assertEqual('added hello.txt\n'
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
self.merge(other_tree.branch, this_tree)
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',
36
def test_empty_commit(self):
38
self.build_tree(['hello.txt'])
39
self.runbzr("commit -m empty", retcode=3)
40
self.runbzr("add hello.txt")
41
self.runbzr("commit -m added")
208
43
def test_empty_commit_message(self):
209
44
self.runbzr("init")
210
45
file('foo.c', 'wt').write('int main() {}')
211
46
self.runbzr(['add', 'foo.c'])
212
self.runbzr(["commit", "-m", ""] , retcode=3)
47
self.runbzr(["commit", "-m", ""] , retcode=3)
214
49
def test_other_branch_commit(self):
215
50
# this branch is to ensure consistent behaviour, whether we're run
248
83
"bzr: ERROR: Working tree is out of date, please run "
249
84
"'bzr update'.\n"))
251
def test_local_commit_unbound(self):
252
# a --local commit on an unbound branch is an error
253
self.make_branch_and_tree('.')
254
out, err = self.run_bzr('commit', '--local', retcode=3)
255
self.assertEqualDiff('', out)
256
self.assertEqualDiff('bzr: ERROR: Cannot perform local-only commits '
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')