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
from cStringIO import StringIO
31
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
46
32
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
33
from bzrlib.commands import run_bzr
36
class ExternalBase(TestCaseInTempDir):
37
def runbzr(self, args, retcode=0,backtick=False):
38
if isinstance(args, basestring):
42
return self.backtick(['python', self.BZRPATH,] + args,
45
return self.runcmd(['python', self.BZRPATH,] + args,
59
49
class TestCommands(ExternalBase):
51
def test_help_commands(self):
54
self.runbzr('help commands')
55
self.runbzr('help help')
56
self.runbzr('commit -h')
58
def test_init_branch(self):
61
def test_whoami(self):
62
# this should always identify something, if only "john@localhost"
64
self.runbzr("whoami --email")
66
self.assertEquals(self.runbzr("whoami --email",
67
backtick=True).count('@'), 1)
69
def test_whoami_branch(self):
70
"""branch specific user identity works."""
72
f = file('.bzr/email', 'wt')
73
f.write('Branch Identity <branch@identi.ty>')
75
whoami = self.runbzr("whoami",backtick=True)
76
whoami_email = self.runbzr("whoami --email",backtick=True)
77
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
78
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
61
80
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)
81
self.runbzr("pants", retcode=1)
82
self.runbzr("--pants off", retcode=1)
83
self.runbzr("diff --message foo", retcode=1)
85
def test_empty_commit(self):
87
self.build_tree(['hello.txt'])
88
self.runbzr("commit -m empty", retcode=1)
89
self.runbzr("add hello.txt")
90
self.runbzr("commit -m added")
92
def test_ignore_patterns(self):
93
from bzrlib.branch import Branch
95
b = Branch('.', init=True)
96
self.assertEquals(list(b.unknowns()), [])
98
file('foo.tmp', 'wt').write('tmp files are ignored')
99
self.assertEquals(list(b.unknowns()), [])
100
assert self.backtick('bzr unknowns') == ''
102
file('foo.c', 'wt').write('int main() {}')
103
self.assertEquals(list(b.unknowns()), ['foo.c'])
104
assert self.backtick('bzr unknowns') == 'foo.c\n'
106
self.runbzr(['add', 'foo.c'])
107
assert self.backtick('bzr unknowns') == ''
109
# 'ignore' works when creating the .bzignore file
110
file('foo.blah', 'wt').write('blah')
111
self.assertEquals(list(b.unknowns()), ['foo.blah'])
112
self.runbzr('ignore *.blah')
113
self.assertEquals(list(b.unknowns()), [])
114
assert file('.bzrignore', 'rb').read() == '*.blah\n'
116
# 'ignore' works when then .bzrignore file already exists
117
file('garh', 'wt').write('garh')
118
self.assertEquals(list(b.unknowns()), ['garh'])
119
assert self.backtick('bzr unknowns') == 'garh\n'
120
self.runbzr('ignore garh')
121
self.assertEquals(list(b.unknowns()), [])
122
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
66
124
def test_revert(self):
67
126
self.runbzr('init')
69
128
file('hello', 'wt').write('foo')
137
182
test.runbzr('add goodbye')
138
183
test.runbzr('commit -m setup goodbye')
140
def test_pull_verbose(self):
141
"""Pull changes from one branch to another and watch the output."""
185
def test_revert(self):
186
self.example_branch()
187
file('hello', 'wt').write('bar')
188
file('goodbye', 'wt').write('qux')
189
self.runbzr('revert hello')
190
self.check_file_contents('hello', 'foo')
191
self.check_file_contents('goodbye', 'qux')
192
self.runbzr('revert')
193
self.check_file_contents('goodbye', 'baz')
195
def test_merge(self):
196
from bzrlib.branch import Branch
147
202
self.example_branch()
204
self.runbzr('branch a b')
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')
210
def test_unknown_command(self):
211
"""Handling of unknown command."""
212
out, err = self.run_bzr_captured(['fluffy-badger'],
214
self.assertEquals(out, '')
215
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):
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_revision())
221
self.log('pending merges: %s', a.pending_merges())
222
# assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
223
# % (a.pending_merges(), b.last_revision())
226
def test_add_reports(self):
227
"""add command prints the names of added files."""
228
b = Branch('.', init=True)
229
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
231
from cStringIO import StringIO
234
ret = self.apply_redirected(None, out, None,
237
self.assertEquals(ret, 0)
239
# the ordering is not defined at the moment
240
results = sorted(out.getvalue().rstrip('\n').split('\n'))
241
self.assertEquals(['added dir',
381
247
class OldTests(ExternalBase):
403
270
f.write('hello world!\n')
406
self.assertEquals(capture('unknowns'), 'test.txt\n')
408
out = capture("status")
409
self.assertEquals(out, 'unknown:\n test.txt\n')
273
out = backtick("bzr unknowns")
274
self.assertEquals(out, 'test.txt\n')
276
out = backtick("bzr status")
277
assert out == 'unknown:\n test.txt\n'
279
out = backtick("bzr status --all")
280
assert out == "unknown:\n test.txt\n"
282
out = backtick("bzr status test.txt --all")
283
assert out == "unknown:\n test.txt\n"
411
285
f = file('test2.txt', 'wt')
412
286
f.write('goodbye cruel world...\n')
415
out = capture("status test.txt")
416
self.assertEquals(out, "unknown:\n test.txt\n")
289
out = backtick("bzr status test.txt")
290
assert out == "unknown:\n test.txt\n"
418
out = capture("status")
419
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
292
out = backtick("bzr status")
293
assert out == ("unknown:\n"
421
297
os.unlink('test2.txt')
423
299
progress("command aliases")
425
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
300
out = backtick("bzr st --all")
301
assert out == ("unknown:\n"
427
out = capture("stat")
428
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
304
out = backtick("bzr stat")
305
assert out == ("unknown:\n"
430
308
progress("command help")
431
309
runbzr("help st")
433
311
runbzr("help commands")
434
runbzr("help slartibartfast", 3)
436
out = capture("help ci")
437
out.index('aliases: ci, checkin\n')
312
runbzr("help slartibartfast", 1)
314
out = backtick("bzr help ci")
315
out.index('aliases: ')
317
progress("can't rename unversioned file")
318
runbzr("rename test.txt new-test.txt", 1)
320
progress("adding a file")
322
runbzr("add test.txt")
323
assert backtick("bzr unknowns") == ''
324
assert backtick("bzr status --all") == ("added:\n"
327
progress("rename newly-added file")
328
runbzr("rename test.txt hello.txt")
329
assert os.path.exists("hello.txt")
330
assert not os.path.exists("test.txt")
332
assert backtick("bzr revno") == '0\n'
334
progress("add first revision")
335
runbzr(['commit', '-m', 'add first revision'])
337
progress("more complex renames")
339
runbzr("rename hello.txt sub1", 1)
340
runbzr("rename hello.txt sub1/hello.txt", 1)
341
runbzr("move hello.txt sub1", 1)
344
runbzr("rename sub1 sub2")
345
runbzr("move hello.txt sub2")
346
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
348
assert exists("sub2")
349
assert exists("sub2/hello.txt")
350
assert not exists("sub1")
351
assert not exists("hello.txt")
353
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
357
runbzr('move sub2/hello.txt sub1')
358
assert not exists('sub2/hello.txt')
359
assert exists('sub1/hello.txt')
360
runbzr('move sub2 sub1')
361
assert not exists('sub2')
362
assert exists('sub1/sub2')
364
runbzr(['commit', '-m', 'rename nested subdirectories'])
367
self.assertEquals(backtick('bzr root')[:-1],
368
os.path.join(self.test_dir, 'branch1'))
369
runbzr('move ../hello.txt .')
370
assert exists('./hello.txt')
371
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
372
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
373
runbzr(['commit', '-m', 'move to parent directory'])
375
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
377
runbzr('move sub2/hello.txt .')
378
assert exists('hello.txt')
439
380
f = file('hello.txt', 'wt')
440
381
f.write('some nice new content\n')
443
runbzr("add hello.txt")
445
384
f = file('msg.tmp', 'wt')
446
f.write('this is my new commit\nand it has multiple lines, for fun')
385
f.write('this is my new commit\n')
449
388
runbzr('commit -F msg.tmp')
451
self.assertEquals(capture('revno'), '1\n')
452
runbzr('export -r 1 export-1.tmp')
390
assert backtick('bzr revno') == '5\n'
391
runbzr('export -r 5 export-5.tmp')
453
392
runbzr('export export.tmp')
457
396
runbzr('log -v --forward')
458
runbzr('log -m', retcode=3)
459
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'))
397
runbzr('log -m', retcode=1)
398
log_out = backtick('bzr log -m commit')
399
assert "this is my new commit" in log_out
400
assert "rename nested" not in log_out
401
assert 'revision-id' not in log_out
402
assert 'revision-id' in backtick('bzr 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
405
progress("file with spaces in name")
474
406
mkdir('sub directory')
475
407
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
477
runbzr('diff', retcode=1)
478
410
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 --keep 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 --keep 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