15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
# Mr. Smoketoomuch: I'm sorry?
19
# Mr. Bounder: You'd better cut down a little then.
20
# Mr. Smoketoomuch: Oh, I see! Smoke too much so I'd better cut down a little
23
19
"""Black-box tests for bzr.
25
21
These check that it behaves properly when it's invoked through the regular
26
command-line interface. This doesn't actually run a new interpreter but
27
rather starts again from the run_bzr function.
22
command-line interface.
24
This always reinvokes bzr through a new Python interpreter, which is a
25
bit inefficient but arguably tests in a way more representative of how
26
it's normally invoked.
31
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
# Note: Please don't add new tests here, it's too big and bulky. Instead add
33
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
34
# UI command/aspect that is being tested.
37
from cStringIO import StringIO
32
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
43
33
from bzrlib.branch import Branch
44
import bzrlib.bzrdir as bzrdir
45
from bzrlib.errors import BzrCommandError
46
from bzrlib.osutils import (
52
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
53
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
54
from bzrlib.tests.blackbox import ExternalBase
55
from bzrlib.workingtree import WorkingTree
34
from bzrlib.commands import run_bzr
37
class ExternalBase(TestCaseInTempDir):
38
def runbzr(self, args, retcode=0,backtick=False):
39
if isinstance(args, basestring):
43
return self.backtick(['python', self.BZRPATH,] + args,
46
return self.runcmd(['python', self.BZRPATH,] + args,
58
50
class TestCommands(ExternalBase):
60
def test_nick_command(self):
61
"""bzr nick for viewing, setting nicknames"""
52
def test_help_commands(self):
55
self.runbzr('help commands')
56
self.runbzr('help help')
57
self.runbzr('commit -h')
59
def test_init_branch(self):
62
def test_whoami(self):
63
# this should always identify something, if only "john@localhost"
65
self.runbzr("whoami --email")
67
self.assertEquals(self.runbzr("whoami --email",
68
backtick=True).count('@'), 1)
70
def test_whoami_branch(self):
71
"""branch specific user identity works."""
64
72
self.runbzr('init')
65
nick = self.runbzr("nick",backtick=True)
66
self.assertEqual(nick, 'me.dev\n')
67
nick = self.runbzr("nick moo")
68
nick = self.runbzr("nick",backtick=True)
69
self.assertEqual(nick, 'moo\n')
73
f = file('.bzr/email', 'wt')
74
f.write('Branch Identity <branch@identi.ty>')
76
whoami = self.runbzr("whoami",backtick=True)
77
whoami_email = self.runbzr("whoami --email",backtick=True)
78
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
79
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
71
81
def test_invalid_commands(self):
72
self.runbzr("pants", retcode=3)
73
self.runbzr("--pants off", retcode=3)
74
self.runbzr("diff --message foo", retcode=3)
82
self.runbzr("pants", retcode=1)
83
self.runbzr("--pants off", retcode=1)
84
self.runbzr("diff --message foo", retcode=1)
86
def test_empty_commit(self):
88
self.build_tree(['hello.txt'])
89
self.runbzr("commit -m empty", retcode=1)
90
self.runbzr("add hello.txt")
91
self.runbzr("commit -m added")
76
93
def test_ignore_patterns(self):
78
self.assertEquals(self.capture('unknowns'), '')
94
from bzrlib.branch import Branch
96
b = Branch('.', init=True)
97
self.assertEquals(list(b.unknowns()), [])
99
file('foo.tmp', 'wt').write('tmp files are ignored')
100
self.assertEquals(list(b.unknowns()), [])
101
assert self.backtick('bzr unknowns') == ''
80
103
file('foo.c', 'wt').write('int main() {}')
81
self.assertEquals(self.capture('unknowns'), 'foo.c\n')
104
self.assertEquals(list(b.unknowns()), ['foo.c'])
105
assert self.backtick('bzr unknowns') == 'foo.c\n'
83
107
self.runbzr(['add', 'foo.c'])
84
self.assertEquals(self.capture('unknowns'), '')
108
assert self.backtick('bzr unknowns') == ''
86
110
# 'ignore' works when creating the .bzignore file
87
111
file('foo.blah', 'wt').write('blah')
88
self.assertEquals(self.capture('unknowns'), 'foo.blah\n')
112
self.assertEquals(list(b.unknowns()), ['foo.blah'])
89
113
self.runbzr('ignore *.blah')
90
self.assertEquals(self.capture('unknowns'), '')
91
self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\n')
114
self.assertEquals(list(b.unknowns()), [])
115
assert file('.bzrignore', 'rb').read() == '*.blah\n'
93
117
# 'ignore' works when then .bzrignore file already exists
94
118
file('garh', 'wt').write('garh')
95
self.assertEquals(self.capture('unknowns'), 'garh\n')
119
self.assertEquals(list(b.unknowns()), ['garh'])
120
assert self.backtick('bzr unknowns') == 'garh\n'
96
121
self.runbzr('ignore garh')
97
self.assertEquals(self.capture('unknowns'), '')
98
self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
122
self.assertEquals(list(b.unknowns()), [])
123
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
100
125
def test_revert(self):
101
126
self.runbzr('init')
171
184
test.runbzr('add goodbye')
172
185
test.runbzr('commit -m setup goodbye')
174
def test_export(self):
177
self.example_branch()
178
self.runbzr('export ../latest')
179
self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
180
self.runbzr('export ../first -r 1')
181
self.assert_(not os.path.exists('../first/goodbye'))
182
self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
183
self.runbzr('export ../first.gz -r 1')
184
self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
185
self.runbzr('export ../first.bz2 -r 1')
186
self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
188
from tarfile import TarFile
189
self.runbzr('export ../first.tar -r 1')
190
self.assert_(os.path.isfile('../first.tar'))
191
tf = TarFile('../first.tar')
192
self.assert_('first/hello' in tf.getnames(), tf.getnames())
193
self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
194
self.runbzr('export ../first.tar.gz -r 1')
195
self.assert_(os.path.isfile('../first.tar.gz'))
196
self.runbzr('export ../first.tbz2 -r 1')
197
self.assert_(os.path.isfile('../first.tbz2'))
198
self.runbzr('export ../first.tar.bz2 -r 1')
199
self.assert_(os.path.isfile('../first.tar.bz2'))
200
self.runbzr('export ../first.tar.tbz2 -r 1')
201
self.assert_(os.path.isfile('../first.tar.tbz2'))
203
from bz2 import BZ2File
204
tf = TarFile('../first.tar.tbz2',
205
fileobj=BZ2File('../first.tar.tbz2', 'r'))
206
self.assert_('first.tar/hello' in tf.getnames(), tf.getnames())
207
self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
208
self.runbzr('export ../first2.tar -r 1 --root pizza')
209
tf = TarFile('../first2.tar')
210
self.assert_('pizza/hello' in tf.getnames(), tf.getnames())
212
from zipfile import ZipFile
213
self.runbzr('export ../first.zip -r 1')
214
self.failUnlessExists('../first.zip')
215
zf = ZipFile('../first.zip')
216
self.assert_('first/hello' in zf.namelist(), zf.namelist())
217
self.assertEqual(zf.read('first/hello'), 'foo')
219
self.runbzr('export ../first2.zip -r 1 --root pizza')
220
zf = ZipFile('../first2.zip')
221
self.assert_('pizza/hello' in zf.namelist(), zf.namelist())
223
self.runbzr('export ../first-zip --format=zip -r 1')
224
zf = ZipFile('../first-zip')
225
self.assert_('first-zip/hello' in zf.namelist(), zf.namelist())
227
def test_inventory(self):
229
def output_equals(value, *args):
230
out = self.runbzr(['inventory'] + list(args), backtick=True)
231
self.assertEquals(out, value)
234
open('a', 'wb').write('hello\n')
240
output_equals('a\n', '--kind', 'file')
241
output_equals('b\n', '--kind', 'directory')
244
"""Test the abilities of 'bzr ls'"""
246
def bzrout(*args, **kwargs):
247
kwargs['backtick'] = True
248
return self.runbzr(*args, **kwargs)
250
def ls_equals(value, *args):
251
out = self.runbzr(['ls'] + list(args), backtick=True)
252
self.assertEquals(out, value)
255
self.build_tree_contents(
256
[('.bzrignore', '*.pyo\n'),
261
bzr('ls --verbose --null', retcode=3)
263
ls_equals('.bzrignore\na\n')
264
ls_equals('? .bzrignore\n'
267
ls_equals('.bzrignore\n'
270
ls_equals('', '--ignored')
271
ls_equals('', '--versioned')
272
ls_equals('.bzrignore\n'
274
'--unknown', '--ignored', '--versioned')
275
ls_equals('', '--ignored', '--versioned')
276
ls_equals('.bzrignore\0a\0', '--null')
279
ls_equals('? .bzrignore\nV a\n', '--verbose')
283
ls_equals('? .bzrignore\n'
287
open('subdir/b', 'wb').write('b\n')
289
ls_equals('V .bzrignore\n'
294
bzr('commit -m subdir')
296
ls_equals('.bzrignore\n'
301
ls_equals('V .bzrignore\n'
304
, '--verbose', '--non-recursive')
306
# Check what happens in a sub-directory
311
ls_equals('.bzrignore\n'
316
ls_equals('.bzrignore\0'
320
, '--from-root', '--null')
321
ls_equals('.bzrignore\n'
324
, '--from-root', '--non-recursive')
328
# Check what happens when we supply a specific revision
329
ls_equals('a\n', '--revision', '1')
331
, '--verbose', '--revision', '1')
334
ls_equals('', '--revision', '1')
336
# Now try to do ignored files.
338
open('blah.py', 'wb').write('unknown\n')
339
open('blah.pyo', 'wb').write('ignored\n')
340
ls_equals('.bzrignore\n'
346
ls_equals('V .bzrignore\n'
353
ls_equals('blah.pyo\n'
355
ls_equals('blah.py\n'
357
ls_equals('.bzrignore\n'
365
file("myfile", "wb").write("My contents\n")
367
self.runbzr('commit -m myfile')
368
self.run_bzr_captured('cat -r 1 myfile'.split(' '))
370
def test_pull_verbose(self):
371
"""Pull changes from one branch to another and watch the output."""
377
self.example_branch()
382
open('b', 'wb').write('else\n')
384
bzr(['commit', '-m', 'added b'])
387
out = bzr('pull --verbose ../b', backtick=True)
388
self.failIfEqual(out.find('Added Revisions:'), -1)
389
self.failIfEqual(out.find('message:\n added b'), -1)
390
self.failIfEqual(out.find('added b'), -1)
392
# Check that --overwrite --verbose prints out the removed entries
393
bzr('commit -m foo --unchanged')
395
bzr('commit -m baz --unchanged')
396
bzr('pull ../a', retcode=3)
397
out = bzr('pull --overwrite --verbose ../a', backtick=1)
399
remove_loc = out.find('Removed Revisions:')
400
self.failIfEqual(remove_loc, -1)
401
added_loc = out.find('Added Revisions:')
402
self.failIfEqual(added_loc, -1)
404
removed_message = out.find('message:\n baz')
405
self.failIfEqual(removed_message, -1)
406
self.failUnless(remove_loc < removed_message < added_loc)
408
added_message = out.find('message:\n foo')
409
self.failIfEqual(added_message, -1)
410
self.failUnless(added_loc < added_message)
412
def test_locations(self):
413
"""Using and remembering different locations"""
417
self.runbzr('commit -m unchanged --unchanged')
418
self.runbzr('pull', retcode=3)
419
self.runbzr('merge', retcode=3)
420
self.runbzr('branch . ../b')
423
self.runbzr('branch . ../c')
424
self.runbzr('pull ../c')
187
def test_revert(self):
188
self.example_branch()
189
file('hello', 'wt').write('bar')
190
file('goodbye', 'wt').write('qux')
191
self.runbzr('revert hello')
192
self.check_file_contents('hello', 'foo')
193
self.check_file_contents('goodbye', 'qux')
194
self.runbzr('revert')
195
self.check_file_contents('goodbye', 'baz')
197
def test_merge(self):
198
from bzrlib.branch import Branch
202
self.example_branch()
204
self.runbzr('branch a b')
206
file('goodbye', 'wt').write('quux')
207
self.runbzr(['commit', '-m', "more u's are always good"])
210
file('hello', 'wt').write('quuux')
211
# We can't merge when there are in-tree changes
212
self.runbzr('merge ../b', retcode=1)
213
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
214
self.runbzr('merge ../b')
215
self.check_file_contents('goodbye', 'quux')
216
# Merging a branch pulls its revision into the tree
219
a.get_revision_xml(b.last_patch())
220
self.log('pending merges: %s', a.pending_merges())
221
# assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
222
# % (a.pending_merges(), b.last_patch())
225
"""Pull changes from one branch to another."""
229
self.example_branch()
230
self.runbzr('pull', retcode=1)
231
self.runbzr('missing', retcode=1)
232
self.runbzr('missing .')
233
self.runbzr('missing')
235
self.runbzr('pull /', retcode=1)
239
self.runbzr('branch a b')
242
self.runbzr('commit -m blah --unchanged')
246
assert a.revision_history() == b.revision_history()[:-1]
427
247
self.runbzr('pull ../b')
429
self.runbzr('pull ../c')
430
self.runbzr('branch ../c ../d')
436
self.runbzr('pull', retcode=3)
437
self.runbzr('pull ../a --remember')
440
def test_unknown_command(self):
441
"""Handling of unknown command."""
442
out, err = self.run_bzr_captured(['fluffy-badger'],
444
self.assertEquals(out, '')
445
err.index('unknown command')
447
def create_conflicts(self):
448
"""Create a conflicted tree"""
451
file('hello', 'wb').write("hi world")
452
file('answer', 'wb').write("42")
455
self.runbzr('commit -m base')
456
self.runbzr('branch . ../other')
457
self.runbzr('branch . ../this')
459
file('hello', 'wb').write("Hello.")
460
file('answer', 'wb').write("Is anyone there?")
461
self.runbzr('commit -m other')
463
file('hello', 'wb').write("Hello, world")
464
self.runbzr('mv answer question')
465
file('question', 'wb').write("What do you get when you multiply six"
467
self.runbzr('commit -m this')
469
def test_status(self):
473
self.runbzr('commit --unchanged --message f')
474
self.runbzr('branch . ../branch2')
475
self.runbzr('branch . ../branch3')
476
self.runbzr('commit --unchanged --message peter')
477
os.chdir('../branch2')
478
self.runbzr('merge ../branch1')
479
self.runbzr('commit --unchanged --message pumpkin')
480
os.chdir('../branch3')
481
self.runbzr('merge ../branch2')
482
message = self.capture('status')
485
def test_conflicts(self):
486
"""Handling of merge conflicts"""
487
self.create_conflicts()
488
self.runbzr('merge ../other --show-base', retcode=1)
489
conflict_text = file('hello').read()
490
self.assert_('<<<<<<<' in conflict_text)
491
self.assert_('>>>>>>>' in conflict_text)
492
self.assert_('=======' in conflict_text)
493
self.assert_('|||||||' in conflict_text)
494
self.assert_('hi world' in conflict_text)
495
self.runbzr('revert')
496
self.runbzr('resolve --all')
497
self.runbzr('merge ../other', retcode=1)
498
conflict_text = file('hello').read()
499
self.assert_('|||||||' not in conflict_text)
500
self.assert_('hi world' not in conflict_text)
501
result = self.runbzr('conflicts', backtick=1)
502
self.assertEquals(result, "Text conflict in hello\nText conflict in"
504
result = self.runbzr('status', backtick=1)
505
self.assert_("conflicts:\n Text conflict in hello\n"
506
" Text conflict in question\n" in result, result)
507
self.runbzr('resolve hello')
508
result = self.runbzr('conflicts', backtick=1)
509
self.assertEquals(result, "Text conflict in question\n")
510
self.runbzr('commit -m conflicts', retcode=3)
511
self.runbzr('resolve --all')
512
result = self.runbzr('conflicts', backtick=1)
513
self.runbzr('commit -m conflicts')
514
self.assertEquals(result, "")
517
# create a source branch
518
os.mkdir('my-branch')
519
os.chdir('my-branch')
520
self.example_branch()
522
# with no push target, fail
523
self.runbzr('push', retcode=3)
524
# with an explicit target work
525
self.runbzr('push ../output-branch')
526
# with an implicit target work
529
self.runbzr('missing ../output-branch')
530
# advance this branch
531
self.runbzr('commit --unchanged -m unchanged')
533
os.chdir('../output-branch')
534
# There is no longer a difference as long as we have
535
# access to the working tree
538
# But we should be missing a revision
539
self.runbzr('missing ../my-branch', retcode=1)
541
# diverge the branches
542
self.runbzr('commit --unchanged -m unchanged')
543
os.chdir('../my-branch')
545
self.runbzr('push', retcode=3)
546
# and there are difference
547
self.runbzr('missing ../output-branch', retcode=1)
548
self.runbzr('missing --verbose ../output-branch', retcode=1)
549
# but we can force a push
550
self.runbzr('push --overwrite')
552
self.runbzr('missing ../output-branch')
554
# pushing to a new dir with no parent should fail
555
self.runbzr('push ../missing/new-branch', retcode=3)
556
# unless we provide --create-prefix
557
self.runbzr('push --create-prefix ../missing/new-branch')
559
self.runbzr('missing ../missing/new-branch')
561
def test_external_command(self):
562
"""Test that external commands can be run by setting the path
564
# We don't at present run bzr in a subprocess for blackbox tests, and so
565
# don't really capture stdout, only the internal python stream.
566
# Therefore we don't use a subcommand that produces any output or does
567
# anything -- we just check that it can be run successfully.
568
cmd_name = 'test-command'
569
if sys.platform == 'win32':
571
oldpath = os.environ.get('BZRPATH', None)
574
if os.environ.has_key('BZRPATH'):
575
del os.environ['BZRPATH']
577
f = file(cmd_name, 'wb')
578
if sys.platform == 'win32':
579
f.write('@echo off\n')
581
f.write('#!/bin/sh\n')
582
# f.write('echo Hello from test-command')
584
os.chmod(cmd_name, 0755)
586
# It should not find the command in the local
587
# directory by default, since it is not in my path
588
bzr(cmd_name, retcode=3)
590
# Now put it into my path
591
os.environ['BZRPATH'] = '.'
595
# Make sure empty path elements are ignored
596
os.environ['BZRPATH'] = os.pathsep
598
bzr(cmd_name, retcode=3)
602
os.environ['BZRPATH'] = oldpath
605
def listdir_sorted(dir):
248
assert a.revision_history() == b.revision_history()
249
self.runbzr('commit -m blah2 --unchanged')
251
self.runbzr('commit -m blah3 --unchanged')
252
self.runbzr('pull ../a', retcode=1)
254
self.runbzr('merge ../b')
255
self.runbzr('commit -m blah4 --unchanged')
257
self.runbzr('pull ../a')
258
assert a.revision_history()[-1] == b.revision_history()[-1]
261
def test_add_reports(self):
262
"""add command prints the names of added files."""
263
b = Branch('.', init=True)
264
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
266
from cStringIO import StringIO
269
ret = self.apply_redirected(None, out, None,
272
self.assertEquals(ret, 0)
274
# the ordering is not defined at the moment
275
results = sorted(out.getvalue().rstrip('\n').split('\n'))
276
self.assertEquals(['added dir',
611
282
class OldTests(ExternalBase):
633
304
f.write('hello world!\n')
636
self.assertEquals(capture('unknowns'), 'test.txt\n')
638
out = capture("status")
639
self.assertEquals(out, 'unknown:\n test.txt\n')
307
out = backtick("bzr unknowns")
308
self.assertEquals(out, 'test.txt\n')
310
out = backtick("bzr status")
311
assert out == 'unknown:\n test.txt\n'
313
out = backtick("bzr status --all")
314
assert out == "unknown:\n test.txt\n"
316
out = backtick("bzr status test.txt --all")
317
assert out == "unknown:\n test.txt\n"
641
319
f = file('test2.txt', 'wt')
642
320
f.write('goodbye cruel world...\n')
645
out = capture("status test.txt")
646
self.assertEquals(out, "unknown:\n test.txt\n")
323
out = backtick("bzr status test.txt")
324
assert out == "unknown:\n test.txt\n"
648
out = capture("status")
649
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
326
out = backtick("bzr status")
327
assert out == ("unknown:\n"
651
331
os.unlink('test2.txt')
653
333
progress("command aliases")
655
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
334
out = backtick("bzr st --all")
335
assert out == ("unknown:\n"
657
out = capture("stat")
658
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
338
out = backtick("bzr stat")
339
assert out == ("unknown:\n"
660
342
progress("command help")
661
343
runbzr("help st")
663
345
runbzr("help commands")
664
runbzr("help slartibartfast", 3)
346
runbzr("help slartibartfast", 1)
666
out = capture("help ci")
348
out = backtick("bzr help ci")
667
349
out.index('aliases: ')
351
progress("can't rename unversioned file")
352
runbzr("rename test.txt new-test.txt", 1)
354
progress("adding a file")
356
runbzr("add test.txt")
357
assert backtick("bzr unknowns") == ''
358
assert backtick("bzr status --all") == ("added:\n"
361
progress("rename newly-added file")
362
runbzr("rename test.txt hello.txt")
363
assert os.path.exists("hello.txt")
364
assert not os.path.exists("test.txt")
366
assert backtick("bzr revno") == '0\n'
368
progress("add first revision")
369
runbzr(['commit', '-m', 'add first revision'])
371
progress("more complex renames")
373
runbzr("rename hello.txt sub1", 1)
374
runbzr("rename hello.txt sub1/hello.txt", 1)
375
runbzr("move hello.txt sub1", 1)
378
runbzr("rename sub1 sub2")
379
runbzr("move hello.txt sub2")
380
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
382
assert exists("sub2")
383
assert exists("sub2/hello.txt")
384
assert not exists("sub1")
385
assert not exists("hello.txt")
387
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
391
runbzr('move sub2/hello.txt sub1')
392
assert not exists('sub2/hello.txt')
393
assert exists('sub1/hello.txt')
394
runbzr('move sub2 sub1')
395
assert not exists('sub2')
396
assert exists('sub1/sub2')
398
runbzr(['commit', '-m', 'rename nested subdirectories'])
401
self.assertEquals(backtick('bzr root')[:-1],
402
os.path.join(self.test_dir, 'branch1'))
403
runbzr('move ../hello.txt .')
404
assert exists('./hello.txt')
405
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
406
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
407
runbzr(['commit', '-m', 'move to parent directory'])
409
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
411
runbzr('move sub2/hello.txt .')
412
assert exists('hello.txt')
669
414
f = file('hello.txt', 'wt')
670
415
f.write('some nice new content\n')
673
runbzr("add hello.txt")
675
418
f = file('msg.tmp', 'wt')
676
f.write('this is my new commit\nand it has multiple lines, for fun')
419
f.write('this is my new commit\n')
679
422
runbzr('commit -F msg.tmp')
681
self.assertEquals(capture('revno'), '1\n')
682
runbzr('export -r 1 export-1.tmp')
424
assert backtick('bzr revno') == '5\n'
425
runbzr('export -r 5 export-5.tmp')
683
426
runbzr('export export.tmp')
687
430
runbzr('log -v --forward')
688
runbzr('log -m', retcode=3)
689
log_out = capture('log -m commit')
690
self.assert_("this is my new commit\n and" in log_out)
691
self.assert_("rename nested" not in log_out)
692
self.assert_('revision-id' not in log_out)
693
self.assert_('revision-id' in capture('log --show-ids -m commit'))
431
runbzr('log -m', retcode=1)
432
log_out = backtick('bzr log -m commit')
433
assert "this is my new commit" in log_out
434
assert "rename nested" not in log_out
435
assert 'revision-id' not in log_out
436
assert 'revision-id' in backtick('bzr log --show-ids -m commit')
695
log_out = capture('log --line')
696
# determine the widest line we want
697
max_width = terminal_width() - 1
698
for line in log_out.splitlines():
699
self.assert_(len(line) <= max_width, len(line))
700
self.assert_("this is my new commit and" not in log_out)
701
self.assert_("this is my new commit" in log_out)
703
439
progress("file with spaces in name")
704
440
mkdir('sub directory')
705
441
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
707
runbzr('diff', retcode=1)
708
444
runbzr('commit -m add-spaces')
721
os.symlink("NOWHERE1", "link1")
723
self.assertEquals(self.capture('unknowns'), '')
724
runbzr(['commit', '-m', '1: added symlink link1'])
728
self.assertEquals(self.capture('unknowns'), '')
729
os.symlink("NOWHERE2", "d1/link2")
730
self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
731
# is d1/link2 found when adding d1
733
self.assertEquals(self.capture('unknowns'), '')
734
os.symlink("NOWHERE3", "d1/link3")
735
self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
736
runbzr(['commit', '-m', '2: added dir, symlink'])
738
runbzr('rename d1 d2')
739
runbzr('move d2/link2 .')
740
runbzr('move link1 d2')
741
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
742
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
743
runbzr('add d2/link3')
744
runbzr('diff', retcode=1)
745
runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
748
os.symlink("TARGET 2", "link2")
749
os.unlink("d2/link1")
750
os.symlink("TARGET 1", "d2/link1")
751
runbzr('diff', retcode=1)
752
self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
753
runbzr(['commit', '-m', '4: retarget of two links'])
755
runbzr('remove d2/link1')
756
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
757
runbzr(['commit', '-m', '5: remove d2/link1'])
758
# try with the rm alias
759
runbzr('add d2/link1')
760
runbzr(['commit', '-m', '6: add d2/link1'])
761
runbzr('rm d2/link1')
762
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
763
runbzr(['commit', '-m', '7: remove d2/link1'])
767
runbzr('rename d2/link3 d1/link3new')
768
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
769
runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
773
runbzr(['export', '-r', '1', 'exp1.tmp'])
775
self.assertEquals(listdir_sorted("."), [ "link1" ])
776
self.assertEquals(os.readlink("link1"), "NOWHERE1")
779
runbzr(['export', '-r', '2', 'exp2.tmp'])
781
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
784
runbzr(['export', '-r', '3', 'exp3.tmp'])
786
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
787
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
788
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
789
self.assertEquals(os.readlink("link2") , "NOWHERE2")
792
runbzr(['export', '-r', '4', 'exp4.tmp'])
794
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
795
self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
796
self.assertEquals(os.readlink("link2") , "TARGET 2")
797
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
800
runbzr(['export', '-r', '5', 'exp5.tmp'])
802
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
803
self.assert_(os.path.islink("link2"))
804
self.assert_(listdir_sorted("d2")== [ "link3" ])
807
runbzr(['export', '-r', '8', 'exp6.tmp'])
809
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
810
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
811
self.assertEquals(listdir_sorted("d2"), [])
812
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
815
progress("skipping symlink tests")
818
class RemoteTests(object):
819
"""Test bzr ui commands against remote branches."""
821
def test_branch(self):
823
wt = self.make_branch_and_tree('from')
825
wt.commit('empty commit for nonsense', allow_pointless=True)
826
url = self.get_readonly_url('from')
827
self.run_bzr('branch', url, 'to')
828
branch = Branch.open('to')
829
self.assertEqual(1, len(branch.revision_history()))
830
# the branch should be set in to to from
831
self.assertEqual(url + '/', branch.get_parent())
834
self.build_tree(['branch/', 'branch/file'])
835
self.capture('init branch')
836
self.capture('add branch/file')
837
self.capture('commit -m foo branch')
838
url = self.get_readonly_url('branch/file')
839
output = self.capture('log %s' % url)
840
self.assertEqual(8, len(output.split('\n')))
842
def test_check(self):
843
self.build_tree(['branch/', 'branch/file'])
844
self.capture('init branch')
845
self.capture('add branch/file')
846
self.capture('commit -m foo branch')
847
url = self.get_readonly_url('branch/')
848
self.run_bzr('check', url)
851
# create a source branch
852
os.mkdir('my-branch')
853
os.chdir('my-branch')
855
file('hello', 'wt').write('foo')
856
self.run_bzr('add', 'hello')
857
self.run_bzr('commit', '-m', 'setup')
859
# with an explicit target work
860
self.run_bzr('push', self.get_url('output-branch'))
863
class HTTPTests(TestCaseWithWebserver, RemoteTests):
864
"""Test various commands against a HTTP server."""
867
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
868
"""Test various commands against a SFTP server using abs paths."""
871
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
872
"""Test various commands against a SFTP server using abs paths."""
875
super(SFTPTestsAbsoluteSibling, self).setUp()
876
self._override_home = '/dev/noone/runs/tests/here'
879
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
880
"""Test various commands against a SFTP server using homedir rel paths."""
883
super(SFTPTestsRelative, self).setUp()
884
self._get_remote_is_absolute = False