18
18
"""Tests for the commit CLI of bzr."""
25
from testtools.matchers import DocTestMatches
30
from bzrlib.bzrdir import BzrDir
31
from bzrlib.tests import (
35
from bzrlib.tests.blackbox import ExternalBase
38
class TestCommit(ExternalBase):
33
from ...controldir import ControlDir
38
from .. import TestCaseWithTransport
39
from ..matchers import ContainsNoVfsCalls
42
class TestCommit(TestCaseWithTransport):
40
44
def test_05_empty_commit(self):
41
45
"""Commit of tree with no versioned files should fail"""
42
46
# If forced, it should succeed, but this is not tested here.
43
47
self.make_branch_and_tree('.')
44
48
self.build_tree(['hello.txt'])
45
out,err = self.run_bzr('commit -m empty', retcode=3)
46
self.assertEqual('', out)
47
self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
48
' Use --unchanged to commit anyhow.\n')
49
out, err = self.run_bzr('commit -m empty', retcode=3)
50
self.assertEqual(b'', out)
52
# 1) We really don't want 'aborting commit write group' anymore.
53
# 2) brz: ERROR: is a really long line, so we wrap it with '\'
58
brz: ERROR: No changes to commit.\
59
Please 'brz add' the files you want to commit,\
60
or use --unchanged to force an empty commit.
61
""", flags=doctest.ELLIPSIS|doctest.REPORT_UDIFF))
50
63
def test_commit_success(self):
51
64
"""Successful commit should not leave behind a bzr-commit-* file"""
57
70
self.run_bzr(["commit", "--unchanged", "-m", u'foo\xb5'])
58
71
self.assertEqual('', self.run_bzr('unknowns')[0])
73
def test_commit_lossy_native(self):
74
"""A --lossy option to commit is supported."""
75
self.make_branch_and_tree('.')
76
self.run_bzr('commit --lossy --unchanged -m message')
77
self.assertEqual('', self.run_bzr('unknowns')[0])
79
def test_commit_lossy_foreign(self):
80
test_foreign.register_dummy_foreign_for_test(self)
81
self.make_branch_and_tree('.',
82
format=test_foreign.DummyForeignVcsDirFormat())
83
self.run_bzr('commit --lossy --unchanged -m message')
84
output = self.run_bzr('revision-info')[0]
85
self.assertTrue(output.startswith('1 dummy-'))
60
87
def test_commit_with_path(self):
61
88
"""Commit tree with path of root specified"""
62
89
a_tree = self.make_branch_and_tree('a')
64
91
a_tree.add('a_file')
65
92
self.run_bzr(['commit', '-m', 'first commit', 'a'])
67
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
68
self.build_tree_contents([('b/a_file', 'changes in b')])
94
b_tree = a_tree.controldir.sprout('b').open_workingtree()
95
self.build_tree_contents([('b/a_file', b'changes in b')])
69
96
self.run_bzr(['commit', '-m', 'first commit in b', 'b'])
71
self.build_tree_contents([('a/a_file', 'new contents')])
98
self.build_tree_contents([('a/a_file', b'new contents')])
72
99
self.run_bzr(['commit', '-m', 'change in a', 'a'])
74
101
b_tree.merge_from_branch(a_tree.branch)
76
103
self.run_bzr('resolved b/a_file')
77
104
self.run_bzr(['commit', '-m', 'merge into b', 'b'])
80
106
def test_10_verbose_commit(self):
81
107
"""Add one file and examine verbose commit output"""
82
108
tree = self.make_branch_and_tree('.')
83
109
self.build_tree(['hello.txt'])
84
110
tree.add("hello.txt")
85
out,err = self.run_bzr('commit -m added')
86
self.assertEqual('', out)
87
self.assertContainsRe(err, '^Committing to: .*\n'
89
'Committed revision 1.\n$',)
111
out, err = self.run_bzr('commit -m added')
112
self.assertEqual(b'', out)
113
self.assertContainsRe(err, b'^Committing to: .*\n'
115
b'Committed revision 1.\n$',)
91
117
def prepare_simple_history(self):
92
118
"""Prepare and return a working tree with one commit of one file"""
93
119
# Commit with modified file should say so
94
wt = BzrDir.create_standalone_workingtree('.')
120
wt = ControlDir.create_standalone_workingtree('.')
95
121
self.build_tree(['hello.txt', 'extra.txt'])
96
122
wt.add(['hello.txt'])
97
123
wt.commit(message='added')
100
126
def test_verbose_commit_modified(self):
101
127
# Verbose commit of modified file should say so
102
128
wt = self.prepare_simple_history()
103
self.build_tree_contents([('hello.txt', 'new contents')])
129
self.build_tree_contents([('hello.txt', b'new contents')])
104
130
out, err = self.run_bzr('commit -m modified')
105
self.assertEqual('', out)
106
self.assertContainsRe(err, '^Committing to: .*\n'
107
'modified hello\.txt\n'
108
'Committed revision 2\.\n$')
131
self.assertEqual(b'', out)
132
self.assertContainsRe(err, b'^Committing to: .*\n'
133
b'modified hello\\.txt\n'
134
b'Committed revision 2\\.\n$')
136
def test_unicode_commit_message_is_filename(self):
137
"""Unicode commit message same as a filename (Bug #563646).
139
self.requireFeature(features.UnicodeFilenameFeature)
140
file_name = u'\N{euro sign}'
141
self.run_bzr(['init'])
142
with open(file_name, 'w') as f:
143
f.write('hello world')
144
self.run_bzr(['add'])
145
out, err = self.run_bzr(['commit', '-m', file_name])
146
reflags = re.MULTILINE|re.DOTALL|re.UNICODE
147
te = osutils.get_terminal_encoding()
148
self.assertContainsRe(err.decode(te),
149
u'The commit message is a file name:',
152
# Run same test with a filename that causes encode
153
# error for the terminal encoding. We do this
154
# by forcing terminal encoding of ascii for
155
# osutils.get_terminal_encoding which is used
156
# by ui.text.show_warning
157
default_get_terminal_enc = osutils.get_terminal_encoding
159
osutils.get_terminal_encoding = lambda trace=None: 'ascii'
160
file_name = u'foo\u1234'
161
with open(file_name, 'w') as f:
162
f.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
173
def test_non_ascii_file_unversioned_utf8(self):
174
self.requireFeature(features.UnicodeFilenameFeature)
175
tree = self.make_branch_and_tree(".")
176
self.build_tree(["f"])
178
out, err = self.run_bzr(["commit", "-m", "Wrong filename", u"\xa7"],
179
encoding="utf-8", retcode=3)
180
self.assertContainsRe(err, b"(?m)not versioned: \"\xc2\xa7\"$")
182
def test_non_ascii_file_unversioned_iso_8859_5(self):
183
self.requireFeature(features.UnicodeFilenameFeature)
184
tree = self.make_branch_and_tree(".")
185
self.build_tree(["f"])
187
out, err = self.run_bzr(["commit", "-m", "Wrong filename", u"\xa7"],
188
encoding="iso-8859-5", retcode=3)
189
self.expectFailure("Error messages are always written as UTF-8",
190
self.assertNotContainsString, err, "\xc2\xa7")
191
self.assertContainsRe(err, b"(?m)not versioned: \"\xfd\"$")
110
193
def test_warn_about_forgotten_commit_message(self):
111
194
"""Test that the lack of -m parameter is caught"""
113
196
self.build_tree(['one', 'two'])
115
198
out, err = self.run_bzr('commit -m one two')
116
self.assertContainsRe(err, "The commit message is a file name")
199
self.assertContainsRe(err, b"The commit message is a file name")
118
201
def test_verbose_commit_renamed(self):
119
202
# Verbose commit of renamed file should say so
120
203
wt = self.prepare_simple_history()
121
204
wt.rename_one('hello.txt', 'gutentag.txt')
122
205
out, err = self.run_bzr('commit -m renamed')
123
self.assertEqual('', out)
124
self.assertContainsRe(err, '^Committing to: .*\n'
125
'renamed hello\.txt => gutentag\.txt\n'
126
'Committed revision 2\.$\n')
206
self.assertEqual(b'', out)
207
self.assertContainsRe(err, b'^Committing to: .*\n'
208
b'renamed hello\\.txt => gutentag\\.txt\n'
209
b'Committed revision 2\\.$\n')
128
211
def test_verbose_commit_moved(self):
129
212
# Verbose commit of file moved to new directory should say so
132
215
wt.add(['subdir'])
133
216
wt.rename_one('hello.txt', 'subdir/hello.txt')
134
217
out, err = self.run_bzr('commit -m renamed')
135
self.assertEqual('', out)
136
self.assertEqual(set([
137
'Committing to: %s/' % osutils.getcwd(),
139
'renamed hello.txt => subdir/hello.txt',
140
'Committed revision 2.',
142
]), set(err.split('\n')))
218
self.assertEqual(b'', out)
220
b'Committing to: %s/' % osutils.getcwd(),
222
b'renamed hello.txt => subdir/hello.txt',
223
b'Committed revision 2.',
225
}, set(err.split('\n')))
144
227
def test_verbose_commit_with_unknown(self):
145
228
"""Unknown files should not be listed by default in verbose output"""
146
229
# Is that really the best policy?
147
wt = BzrDir.create_standalone_workingtree('.')
230
wt = ControlDir.create_standalone_workingtree('.')
148
231
self.build_tree(['hello.txt', 'extra.txt'])
149
232
wt.add(['hello.txt'])
150
out,err = self.run_bzr('commit -m added')
151
self.assertEqual('', out)
152
self.assertContainsRe(err, '^Committing to: .*\n'
154
'Committed revision 1\.\n$')
233
out, err = self.run_bzr('commit -m added')
234
self.assertEqual(b'', out)
235
self.assertContainsRe(err, b'^Committing to: .*\n'
236
b'added hello\\.txt\n'
237
b'Committed revision 1\\.\n$')
156
239
def test_verbose_commit_with_unchanged(self):
157
240
"""Unchanged files should not be listed by default in verbose output"""
239
322
other_tree.remove(['dirtoremove', 'filetoremove'])
240
323
self.build_tree_contents([
241
324
('other/newdir/',),
242
('other/filetomodify', 'new content'),
243
('other/newfile', 'new file content')])
325
('other/filetomodify', b'new content'),
326
('other/newfile', b'new file content')])
244
327
other_tree.add('newfile')
245
328
other_tree.add('newdir/')
246
329
other_tree.commit('modify all sample files and dirs.')
248
331
other_tree.unlock()
249
332
this_tree.merge_from_branch(other_tree.branch)
251
out,err = self.run_bzr('commit -m added')
252
self.assertEqual('', out)
253
self.assertEqual(set([
254
'Committing to: %s/' % osutils.getcwd(),
255
'modified filetomodify',
258
'renamed dirtorename => renameddir',
259
'renamed filetorename => renamedfile',
260
'renamed dirtoreparent => renameddir/reparenteddir',
261
'renamed filetoreparent => renameddir/reparentedfile',
262
'deleted dirtoremove',
263
'deleted filetoremove',
264
'Committed revision 2.',
266
]), set(err.split('\n')))
333
out, err = self.run_bzr('commit -m added', working_dir='this')
334
self.assertEqual(b'', out)
336
b'Committing to: %s/' % osutils.pathjoin(osutils.getcwd(), 'this'),
337
b'modified filetomodify',
340
b'renamed dirtorename => renameddir',
341
b'renamed filetorename => renamedfile',
342
b'renamed dirtoreparent => renameddir/reparenteddir',
343
b'renamed filetoreparent => renameddir/reparentedfile',
344
b'deleted dirtoremove',
345
b'deleted filetoremove',
346
b'Committed revision 2.',
348
}, set(err.split(b'\n')))
268
350
def test_empty_commit_message(self):
269
351
tree = self.make_branch_and_tree('.')
270
self.build_tree_contents([('foo.c', 'int main() {}')])
272
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.')
352
self.build_tree_contents([('foo.c', b'int main() {}')])
354
self.run_bzr('commit -m ""')
294
356
def test_other_branch_commit(self):
295
357
# this branch is to ensure consistent behaviour, whether we're run
318
380
# commit to the original branch to make the checkout out of date
319
381
tree.commit('message branch', allow_pointless=True)
320
382
# now commit to the checkout should emit
321
# ERROR: Out of date with the branch, 'bzr update' is suggested
383
# ERROR: Out of date with the branch, 'brz update' is suggested
322
384
output = self.run_bzr('commit --unchanged -m checkout_message '
323
385
'checkout', retcode=3)
324
386
self.assertEqual(output,
326
"bzr: ERROR: Working tree is out of date, please "
327
"run 'bzr update'.\n"))
388
"brz: ERROR: Working tree is out of date, please "
389
"run 'brz update'.\n"))
329
391
def test_local_commit_unbound(self):
330
392
# a --local commit on an unbound branch is an error
331
393
self.make_branch_and_tree('.')
332
394
out, err = self.run_bzr('commit --local', retcode=3)
333
395
self.assertEqualDiff('', out)
334
self.assertEqualDiff('bzr: ERROR: Cannot perform local-only commits '
396
self.assertEqualDiff('brz: ERROR: Cannot perform local-only commits '
335
397
'on unbound branches.\n', err)
337
399
def test_commit_a_text_merge_in_a_checkout(self):
343
405
trunk = self.make_branch_and_tree('trunk')
345
407
u1 = trunk.branch.create_checkout('u1')
346
self.build_tree_contents([('u1/hosts', 'initial contents\n')])
408
self.build_tree_contents([('u1/hosts', b'initial contents\n')])
348
410
self.run_bzr('commit -m add-hosts u1')
350
412
u2 = trunk.branch.create_checkout('u2')
351
self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
413
self.build_tree_contents([('u2/hosts', b'altered in u2\n')])
352
414
self.run_bzr('commit -m checkin-from-u2 u2')
354
416
# make an offline commits
355
self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
417
self.build_tree_contents([('u1/hosts', b'first offline change in u1\n')])
356
418
self.run_bzr('commit -m checkin-offline --local u1')
358
420
# now try to pull in online work from u2, and then commit our offline
381
443
self.build_tree(['a', 'b', 'c'])
382
444
tree.smart_add(['.'])
383
445
out, err = self.run_bzr(['commit', '-m', 'test', '-x', 'b'])
384
self.assertFalse('added b' in out)
385
self.assertFalse('added b' in err)
446
self.assertFalse(b'added b' in out)
447
self.assertFalse(b'added b' in err)
386
448
# If b was excluded it will still be 'added' in status.
387
449
out, err = self.run_bzr(['added'])
388
self.assertEqual('b\n', out)
389
self.assertEqual('', err)
450
self.assertEqual(b'b\n', out)
451
self.assertEqual(b'', err)
391
453
def test_commit_exclude_twice_uses_both_rules(self):
392
454
"""Commit -x foo -x bar should ignore changes to foo and bar."""
394
456
self.build_tree(['a', 'b', 'c'])
395
457
tree.smart_add(['.'])
396
458
out, err = self.run_bzr(['commit', '-m', 'test', '-x', 'b', '-x', 'c'])
397
self.assertFalse('added b' in out)
398
self.assertFalse('added c' in out)
399
self.assertFalse('added b' in err)
400
self.assertFalse('added c' in err)
459
self.assertFalse(b'added b' in out)
460
self.assertFalse(b'added c' in out)
461
self.assertFalse(b'added b' in err)
462
self.assertFalse(b'added c' in err)
401
463
# If b was excluded it will still be 'added' in status.
402
464
out, err = self.run_bzr(['added'])
403
self.assertTrue('b\n' in out)
404
self.assertTrue('c\n' in out)
405
self.assertEqual('', err)
465
self.assertTrue(b'b\n' in out)
466
self.assertTrue(b'c\n' in out)
467
self.assertEqual(b'', err)
407
469
def test_commit_respects_spec_for_removals(self):
408
470
"""Commit with a file spec should only commit removals that match"""
469
530
tree.add('hello.txt')
470
531
output, err = self.run_bzr(
471
532
'commit -m hello --fixes=lp:23452 tree/hello.txt')
472
self.assertEqual('', output)
473
self.assertContainsRe(err, 'Committing to: .*\n'
475
'Committed revision 1\.\n')
533
self.assertEqual(b'', output)
534
self.assertContainsRe(err, b'Committing to: .*\n'
535
b'added hello\\.txt\n'
536
b'Committed revision 1\\.\n')
538
def test_fixes_bug_unicode(self):
539
"""commit --fixes=lp:unicode succeeds without output."""
540
tree = self.make_branch_and_tree('tree')
541
self.build_tree(['tree/hello.txt'])
542
tree.add('hello.txt')
543
output, err = self.run_bzr(
544
['commit', '-m', 'hello',
545
u'--fixes=generic:\u20ac', 'tree/hello.txt'],
546
encoding='utf-8', retcode=3)
547
self.assertEqual(b'', output)
548
self.assertContainsRe(err,
549
b'brz: ERROR: Unrecognized bug generic:\xe2\x82\xac\\. Commit refused.\n')
477
551
def test_no_bugs_no_properties(self):
478
552
"""If no bugs are fixed, the bugs property is not set.
556
630
'commit -m add-b --fixes=xxx:123',
557
631
working_dir='tree')
633
def test_fixes_bug_with_default_tracker(self):
634
"""commit --fixes=234 uses the default bug tracker."""
635
tree = self.make_branch_and_tree('tree')
636
self.build_tree(['tree/hello.txt'])
637
tree.add('hello.txt')
639
["brz: ERROR: No tracker specified for bug 123. Use the form "
640
"'tracker:id' or specify a default bug tracker using the "
641
"`bugtracker` option.\n"
642
"See \"brz help bugs\" for more information on this feature. "
644
'commit -m add-b --fixes=123',
646
tree.branch.get_config_stack().set("bugtracker", "lp")
647
self.run_bzr('commit -m hello --fixes=234 tree/hello.txt')
648
last_rev = tree.branch.repository.get_revision(tree.last_revision())
649
self.assertEqual('https://launchpad.net/bugs/234 fixed',
650
last_rev.properties['bugs'])
559
652
def test_fixes_invalid_bug_number(self):
560
653
tree = self.make_branch_and_tree('tree')
561
654
self.build_tree(['tree/hello.txt'])
562
655
tree.add('hello.txt')
563
656
self.run_bzr_error(
564
657
["Did not understand bug identifier orange: Must be an integer. "
565
"See \"bzr help bugs\" for more information on this feature.\n"
658
"See \"brz help bugs\" for more information on this feature.\n"
566
659
"Commit refused."],
567
660
'commit -m add-b --fixes=lp:orange',
568
661
working_dir='tree')
643
736
out, err = self.run_bzr("commit -m hello "
644
737
"--commit-time='NOT A TIME' tree/hello.txt", retcode=3)
645
738
self.assertStartsWith(
646
err, "bzr: ERROR: Could not parse --commit-time:")
739
err, "brz: ERROR: Could not parse --commit-time:")
741
def test_commit_time_missing_tz(self):
742
tree = self.make_branch_and_tree('tree')
743
self.build_tree(['tree/hello.txt'])
744
tree.add('hello.txt')
745
out, err = self.run_bzr("commit -m hello "
746
"--commit-time='2009-10-10 08:00:00' tree/hello.txt", retcode=3)
747
self.assertStartsWith(
748
err, "brz: ERROR: Could not parse --commit-time:")
749
# Test that it is actually checking and does not simply crash with
750
# some other exception
751
self.assertContainsString(err, "missing a timezone offset")
648
753
def test_partial_commit_with_renames_in_tree(self):
649
754
# this test illustrates bug #140419
656
761
# then during partial commit we have error
657
762
# parent_id {dir-XXX} not in inventory
658
763
t.rename_one('dir/a', 'a')
659
self.build_tree_contents([('test', 'changes in test')])
764
self.build_tree_contents([('test', b'changes in test')])
661
766
out, err = self.run_bzr('commit test -m "partial commit"')
662
self.assertEquals('', out)
663
self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
767
self.assertEqual(b'', out)
768
self.assertContainsRe(err, br'modified test\nCommitted revision 2.')
665
770
def test_commit_readonly_checkout(self):
666
# https://bugs.edge.launchpad.net/bzr/+bug/129701
771
# https://bugs.launchpad.net/bzr/+bug/129701
667
772
# "UnlockableTransport error trying to commit in checkout of readonly
669
774
self.make_branch('master')
670
master = BzrDir.open_from_transport(
775
master = ControlDir.open_from_transport(
671
776
self.get_readonly_transport('master')).open_branch()
672
777
master.create_checkout('checkout')
673
778
out, err = self.run_bzr(['commit', '--unchanged', '-mfoo', 'checkout'],
675
780
self.assertContainsRe(err,
676
r'^bzr: ERROR: Cannot lock.*readonly transport')
781
br'^brz: ERROR: Cannot lock.*readonly transport')
678
783
def setup_editor(self):
679
784
# Test that commit template hooks work
680
785
if sys.platform == "win32":
681
f = file('fed.bat', 'w')
682
f.write('@rem dummy fed')
684
osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
786
with open('fed.bat', 'w') as f:
787
f.write('@rem dummy fed')
788
self.overrideEnv('BRZ_EDITOR', "fed.bat")
686
f = file('fed.sh', 'wb')
687
f.write('#!/bin/sh\n')
689
os.chmod('fed.sh', 0755)
690
osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
790
with open('fed.sh', 'wb') as f:
791
f.write(b'#!/bin/sh\n')
792
os.chmod('fed.sh', 0o755)
793
self.overrideEnv('BRZ_EDITOR', "./fed.sh")
692
795
def setup_commit_with_template(self):
693
796
self.setup_editor()
707
820
def test_commit_hook_template_rejected(self):
708
821
tree = self.setup_commit_with_template()
709
822
expected = tree.last_revision()
710
out, err = self.run_bzr_error(["empty commit message"],
823
out, err = self.run_bzr_error([b"Empty commit message specified."
824
b" Please specify a commit message with either"
825
b" --message or --file or leave a blank message"
826
b" with --message \"\"."],
711
827
"commit tree/hello.txt", stdin="n\n")
712
828
self.assertEqual(expected, tree.last_revision())
830
def test_set_commit_message(self):
831
msgeditor.hooks.install_named_hook("set_commit_message",
832
lambda commit_obj, msg: "save me some typing\n", None)
833
tree = self.make_branch_and_tree('tree')
834
self.build_tree(['tree/hello.txt'])
835
tree.add('hello.txt')
836
out, err = self.run_bzr("commit tree/hello.txt")
837
last_rev = tree.branch.repository.get_revision(tree.last_revision())
838
self.assertEqual('save me some typing\n', last_rev.message)
840
def test_commit_without_username(self):
841
"""Ensure commit error if username is not set.
843
self.run_bzr(['init', 'foo'])
844
with open('foo/foo.txt', 'w') as f:
846
self.run_bzr(['add'], working_dir='foo')
847
self.overrideEnv('EMAIL', None)
848
self.overrideEnv('BRZ_EMAIL', None)
849
# Also, make sure that it's not inferred from mailname.
850
self.overrideAttr(config, '_auto_user_id',
851
lambda: (None, None))
853
['Unable to determine your name'],
854
['commit', '-m', 'initial'], working_dir='foo')
856
def test_commit_recursive_checkout(self):
857
"""Ensure that a commit to a recursive checkout fails cleanly.
859
self.run_bzr(['init', 'test_branch'])
860
self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
861
self.run_bzr(['bind', '.'], working_dir='test_checkout') # bind to self
862
with open('test_checkout/foo.txt', 'w') as f:
864
self.run_bzr(['add'], working_dir='test_checkout')
865
out, err = self.run_bzr_error(
866
['Branch.*test_checkout.*appears to be bound to itself'],
867
['commit', '-m', 'addedfoo'], working_dir='test_checkout')
869
def test_mv_dirs_non_ascii(self):
870
"""Move directory with non-ascii name and containing files.
872
Regression test for bug 185211.
874
tree = self.make_branch_and_tree('.')
875
self.build_tree([u'abc\xa7/', u'abc\xa7/foo'])
877
tree.add([u'abc\xa7/', u'abc\xa7/foo'])
878
tree.commit('checkin')
880
tree.rename_one(u'abc\xa7', 'abc')
882
self.run_bzr('ci -m "non-ascii mv"')
885
class TestSmartServerCommit(TestCaseWithTransport):
887
def test_commit_to_lightweight(self):
888
self.setup_smart_server_with_call_log()
889
t = self.make_branch_and_tree('from')
890
for count in range(9):
891
t.commit(message='commit %d' % count)
892
out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
894
self.reset_smart_call_log()
895
self.build_tree(['target/afile'])
896
self.run_bzr(['add', 'target/afile'])
897
out, err = self.run_bzr(['commit', '-m', 'do something', 'target'])
898
# This figure represent the amount of work to perform this use case. It
899
# is entirely ok to reduce this number if a test fails due to rpc_count
900
# being too low. If rpc_count increases, more network roundtrips have
901
# become necessary for this use case. Please do not adjust this number
902
# upwards without agreement from bzr's network support maintainers.
903
self.assertLength(211, self.hpss_calls)
904
self.assertLength(2, self.hpss_connections)
905
self.expectFailure("commit still uses VFS calls",
906
self.assertThat, self.hpss_calls, ContainsNoVfsCalls)