1
# Copyright (C) 2005 Canonical Ltd
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
29
from cStringIO import StringIO
34
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
46
35
from bzrlib.branch import Branch
47
from bzrlib.errors import BzrCommandError
48
from bzrlib.osutils import (
53
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
54
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
55
from bzrlib.tests.blackbox import ExternalBase
56
from bzrlib.workingtree import WorkingTree
38
class ExternalBase(TestCaseInTempDir):
40
def runbzr(self, args, retcode=0, backtick=False):
41
if isinstance(args, basestring):
45
return self.run_bzr_captured(args, retcode=retcode)[0]
47
return self.run_bzr_captured(args, retcode=retcode)
59
50
class TestCommands(ExternalBase):
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."""
73
f = file('.bzr/email', 'wt')
74
f.write('Branch Identity <branch@identi.ty>')
76
bzr_email = os.environ.get('BZREMAIL')
77
if bzr_email is not None:
78
del os.environ['BZREMAIL']
79
whoami = self.runbzr("whoami",backtick=True)
80
whoami_email = self.runbzr("whoami --email",backtick=True)
81
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
82
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
83
# Verify that the environment variable overrides the value
85
os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
86
whoami = self.runbzr("whoami",backtick=True)
87
whoami_email = self.runbzr("whoami --email",backtick=True)
88
self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
89
self.assertTrue(whoami_email.startswith('other@environ.ment'))
90
if bzr_email is not None:
91
os.environ['BZREMAIL'] = bzr_email
61
93
def test_invalid_commands(self):
62
self.runbzr("pants", retcode=3)
63
self.runbzr("--pants off", retcode=3)
64
self.runbzr("diff --message foo", retcode=3)
94
self.runbzr("pants", retcode=1)
95
self.runbzr("--pants off", retcode=1)
96
self.runbzr("diff --message foo", retcode=1)
98
def test_empty_commit(self):
100
self.build_tree(['hello.txt'])
101
self.runbzr("commit -m empty", retcode=1)
102
self.runbzr("add hello.txt")
103
self.runbzr("commit -m added")
105
def test_ignore_patterns(self):
106
from bzrlib.branch import Branch
108
b = Branch.initialize('.')
109
self.assertEquals(list(b.unknowns()), [])
111
file('foo.tmp', 'wt').write('tmp files are ignored')
112
self.assertEquals(list(b.unknowns()), [])
113
assert self.capture('unknowns') == ''
115
file('foo.c', 'wt').write('int main() {}')
116
self.assertEquals(list(b.unknowns()), ['foo.c'])
117
assert self.capture('unknowns') == 'foo.c\n'
119
self.runbzr(['add', 'foo.c'])
120
assert self.capture('unknowns') == ''
122
# 'ignore' works when creating the .bzignore file
123
file('foo.blah', 'wt').write('blah')
124
self.assertEquals(list(b.unknowns()), ['foo.blah'])
125
self.runbzr('ignore *.blah')
126
self.assertEquals(list(b.unknowns()), [])
127
assert file('.bzrignore', 'rU').read() == '*.blah\n'
129
# 'ignore' works when then .bzrignore file already exists
130
file('garh', 'wt').write('garh')
131
self.assertEquals(list(b.unknowns()), ['garh'])
132
assert self.capture('unknowns') == 'garh\n'
133
self.runbzr('ignore garh')
134
self.assertEquals(list(b.unknowns()), [])
135
assert file('.bzrignore', 'rU').read() == '*.blah\ngarh\n'
66
137
def test_revert(self):
67
138
self.runbzr('init')
137
207
test.runbzr('add goodbye')
138
208
test.runbzr('commit -m setup goodbye')
140
def test_pull_verbose(self):
141
"""Pull changes from one branch to another and watch the output."""
147
self.example_branch()
152
open('b', 'wb').write('else\n')
154
bzr(['commit', '-m', 'added b'])
157
out = bzr('pull --verbose ../b', backtick=True)
158
self.failIfEqual(out.find('Added Revisions:'), -1)
159
self.failIfEqual(out.find('message:\n added b'), -1)
160
self.failIfEqual(out.find('added b'), -1)
162
# Check that --overwrite --verbose prints out the removed entries
163
bzr('commit -m foo --unchanged')
165
bzr('commit -m baz --unchanged')
166
bzr('pull ../a', retcode=3)
167
out = bzr('pull --overwrite --verbose ../a', backtick=1)
169
remove_loc = out.find('Removed Revisions:')
170
self.failIfEqual(remove_loc, -1)
171
added_loc = out.find('Added Revisions:')
172
self.failIfEqual(added_loc, -1)
174
removed_message = out.find('message:\n baz')
175
self.failIfEqual(removed_message, -1)
176
self.failUnless(remove_loc < removed_message < added_loc)
178
added_message = out.find('message:\n foo')
179
self.failIfEqual(added_message, -1)
180
self.failUnless(added_loc < added_message)
182
def test_locations(self):
183
"""Using and remembering different locations"""
187
self.runbzr('commit -m unchanged --unchanged')
188
self.runbzr('pull', retcode=3)
189
self.runbzr('merge', retcode=3)
190
self.runbzr('branch . ../b')
193
self.runbzr('branch . ../c')
194
self.runbzr('pull ../c')
197
self.runbzr('pull ../b')
199
self.runbzr('pull ../c')
200
self.runbzr('branch ../c ../d')
201
osutils.rmtree('../c')
206
self.runbzr('pull', retcode=3)
207
self.runbzr('pull ../a --remember')
211
self.example_branch()
212
file('hello', 'wt').write('hello world!')
213
self.runbzr('commit -m fixing hello')
214
output = self.runbzr('diff -r 2..3', backtick=1)
215
self.assert_('\n+hello world!' in output)
216
output = self.runbzr('diff -r last:3..last:1', backtick=1)
217
self.assert_('\n+baz' in output)
219
def test_branch(self):
220
"""Branch from one branch to another."""
223
self.example_branch()
225
self.runbzr('branch a b')
226
self.runbzr('branch a c -r 1')
228
self.runbzr('commit -m foo --unchanged')
230
# naughty - abstraction violations RBC 20050928
231
print "test_branch used to delete the stores, how is this meant to work ?"
232
#shutil.rmtree('a/.bzr/revision-store')
233
#shutil.rmtree('a/.bzr/inventory-store', ignore_errors=True)
234
#shutil.rmtree('a/.bzr/text-store', ignore_errors=True)
235
self.runbzr('branch a d --basis b')
237
def test_merge(self):
238
from bzrlib.branch import Branch
242
self.example_branch()
244
self.runbzr('branch a b')
246
file('goodbye', 'wt').write('quux')
247
self.runbzr(['commit', '-m', "more u's are always good"])
250
file('hello', 'wt').write('quuux')
251
# We can't merge when there are in-tree changes
252
self.runbzr('merge ../b', retcode=1)
253
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
254
self.runbzr('merge ../b')
255
self.check_file_contents('goodbye', 'quux')
256
# Merging a branch pulls its revision into the tree
258
b = Branch.open('../b')
259
a.get_revision_xml(b.last_revision())
260
self.log('pending merges: %s', a.pending_merges())
261
# assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
262
# % (a.pending_merges(), b.last_revision())
265
"""Pull changes from one branch to another."""
269
self.example_branch()
270
self.runbzr('pull', retcode=1)
271
self.runbzr('missing', retcode=1)
272
self.runbzr('missing .')
273
self.runbzr('missing')
275
self.runbzr('pull /', retcode=1)
279
self.runbzr('branch a b')
283
self.runbzr('add subdir')
284
self.runbzr('commit -m blah --unchanged')
287
b = Branch.open('../b')
288
assert a.revision_history() == b.revision_history()[:-1]
289
self.runbzr('pull ../b')
290
assert a.revision_history() == b.revision_history()
291
self.runbzr('commit -m blah2 --unchanged')
293
self.runbzr('commit -m blah3 --unchanged')
294
self.runbzr('pull ../a', retcode=1)
295
print "DECIDE IF PULL CAN CONVERGE, blackbox.py"
298
self.runbzr('merge ../b')
299
self.runbzr('commit -m blah4 --unchanged')
300
os.chdir('../b/subdir')
301
self.runbzr('pull ../../a')
302
assert a.revision_history()[-1] == b.revision_history()[-1]
303
self.runbzr('commit -m blah5 --unchanged')
304
self.runbzr('commit -m blah6 --unchanged')
306
self.runbzr('pull ../a')
308
self.runbzr('commit -m blah7 --unchanged')
309
self.runbzr('merge ../b')
310
self.runbzr('commit -m blah8 --unchanged')
311
self.runbzr('pull ../b')
312
self.runbzr('pull ../b')
314
def test_add_reports(self):
315
"""add command prints the names of added files."""
316
b = Branch.initialize('.')
317
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
318
out = self.run_bzr_captured(['add'], retcode = 0)[0]
319
# the ordering is not defined at the moment
320
results = sorted(out.rstrip('\n').split('\n'))
321
self.assertEquals(['added dir',
322
'added dir'+os.sep+'sub.txt',
210
326
def test_unknown_command(self):
211
327
"""Handling of unknown command."""
212
328
out, err = self.run_bzr_captured(['fluffy-badger'],
214
330
self.assertEquals(out, '')
215
331
err.index('unknown command')
217
def create_conflicts(self):
218
"""Create a conflicted tree"""
221
file('hello', 'wb').write("hi world")
222
file('answer', 'wb').write("42")
225
self.runbzr('commit -m base')
226
self.runbzr('branch . ../other')
227
self.runbzr('branch . ../this')
229
file('hello', 'wb').write("Hello.")
230
file('answer', 'wb').write("Is anyone there?")
231
self.runbzr('commit -m other')
233
file('hello', 'wb').write("Hello, world")
234
self.runbzr('mv answer question')
235
file('question', 'wb').write("What do you get when you multiply six"
237
self.runbzr('commit -m this')
239
def test_status(self):
243
self.runbzr('commit --unchanged --message f')
244
self.runbzr('branch . ../branch2')
245
self.runbzr('branch . ../branch3')
246
self.runbzr('commit --unchanged --message peter')
247
os.chdir('../branch2')
248
self.runbzr('merge ../branch1')
249
self.runbzr('commit --unchanged --message pumpkin')
250
os.chdir('../branch3')
251
self.runbzr('merge ../branch2')
252
message = self.capture('status')
255
def test_conflicts(self):
256
"""Handling of merge conflicts"""
257
self.create_conflicts()
258
self.runbzr('merge ../other --show-base', retcode=1)
259
conflict_text = file('hello').read()
260
self.assert_('<<<<<<<' in conflict_text)
261
self.assert_('>>>>>>>' in conflict_text)
262
self.assert_('=======' in conflict_text)
263
self.assert_('|||||||' in conflict_text)
264
self.assert_('hi world' in conflict_text)
265
self.runbzr('revert')
266
self.runbzr('resolve --all')
267
self.runbzr('merge ../other', retcode=1)
268
conflict_text = file('hello').read()
269
self.assert_('|||||||' not in conflict_text)
270
self.assert_('hi world' not in conflict_text)
271
result = self.runbzr('conflicts', backtick=1)
272
self.assertEquals(result, "Text conflict in hello\nText conflict in"
274
result = self.runbzr('status', backtick=1)
275
self.assert_("conflicts:\n Text conflict in hello\n"
276
" Text conflict in question\n" in result, result)
277
self.runbzr('resolve hello')
278
result = self.runbzr('conflicts', backtick=1)
279
self.assertEquals(result, "Text conflict in question\n")
280
self.runbzr('commit -m conflicts', retcode=3)
281
self.runbzr('resolve --all')
282
result = self.runbzr('conflicts', backtick=1)
283
self.runbzr('commit -m conflicts')
284
self.assertEquals(result, "")
287
# create a source branch
288
os.mkdir('my-branch')
289
os.chdir('my-branch')
290
self.example_branch()
292
# with no push target, fail
293
self.runbzr('push', retcode=3)
294
# with an explicit target work
295
self.runbzr('push ../output-branch')
296
# with an implicit target work
299
self.runbzr('missing ../output-branch')
300
# advance this branch
301
self.runbzr('commit --unchanged -m unchanged')
303
os.chdir('../output-branch')
304
# There is no longer a difference as long as we have
305
# access to the working tree
308
# But we should be missing a revision
309
self.runbzr('missing ../my-branch', retcode=1)
311
# diverge the branches
312
self.runbzr('commit --unchanged -m unchanged')
313
os.chdir('../my-branch')
315
self.runbzr('push', retcode=3)
316
# and there are difference
317
self.runbzr('missing ../output-branch', retcode=1)
318
self.runbzr('missing --verbose ../output-branch', retcode=1)
319
# but we can force a push
320
self.runbzr('push --overwrite')
322
self.runbzr('missing ../output-branch')
324
# pushing to a new dir with no parent should fail
325
self.runbzr('push ../missing/new-branch', retcode=3)
326
# unless we provide --create-prefix
327
self.runbzr('push --create-prefix ../missing/new-branch')
329
self.runbzr('missing ../missing/new-branch')
331
def test_external_command(self):
332
"""Test that external commands can be run by setting the path
334
# We don't at present run bzr in a subprocess for blackbox tests, and so
335
# don't really capture stdout, only the internal python stream.
336
# Therefore we don't use a subcommand that produces any output or does
337
# anything -- we just check that it can be run successfully.
338
cmd_name = 'test-command'
339
if sys.platform == 'win32':
341
oldpath = os.environ.get('BZRPATH', None)
344
if 'BZRPATH' in os.environ:
345
del os.environ['BZRPATH']
347
f = file(cmd_name, 'wb')
348
if sys.platform == 'win32':
349
f.write('@echo off\n')
351
f.write('#!/bin/sh\n')
352
# f.write('echo Hello from test-command')
354
os.chmod(cmd_name, 0755)
356
# It should not find the command in the local
357
# directory by default, since it is not in my path
358
bzr(cmd_name, retcode=3)
360
# Now put it into my path
361
os.environ['BZRPATH'] = '.'
365
# Make sure empty path elements are ignored
366
os.environ['BZRPATH'] = os.pathsep
368
bzr(cmd_name, retcode=3)
372
os.environ['BZRPATH'] = oldpath
375
def listdir_sorted(dir):
381
335
class OldTests(ExternalBase):
406
360
self.assertEquals(capture('unknowns'), 'test.txt\n')
408
362
out = capture("status")
409
self.assertEquals(out, 'unknown:\n test.txt\n')
363
assert out == 'unknown:\n test.txt\n'
365
out = capture("status --all")
366
assert out == "unknown:\n test.txt\n"
368
out = capture("status test.txt --all")
369
assert out == "unknown:\n test.txt\n"
411
371
f = file('test2.txt', 'wt')
412
372
f.write('goodbye cruel world...\n')
415
375
out = capture("status test.txt")
416
self.assertEquals(out, "unknown:\n test.txt\n")
376
assert out == "unknown:\n test.txt\n"
418
378
out = capture("status")
419
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
379
assert out == ("unknown:\n"
421
383
os.unlink('test2.txt')
423
385
progress("command aliases")
425
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
386
out = capture("st --all")
387
assert out == ("unknown:\n"
427
390
out = capture("stat")
428
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
391
assert out == ("unknown:\n"
430
394
progress("command help")
431
395
runbzr("help st")
433
397
runbzr("help commands")
434
runbzr("help slartibartfast", 3)
398
runbzr("help slartibartfast", 1)
436
400
out = capture("help ci")
437
401
out.index('aliases: ')
403
progress("can't rename unversioned file")
404
runbzr("rename test.txt new-test.txt", 1)
406
progress("adding a file")
408
runbzr("add test.txt")
409
assert capture("unknowns") == ''
410
assert capture("status --all") == ("added:\n"
413
progress("rename newly-added file")
414
runbzr("rename test.txt hello.txt")
415
assert os.path.exists("hello.txt")
416
assert not os.path.exists("test.txt")
418
assert capture("revno") == '0\n'
420
progress("add first revision")
421
runbzr(['commit', '-m', 'add first revision'])
423
progress("more complex renames")
425
runbzr("rename hello.txt sub1", 1)
426
runbzr("rename hello.txt sub1/hello.txt", 1)
427
runbzr("move hello.txt sub1", 1)
430
runbzr("rename sub1 sub2")
431
runbzr("move hello.txt sub2")
432
assert capture("relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
434
assert exists("sub2")
435
assert exists("sub2/hello.txt")
436
assert not exists("sub1")
437
assert not exists("hello.txt")
439
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
443
runbzr('move sub2/hello.txt sub1')
444
assert not exists('sub2/hello.txt')
445
assert exists('sub1/hello.txt')
446
runbzr('move sub2 sub1')
447
assert not exists('sub2')
448
assert exists('sub1/sub2')
450
runbzr(['commit', '-m', 'rename nested subdirectories'])
453
self.assertEquals(capture('root')[:-1],
454
os.path.join(self.test_dir, 'branch1'))
455
runbzr('move ../hello.txt .')
456
assert exists('./hello.txt')
457
self.assertEquals(capture('relpath hello.txt'),
458
os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
459
assert capture('relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
460
runbzr(['commit', '-m', 'move to parent directory'])
462
assert capture('relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
464
runbzr('move sub2/hello.txt .')
465
assert exists('hello.txt')
439
467
f = file('hello.txt', 'wt')
440
468
f.write('some nice new content\n')
443
runbzr("add hello.txt")
445
471
f = file('msg.tmp', 'wt')
446
f.write('this is my new commit\nand it has multiple lines, for fun')
472
f.write('this is my new commit\n')
449
475
runbzr('commit -F msg.tmp')
451
self.assertEquals(capture('revno'), '1\n')
452
runbzr('export -r 1 export-1.tmp')
477
assert capture('revno') == '5\n'
478
runbzr('export -r 5 export-5.tmp')
453
479
runbzr('export export.tmp')
457
483
runbzr('log -v --forward')
458
runbzr('log -m', retcode=3)
484
runbzr('log -m', retcode=1)
459
485
log_out = capture('log -m commit')
460
self.assert_("this is my new commit\n and" in log_out)
461
self.assert_("rename nested" not in log_out)
462
self.assert_('revision-id' not in log_out)
463
self.assert_('revision-id' in capture('log --show-ids -m commit'))
486
assert "this is my new commit" in log_out
487
assert "rename nested" not in log_out
488
assert 'revision-id' not in log_out
489
assert 'revision-id' in capture('log --show-ids -m commit')
465
log_out = capture('log --line')
466
# determine the widest line we want
467
max_width = terminal_width() - 1
468
for line in log_out.splitlines():
469
self.assert_(len(line) <= max_width, len(line))
470
self.assert_("this is my new commit and" not in log_out)
471
self.assert_("this is my new commit" in log_out)
473
492
progress("file with spaces in name")
474
493
mkdir('sub directory')
475
494
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
477
runbzr('diff', retcode=1)
478
497
runbzr('commit -m add-spaces')
491
os.symlink("NOWHERE1", "link1")
493
self.assertEquals(self.capture('unknowns'), '')
494
runbzr(['commit', '-m', '1: added symlink link1'])
498
self.assertEquals(self.capture('unknowns'), '')
499
os.symlink("NOWHERE2", "d1/link2")
500
self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
501
# is d1/link2 found when adding d1
503
self.assertEquals(self.capture('unknowns'), '')
504
os.symlink("NOWHERE3", "d1/link3")
505
self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
506
runbzr(['commit', '-m', '2: added dir, symlink'])
508
runbzr('rename d1 d2')
509
runbzr('move d2/link2 .')
510
runbzr('move link1 d2')
511
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
512
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
513
runbzr('add d2/link3')
514
runbzr('diff', retcode=1)
515
runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
518
os.symlink("TARGET 2", "link2")
519
os.unlink("d2/link1")
520
os.symlink("TARGET 1", "d2/link1")
521
runbzr('diff', retcode=1)
522
self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
523
runbzr(['commit', '-m', '4: retarget of two links'])
525
runbzr('remove d2/link1')
526
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
527
runbzr(['commit', '-m', '5: remove d2/link1'])
528
# try with the rm alias
529
runbzr('add d2/link1')
530
runbzr(['commit', '-m', '6: add d2/link1'])
531
runbzr('rm d2/link1')
532
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
533
runbzr(['commit', '-m', '7: remove d2/link1'])
537
runbzr('rename d2/link3 d1/link3new')
538
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
539
runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
543
runbzr(['export', '-r', '1', 'exp1.tmp'])
545
self.assertEquals(listdir_sorted("."), [ "link1" ])
546
self.assertEquals(os.readlink("link1"), "NOWHERE1")
549
runbzr(['export', '-r', '2', 'exp2.tmp'])
551
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
554
runbzr(['export', '-r', '3', 'exp3.tmp'])
556
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
557
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
558
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
559
self.assertEquals(os.readlink("link2") , "NOWHERE2")
562
runbzr(['export', '-r', '4', 'exp4.tmp'])
564
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
565
self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
566
self.assertEquals(os.readlink("link2") , "TARGET 2")
567
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
570
runbzr(['export', '-r', '5', 'exp5.tmp'])
572
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
573
self.assert_(os.path.islink("link2"))
574
self.assert_(listdir_sorted("d2")== [ "link3" ])
577
runbzr(['export', '-r', '8', 'exp6.tmp'])
579
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
580
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
581
self.assertEquals(listdir_sorted("d2"), [])
582
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
585
progress("skipping symlink tests")
588
class RemoteTests(object):
589
"""Test bzr ui commands against remote branches."""
591
def test_branch(self):
593
wt = self.make_branch_and_tree('from')
595
wt.commit('empty commit for nonsense', allow_pointless=True)
596
url = self.get_readonly_url('from')
597
self.run_bzr('branch', url, 'to')
598
branch = Branch.open('to')
599
self.assertEqual(1, len(branch.revision_history()))
600
# the branch should be set in to to from
601
self.assertEqual(url + '/', branch.get_parent())
604
self.build_tree(['branch/', 'branch/file'])
605
self.capture('init branch')
606
self.capture('add branch/file')
607
self.capture('commit -m foo branch')
608
url = self.get_readonly_url('branch/file')
609
output = self.capture('log %s' % url)
610
self.assertEqual(8, len(output.split('\n')))
612
def test_check(self):
613
self.build_tree(['branch/', 'branch/file'])
614
self.capture('init branch')
615
self.capture('add branch/file')
616
self.capture('commit -m foo branch')
617
url = self.get_readonly_url('branch/')
618
self.run_bzr('check', url)
621
# create a source branch
622
os.mkdir('my-branch')
623
os.chdir('my-branch')
625
file('hello', 'wt').write('foo')
626
self.run_bzr('add', 'hello')
627
self.run_bzr('commit', '-m', 'setup')
629
# with an explicit target work
630
self.run_bzr('push', self.get_url('output-branch'))
633
class HTTPTests(TestCaseWithWebserver, RemoteTests):
634
"""Test various commands against a HTTP server."""
637
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
638
"""Test various commands against a SFTP server using abs paths."""
641
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
642
"""Test various commands against a SFTP server using abs paths."""
645
super(SFTPTestsAbsoluteSibling, self).setUp()
646
self._override_home = '/dev/noone/runs/tests/here'
649
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
650
"""Test various commands against a SFTP server using homedir rel paths."""
653
super(SFTPTestsRelative, self).setUp()
654
self._get_remote_is_absolute = False