1
1
# Copyright (C) 2005 by Canonical Ltd
2
2
# -*- coding: utf-8 -*-
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
12
# GNU General Public License for more details.
14
14
# You should have received a copy of the GNU General Public License
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")
93
def test_ignore_patterns(self):
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') == ''
103
file('foo.c', 'wt').write('int main() {}')
104
self.assertEquals(list(b.unknowns()), ['foo.c'])
105
assert self.backtick('bzr unknowns') == 'foo.c\n'
107
self.runbzr(['add', 'foo.c'])
108
assert self.backtick('bzr unknowns') == ''
110
# 'ignore' works when creating the .bzignore file
111
file('foo.blah', 'wt').write('blah')
112
self.assertEquals(list(b.unknowns()), ['foo.blah'])
113
self.runbzr('ignore *.blah')
114
self.assertEquals(list(b.unknowns()), [])
115
assert file('.bzrignore', 'rb').read() == '*.blah\n'
117
# 'ignore' works when then .bzrignore file already exists
118
file('garh', 'wt').write('garh')
119
self.assertEquals(list(b.unknowns()), ['garh'])
120
assert self.backtick('bzr unknowns') == 'garh\n'
121
self.runbzr('ignore garh')
122
self.assertEquals(list(b.unknowns()), [])
123
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
76
125
def test_revert(self):
77
126
self.runbzr('init')
147
184
test.runbzr('add goodbye')
148
185
test.runbzr('commit -m setup goodbye')
150
def test_pull_verbose(self):
151
"""Pull changes from one branch to another and watch the output."""
187
def test_revert(self):
157
188
self.example_branch()
162
open('b', 'wb').write('else\n')
164
bzr(['commit', '-m', 'added b'])
167
out = bzr('pull --verbose ../b', backtick=True)
168
self.failIfEqual(out.find('Added Revisions:'), -1)
169
self.failIfEqual(out.find('message:\n added b'), -1)
170
self.failIfEqual(out.find('added b'), -1)
172
# Check that --overwrite --verbose prints out the removed entries
173
bzr('commit -m foo --unchanged')
175
bzr('commit -m baz --unchanged')
176
bzr('pull ../a', retcode=3)
177
out = bzr('pull --overwrite --verbose ../a', backtick=1)
179
remove_loc = out.find('Removed Revisions:')
180
self.failIfEqual(remove_loc, -1)
181
added_loc = out.find('Added Revisions:')
182
self.failIfEqual(added_loc, -1)
184
removed_message = out.find('message:\n baz')
185
self.failIfEqual(removed_message, -1)
186
self.failUnless(remove_loc < removed_message < added_loc)
188
added_message = out.find('message:\n foo')
189
self.failIfEqual(added_message, -1)
190
self.failUnless(added_loc < added_message)
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
192
def test_locations(self):
193
"""Using and remembering different locations"""
197
self.runbzr('commit -m unchanged --unchanged')
198
self.runbzr('pull', retcode=3)
199
self.runbzr('merge', retcode=3)
200
self.runbzr('branch . ../b')
203
self.runbzr('branch . ../c')
204
self.runbzr('pull ../c')
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()
231
self.runbzr('branch a b')
233
self.runbzr('commit -m blah --unchanged')
237
assert a.revision_history() == b.revision_history()[:-1]
207
238
self.runbzr('pull ../b')
209
self.runbzr('pull ../c')
210
self.runbzr('branch ../c ../d')
216
self.runbzr('pull', retcode=3)
217
self.runbzr('pull ../a --remember')
220
def test_unknown_command(self):
221
"""Handling of unknown command."""
222
out, err = self.run_bzr_captured(['fluffy-badger'],
224
self.assertEquals(out, '')
225
err.index('unknown command')
227
def create_conflicts(self):
228
"""Create a conflicted tree"""
231
file('hello', 'wb').write("hi world")
232
file('answer', 'wb').write("42")
235
self.runbzr('commit -m base')
236
self.runbzr('branch . ../other')
237
self.runbzr('branch . ../this')
239
file('hello', 'wb').write("Hello.")
240
file('answer', 'wb').write("Is anyone there?")
241
self.runbzr('commit -m other')
243
file('hello', 'wb').write("Hello, world")
244
self.runbzr('mv answer question')
245
file('question', 'wb').write("What do you get when you multiply six"
247
self.runbzr('commit -m this')
249
def test_status(self):
253
self.runbzr('commit --unchanged --message f')
254
self.runbzr('branch . ../branch2')
255
self.runbzr('branch . ../branch3')
256
self.runbzr('commit --unchanged --message peter')
257
os.chdir('../branch2')
258
self.runbzr('merge ../branch1')
259
self.runbzr('commit --unchanged --message pumpkin')
260
os.chdir('../branch3')
261
self.runbzr('merge ../branch2')
262
message = self.capture('status')
265
def test_conflicts(self):
266
"""Handling of merge conflicts"""
267
self.create_conflicts()
268
self.runbzr('merge ../other --show-base', retcode=1)
269
conflict_text = file('hello').read()
270
self.assert_('<<<<<<<' in conflict_text)
271
self.assert_('>>>>>>>' in conflict_text)
272
self.assert_('=======' in conflict_text)
273
self.assert_('|||||||' in conflict_text)
274
self.assert_('hi world' in conflict_text)
275
self.runbzr('revert')
276
self.runbzr('resolve --all')
277
self.runbzr('merge ../other', retcode=1)
278
conflict_text = file('hello').read()
279
self.assert_('|||||||' not in conflict_text)
280
self.assert_('hi world' not in conflict_text)
281
result = self.runbzr('conflicts', backtick=1)
282
self.assertEquals(result, "Text conflict in hello\nText conflict in"
284
result = self.runbzr('status', backtick=1)
285
self.assert_("conflicts:\n Text conflict in hello\n"
286
" Text conflict in question\n" in result, result)
287
self.runbzr('resolve hello')
288
result = self.runbzr('conflicts', backtick=1)
289
self.assertEquals(result, "Text conflict in question\n")
290
self.runbzr('commit -m conflicts', retcode=3)
291
self.runbzr('resolve --all')
292
result = self.runbzr('conflicts', backtick=1)
293
self.runbzr('commit -m conflicts')
294
self.assertEquals(result, "")
297
# create a source branch
298
os.mkdir('my-branch')
299
os.chdir('my-branch')
300
self.example_branch()
302
# with no push target, fail
303
self.runbzr('push', retcode=3)
304
# with an explicit target work
305
self.runbzr('push ../output-branch')
306
# with an implicit target work
309
self.runbzr('missing ../output-branch')
310
# advance this branch
311
self.runbzr('commit --unchanged -m unchanged')
313
os.chdir('../output-branch')
314
# There is no longer a difference as long as we have
315
# access to the working tree
318
# But we should be missing a revision
319
self.runbzr('missing ../my-branch', retcode=1)
321
# diverge the branches
322
self.runbzr('commit --unchanged -m unchanged')
323
os.chdir('../my-branch')
325
self.runbzr('push', retcode=3)
326
# and there are difference
327
self.runbzr('missing ../output-branch', retcode=1)
328
self.runbzr('missing --verbose ../output-branch', retcode=1)
329
# but we can force a push
330
self.runbzr('push --overwrite')
332
self.runbzr('missing ../output-branch')
334
# pushing to a new dir with no parent should fail
335
self.runbzr('push ../missing/new-branch', retcode=3)
336
# unless we provide --create-prefix
337
self.runbzr('push --create-prefix ../missing/new-branch')
339
self.runbzr('missing ../missing/new-branch')
341
def test_external_command(self):
342
"""Test that external commands can be run by setting the path
344
# We don't at present run bzr in a subprocess for blackbox tests, and so
345
# don't really capture stdout, only the internal python stream.
346
# Therefore we don't use a subcommand that produces any output or does
347
# anything -- we just check that it can be run successfully.
348
cmd_name = 'test-command'
349
if sys.platform == 'win32':
351
oldpath = os.environ.get('BZRPATH', None)
354
if 'BZRPATH' in os.environ:
355
del os.environ['BZRPATH']
357
f = file(cmd_name, 'wb')
358
if sys.platform == 'win32':
359
f.write('@echo off\n')
361
f.write('#!/bin/sh\n')
362
# f.write('echo Hello from test-command')
364
os.chmod(cmd_name, 0755)
366
# It should not find the command in the local
367
# directory by default, since it is not in my path
368
bzr(cmd_name, retcode=3)
370
# Now put it into my path
371
os.environ['BZRPATH'] = '.'
375
# Make sure empty path elements are ignored
376
os.environ['BZRPATH'] = os.pathsep
378
bzr(cmd_name, retcode=3)
382
os.environ['BZRPATH'] = oldpath
385
def listdir_sorted(dir):
239
assert a.revision_history() == b.revision_history()
240
self.runbzr('commit -m blah2 --unchanged')
242
self.runbzr('commit -m blah3 --unchanged')
243
self.runbzr('pull ../a', retcode=1)
245
self.runbzr('merge ../b')
246
self.runbzr('commit -m blah4 --unchanged')
248
self.runbzr('pull ../a')
249
assert a.revision_history()[-1] == b.revision_history()[-1]
252
def test_add_reports(self):
253
"""add command prints the names of added files."""
254
b = Branch('.', init=True)
255
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
257
from cStringIO import StringIO
260
ret = self.apply_redirected(None, out, None,
263
self.assertEquals(ret, 0)
265
# the ordering is not defined at the moment
266
results = sorted(out.getvalue().rstrip('\n').split('\n'))
267
self.assertEquals(['added dir',
391
273
class OldTests(ExternalBase):
413
295
f.write('hello world!\n')
416
self.assertEquals(capture('unknowns'), 'test.txt\n')
418
out = capture("status")
419
self.assertEquals(out, 'unknown:\n test.txt\n')
298
out = backtick("bzr unknowns")
299
self.assertEquals(out, 'test.txt\n')
301
out = backtick("bzr status")
302
assert out == 'unknown:\n test.txt\n'
304
out = backtick("bzr status --all")
305
assert out == "unknown:\n test.txt\n"
307
out = backtick("bzr status test.txt --all")
308
assert out == "unknown:\n test.txt\n"
421
310
f = file('test2.txt', 'wt')
422
311
f.write('goodbye cruel world...\n')
425
out = capture("status test.txt")
426
self.assertEquals(out, "unknown:\n test.txt\n")
314
out = backtick("bzr status test.txt")
315
assert out == "unknown:\n test.txt\n"
428
out = capture("status")
429
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
317
out = backtick("bzr status")
318
assert out == ("unknown:\n"
431
322
os.unlink('test2.txt')
433
324
progress("command aliases")
435
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
325
out = backtick("bzr st --all")
326
assert out == ("unknown:\n"
437
out = capture("stat")
438
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
329
out = backtick("bzr stat")
330
assert out == ("unknown:\n"
440
333
progress("command help")
441
334
runbzr("help st")
443
336
runbzr("help commands")
444
runbzr("help slartibartfast", 3)
337
runbzr("help slartibartfast", 1)
446
out = capture("help ci")
339
out = backtick("bzr help ci")
447
340
out.index('aliases: ')
342
progress("can't rename unversioned file")
343
runbzr("rename test.txt new-test.txt", 1)
345
progress("adding a file")
347
runbzr("add test.txt")
348
assert backtick("bzr unknowns") == ''
349
assert backtick("bzr status --all") == ("added:\n"
352
progress("rename newly-added file")
353
runbzr("rename test.txt hello.txt")
354
assert os.path.exists("hello.txt")
355
assert not os.path.exists("test.txt")
357
assert backtick("bzr revno") == '0\n'
359
progress("add first revision")
360
runbzr(['commit', '-m', 'add first revision'])
362
progress("more complex renames")
364
runbzr("rename hello.txt sub1", 1)
365
runbzr("rename hello.txt sub1/hello.txt", 1)
366
runbzr("move hello.txt sub1", 1)
369
runbzr("rename sub1 sub2")
370
runbzr("move hello.txt sub2")
371
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
373
assert exists("sub2")
374
assert exists("sub2/hello.txt")
375
assert not exists("sub1")
376
assert not exists("hello.txt")
378
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
382
runbzr('move sub2/hello.txt sub1')
383
assert not exists('sub2/hello.txt')
384
assert exists('sub1/hello.txt')
385
runbzr('move sub2 sub1')
386
assert not exists('sub2')
387
assert exists('sub1/sub2')
389
runbzr(['commit', '-m', 'rename nested subdirectories'])
392
self.assertEquals(backtick('bzr root')[:-1],
393
os.path.join(self.test_dir, 'branch1'))
394
runbzr('move ../hello.txt .')
395
assert exists('./hello.txt')
396
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
397
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
398
runbzr(['commit', '-m', 'move to parent directory'])
400
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
402
runbzr('move sub2/hello.txt .')
403
assert exists('hello.txt')
449
405
f = file('hello.txt', 'wt')
450
406
f.write('some nice new content\n')
453
runbzr("add hello.txt")
455
409
f = file('msg.tmp', 'wt')
456
f.write('this is my new commit\nand it has multiple lines, for fun')
410
f.write('this is my new commit\n')
459
413
runbzr('commit -F msg.tmp')
461
self.assertEquals(capture('revno'), '1\n')
462
runbzr('export -r 1 export-1.tmp')
415
assert backtick('bzr revno') == '5\n'
416
runbzr('export -r 5 export-5.tmp')
463
417
runbzr('export export.tmp')
467
421
runbzr('log -v --forward')
468
runbzr('log -m', retcode=3)
469
log_out = capture('log -m commit')
470
self.assert_("this is my new commit\n and" in log_out)
471
self.assert_("rename nested" not in log_out)
472
self.assert_('revision-id' not in log_out)
473
self.assert_('revision-id' in capture('log --show-ids -m commit'))
422
runbzr('log -m', retcode=1)
423
log_out = backtick('bzr log -m commit')
424
assert "this is my new commit" in log_out
425
assert "rename nested" not in log_out
426
assert 'revision-id' not in log_out
427
assert 'revision-id' in backtick('bzr log --show-ids -m commit')
475
log_out = capture('log --line')
476
# determine the widest line we want
477
max_width = terminal_width() - 1
478
for line in log_out.splitlines():
479
self.assert_(len(line) <= max_width, len(line))
480
self.assert_("this is my new commit and" not in log_out)
481
self.assert_("this is my new commit" in log_out)
483
430
progress("file with spaces in name")
484
431
mkdir('sub directory')
485
432
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
487
runbzr('diff', retcode=1)
488
435
runbzr('commit -m add-spaces')
501
os.symlink("NOWHERE1", "link1")
503
self.assertEquals(self.capture('unknowns'), '')
504
runbzr(['commit', '-m', '1: added symlink link1'])
508
self.assertEquals(self.capture('unknowns'), '')
509
os.symlink("NOWHERE2", "d1/link2")
510
self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
511
# is d1/link2 found when adding d1
513
self.assertEquals(self.capture('unknowns'), '')
514
os.symlink("NOWHERE3", "d1/link3")
515
self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
516
runbzr(['commit', '-m', '2: added dir, symlink'])
518
runbzr('rename d1 d2')
519
runbzr('move d2/link2 .')
520
runbzr('move link1 d2')
521
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
522
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
523
runbzr('add d2/link3')
524
runbzr('diff', retcode=1)
525
runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
528
os.symlink("TARGET 2", "link2")
529
os.unlink("d2/link1")
530
os.symlink("TARGET 1", "d2/link1")
531
runbzr('diff', retcode=1)
532
self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
533
runbzr(['commit', '-m', '4: retarget of two links'])
535
runbzr('remove d2/link1')
536
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
537
runbzr(['commit', '-m', '5: remove d2/link1'])
538
# try with the rm alias
539
runbzr('add d2/link1')
540
runbzr(['commit', '-m', '6: add d2/link1'])
541
runbzr('rm d2/link1')
542
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
543
runbzr(['commit', '-m', '7: remove d2/link1'])
547
runbzr('rename d2/link3 d1/link3new')
548
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
549
runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
553
runbzr(['export', '-r', '1', 'exp1.tmp'])
555
self.assertEquals(listdir_sorted("."), [ "link1" ])
556
self.assertEquals(os.readlink("link1"), "NOWHERE1")
559
runbzr(['export', '-r', '2', 'exp2.tmp'])
561
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
564
runbzr(['export', '-r', '3', 'exp3.tmp'])
566
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
567
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
568
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
569
self.assertEquals(os.readlink("link2") , "NOWHERE2")
572
runbzr(['export', '-r', '4', 'exp4.tmp'])
574
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
575
self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
576
self.assertEquals(os.readlink("link2") , "TARGET 2")
577
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
580
runbzr(['export', '-r', '5', 'exp5.tmp'])
582
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
583
self.assert_(os.path.islink("link2"))
584
self.assert_(listdir_sorted("d2")== [ "link3" ])
587
runbzr(['export', '-r', '8', 'exp6.tmp'])
589
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
590
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
591
self.assertEquals(listdir_sorted("d2"), [])
592
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
595
progress("skipping symlink tests")
598
class RemoteTests(object):
599
"""Test bzr ui commands against remote branches."""
601
def test_branch(self):
603
wt = self.make_branch_and_tree('from')
605
wt.commit('empty commit for nonsense', allow_pointless=True)
606
url = self.get_readonly_url('from')
607
self.run_bzr('branch', url, 'to')
608
branch = Branch.open('to')
609
self.assertEqual(1, len(branch.revision_history()))
610
# the branch should be set in to to from
611
self.assertEqual(url + '/', branch.get_parent())
614
self.build_tree(['branch/', 'branch/file'])
615
self.capture('init branch')
616
self.capture('add branch/file')
617
self.capture('commit -m foo branch')
618
url = self.get_readonly_url('branch/file')
619
output = self.capture('log %s' % url)
620
self.assertEqual(8, len(output.split('\n')))
622
def test_check(self):
623
self.build_tree(['branch/', 'branch/file'])
624
self.capture('init branch')
625
self.capture('add branch/file')
626
self.capture('commit -m foo branch')
627
url = self.get_readonly_url('branch/')
628
self.run_bzr('check', url)
631
# create a source branch
632
os.mkdir('my-branch')
633
os.chdir('my-branch')
635
file('hello', 'wt').write('foo')
636
self.run_bzr('add', 'hello')
637
self.run_bzr('commit', '-m', 'setup')
639
# with an explicit target work
640
self.run_bzr('push', self.get_url('output-branch'))
643
class HTTPTests(TestCaseWithWebserver, RemoteTests):
644
"""Test various commands against a HTTP server."""
647
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
648
"""Test various commands against a SFTP server using abs paths."""
651
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
652
"""Test various commands against a SFTP server using abs paths."""
655
super(SFTPTestsAbsoluteSibling, self).setUp()
656
self._override_home = '/dev/noone/runs/tests/here'
659
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
660
"""Test various commands against a SFTP server using homedir rel paths."""
663
super(SFTPTestsRelative, self).setUp()
664
self._get_remote_is_absolute = False