1
# Copyright (C) 2005, 2007 Canonical Ltd
1
# Copyright (C) 2005 by Canonical Ltd
2
# -*- coding: utf-8 -*-
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
5
6
# the Free Software Foundation; either version 2 of the License, or
6
7
# (at your option) any later version.
8
9
# This program is distributed in the hope that it will be useful,
9
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
12
# GNU General Public License for more details.
13
14
# You should have received a copy of the GNU General Public License
14
15
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
# Mr. Smoketoomuch: I'm sorry?
18
# Mr. Bounder: You'd better cut down a little then.
19
# Mr. Smoketoomuch: Oh, I see! Smoke too much so I'd better cut down a little
22
19
"""Black-box tests for bzr.
24
21
These check that it behaves properly when it's invoked through the regular
25
command-line interface. This doesn't actually run a new interpreter but
26
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.
30
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
31
# Note: Please don't add new tests here, it's too big and bulky. Instead add
32
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
33
# UI command/aspect that is being tested.
36
from cStringIO import StringIO
32
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
45
33
from bzrlib.branch import Branch
46
from bzrlib.errors import BzrCommandError
47
from bzrlib.osutils import (
52
from bzrlib.tests.http_utils 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):
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
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'))
60
81
def test_invalid_commands(self):
61
self.run_bzr("pants", retcode=3)
62
self.run_bzr("--pants off", retcode=3)
63
self.run_bzr("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'
65
125
def test_revert(self):
68
128
file('hello', 'wt').write('foo')
69
self.run_bzr('add hello')
70
self.run_bzr('commit -m setup hello')
129
self.runbzr('add hello')
130
self.runbzr('commit -m setup hello')
72
132
file('goodbye', 'wt').write('baz')
73
self.run_bzr('add goodbye')
74
self.run_bzr('commit -m setup goodbye')
133
self.runbzr('add goodbye')
134
self.runbzr('commit -m setup goodbye')
76
136
file('hello', 'wt').write('bar')
77
137
file('goodbye', 'wt').write('qux')
78
self.run_bzr('revert hello')
138
self.runbzr('revert hello')
79
139
self.check_file_contents('hello', 'foo')
80
140
self.check_file_contents('goodbye', 'qux')
81
self.run_bzr('revert')
141
self.runbzr('revert')
82
142
self.check_file_contents('goodbye', 'baz')
84
144
os.mkdir('revertdir')
85
self.run_bzr('add revertdir')
86
self.run_bzr('commit -m f')
145
self.runbzr('add revertdir')
146
self.runbzr('commit -m f')
87
147
os.rmdir('revertdir')
88
self.run_bzr('revert')
91
os.symlink('/unlikely/to/exist', 'symlink')
92
self.run_bzr('add symlink')
93
self.run_bzr('commit -m f')
95
self.run_bzr('revert')
96
self.failUnlessExists('symlink')
98
os.symlink('a-different-path', 'symlink')
99
self.run_bzr('revert')
100
self.assertEqual('/unlikely/to/exist',
101
os.readlink('symlink'))
103
self.log("skipping revert symlink tests")
105
file('hello', 'wt').write('xyz')
106
self.run_bzr('commit -m xyz hello')
107
self.run_bzr('revert -r 1 hello')
108
self.check_file_contents('hello', 'foo')
109
self.run_bzr('revert hello')
110
self.check_file_contents('hello', 'xyz')
111
os.chdir('revertdir')
112
self.run_bzr('revert')
148
self.runbzr('revert')
150
def test_mv_modes(self):
151
"""Test two modes of operation for mv"""
152
from bzrlib.branch import Branch
153
b = Branch('.', init=True)
154
self.build_tree(['a', 'c', 'subdir/'])
155
self.run_bzr('add', self.test_dir)
156
self.run_bzr('mv', 'a', 'b')
157
self.run_bzr('mv', 'b', 'subdir')
158
self.run_bzr('mv', 'subdir/b', 'a')
159
self.run_bzr('mv', 'a', 'c', 'subdir')
160
self.run_bzr('mv', 'subdir/a', 'subdir/newa')
115
163
def test_main_version(self):
116
164
"""Check output from version command and master option is reasonable"""
117
165
# output is intentionally passed through to stdout so that we
118
166
# can see the version being tested
119
output = self.run_bzr('version')[0]
167
output = self.runbzr('version', backtick=1)
120
168
self.log('bzr version output:')
122
self.assert_(output.startswith('Bazaar (bzr) '))
170
self.assert_(output.startswith('bzr (bazaar-ng) '))
123
171
self.assertNotEqual(output.index('Canonical'), -1)
124
172
# make sure --version is consistent
125
tmp_output = self.run_bzr('--version')[0]
173
tmp_output = self.runbzr('--version', backtick=1)
174
self.log('bzr --version output:')
126
176
self.assertEquals(output, tmp_output)
128
178
def example_branch(test):
130
180
file('hello', 'wt').write('foo')
131
test.run_bzr('add hello')
132
test.run_bzr('commit -m setup hello')
181
test.runbzr('add hello')
182
test.runbzr('commit -m setup hello')
133
183
file('goodbye', 'wt').write('baz')
134
test.run_bzr('add goodbye')
135
test.run_bzr('commit -m setup goodbye')
137
def test_pull_verbose(self):
138
"""Pull changes from one branch to another and watch the output."""
143
self.example_branch()
146
self.run_bzr('branch a b')
148
open('b', 'wb').write('else\n')
149
self.run_bzr('add b')
150
self.run_bzr(['commit', '-m', 'added b'])
153
out = self.run_bzr('pull --verbose ../b')[0]
154
self.failIfEqual(out.find('Added Revisions:'), -1)
155
self.failIfEqual(out.find('message:\n added b'), -1)
156
self.failIfEqual(out.find('added b'), -1)
158
# Check that --overwrite --verbose prints out the removed entries
159
self.run_bzr('commit -m foo --unchanged')
161
self.run_bzr('commit -m baz --unchanged')
162
self.run_bzr('pull ../a', retcode=3)
163
out = self.run_bzr('pull --overwrite --verbose ../a')[0]
165
remove_loc = out.find('Removed Revisions:')
166
self.failIfEqual(remove_loc, -1)
167
added_loc = out.find('Added Revisions:')
168
self.failIfEqual(added_loc, -1)
170
removed_message = out.find('message:\n baz')
171
self.failIfEqual(removed_message, -1)
172
self.failUnless(remove_loc < removed_message < added_loc)
174
added_message = out.find('message:\n foo')
175
self.failIfEqual(added_message, -1)
176
self.failUnless(added_loc < added_message)
178
def test_locations(self):
179
"""Using and remembering different locations"""
183
self.run_bzr('commit -m unchanged --unchanged')
184
self.run_bzr('pull', retcode=3)
185
self.run_bzr('merge', retcode=3)
186
self.run_bzr('branch . ../b')
189
self.run_bzr('branch . ../c')
190
self.run_bzr('pull ../c')
191
self.run_bzr('merge')
193
self.run_bzr('pull ../b')
195
self.run_bzr('pull ../c')
196
self.run_bzr('branch ../c ../d')
197
osutils.rmtree('../c')
202
self.run_bzr('pull', retcode=3)
203
self.run_bzr('pull ../a --remember')
206
def test_unknown_command(self):
207
"""Handling of unknown command."""
208
out, err = self.run_bzr('fluffy-badger', retcode=3)
209
self.assertEquals(out, '')
210
err.index('unknown command')
212
def create_conflicts(self):
213
"""Create a conflicted tree"""
216
file('hello', 'wb').write("hi world")
217
file('answer', 'wb').write("42")
220
self.run_bzr('commit -m base')
221
self.run_bzr('branch . ../other')
222
self.run_bzr('branch . ../this')
224
file('hello', 'wb').write("Hello.")
225
file('answer', 'wb').write("Is anyone there?")
226
self.run_bzr('commit -m other')
228
file('hello', 'wb').write("Hello, world")
229
self.run_bzr('mv answer question')
230
file('question', 'wb').write("What do you get when you multiply six"
232
self.run_bzr('commit -m this')
234
def test_status(self):
238
self.run_bzr('commit --unchanged --message f')
239
self.run_bzr('branch . ../branch2')
240
self.run_bzr('branch . ../branch3')
241
self.run_bzr('commit --unchanged --message peter')
242
os.chdir('../branch2')
243
self.run_bzr('merge ../branch1')
244
self.run_bzr('commit --unchanged --message pumpkin')
245
os.chdir('../branch3')
246
self.run_bzr('merge ../branch2')
247
message = self.run_bzr('status')[0]
250
def test_conflicts(self):
251
"""Handling of merge conflicts"""
252
self.create_conflicts()
253
self.run_bzr('merge ../other --show-base', retcode=1)
254
conflict_text = file('hello').read()
255
self.assert_('<<<<<<<' in conflict_text)
256
self.assert_('>>>>>>>' in conflict_text)
257
self.assert_('=======' in conflict_text)
258
self.assert_('|||||||' in conflict_text)
259
self.assert_('hi world' in conflict_text)
260
self.run_bzr('revert')
261
self.run_bzr('resolve --all')
262
self.run_bzr('merge ../other', retcode=1)
263
conflict_text = file('hello').read()
264
self.assert_('|||||||' not in conflict_text)
265
self.assert_('hi world' not in conflict_text)
266
result = self.run_bzr('conflicts')[0]
267
self.assertEquals(result, "Text conflict in hello\nText conflict in"
269
result = self.run_bzr('status')[0]
270
self.assert_("conflicts:\n Text conflict in hello\n"
271
" Text conflict in question\n" in result, result)
272
self.run_bzr('resolve hello')
273
result = self.run_bzr('conflicts')[0]
274
self.assertEquals(result, "Text conflict in question\n")
275
self.run_bzr('commit -m conflicts', retcode=3)
276
self.run_bzr('resolve --all')
277
result = self.run_bzr('conflicts')[0]
278
self.run_bzr('commit -m conflicts')
279
self.assertEquals(result, "")
282
# create a source branch
283
os.mkdir('my-branch')
284
os.chdir('my-branch')
285
self.example_branch()
287
# with no push target, fail
288
self.run_bzr('push', retcode=3)
289
# with an explicit target work
290
self.run_bzr('push ../output-branch')
291
# with an implicit target work
294
self.run_bzr('missing ../output-branch')
295
# advance this branch
296
self.run_bzr('commit --unchanged -m unchanged')
298
os.chdir('../output-branch')
299
# There is no longer a difference as long as we have
300
# access to the working tree
303
# But we should be missing a revision
304
self.run_bzr('missing ../my-branch', retcode=1)
306
# diverge the branches
307
self.run_bzr('commit --unchanged -m unchanged')
308
os.chdir('../my-branch')
310
self.run_bzr('push', retcode=3)
311
# and there are difference
312
self.run_bzr('missing ../output-branch', retcode=1)
313
self.run_bzr('missing --verbose ../output-branch', retcode=1)
314
# but we can force a push
315
self.run_bzr('push --overwrite')
317
self.run_bzr('missing ../output-branch')
319
# pushing to a new dir with no parent should fail
320
self.run_bzr('push ../missing/new-branch', retcode=3)
321
# unless we provide --create-prefix
322
self.run_bzr('push --create-prefix ../missing/new-branch')
324
self.run_bzr('missing ../missing/new-branch')
326
def test_external_command(self):
327
"""Test that external commands can be run by setting the path
329
# We don't at present run bzr in a subprocess for blackbox tests, and so
330
# don't really capture stdout, only the internal python stream.
331
# Therefore we don't use a subcommand that produces any output or does
332
# anything -- we just check that it can be run successfully.
333
cmd_name = 'test-command'
334
if sys.platform == 'win32':
336
oldpath = os.environ.get('BZRPATH', None)
338
if 'BZRPATH' in os.environ:
339
del os.environ['BZRPATH']
341
f = file(cmd_name, 'wb')
342
if sys.platform == 'win32':
343
f.write('@echo off\n')
345
f.write('#!/bin/sh\n')
346
# f.write('echo Hello from test-command')
348
os.chmod(cmd_name, 0755)
350
# It should not find the command in the local
351
# directory by default, since it is not in my path
352
self.run_bzr(cmd_name, retcode=3)
354
# Now put it into my path
355
os.environ['BZRPATH'] = '.'
357
self.run_bzr(cmd_name)
359
# Make sure empty path elements are ignored
360
os.environ['BZRPATH'] = os.pathsep
362
self.run_bzr(cmd_name, retcode=3)
366
os.environ['BZRPATH'] = oldpath
369
def listdir_sorted(dir):
184
test.runbzr('add goodbye')
185
test.runbzr('commit -m setup goodbye')
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]
247
self.runbzr('pull ../b')
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',
375
282
class OldTests(ExternalBase):
395
304
f.write('hello world!\n')
398
self.assertEquals(self.run_bzr('unknowns')[0], 'test.txt\n')
400
out = self.run_bzr("status")[0]
401
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"
403
319
f = file('test2.txt', 'wt')
404
320
f.write('goodbye cruel world...\n')
407
out = self.run_bzr("status test.txt")[0]
408
self.assertEquals(out, "unknown:\n test.txt\n")
323
out = backtick("bzr status test.txt")
324
assert out == "unknown:\n test.txt\n"
410
out = self.run_bzr("status")[0]
411
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
326
out = backtick("bzr status")
327
assert out == ("unknown:\n"
413
331
os.unlink('test2.txt')
415
333
progress("command aliases")
416
out = self.run_bzr("st")[0]
417
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
334
out = backtick("bzr st --all")
335
assert out == ("unknown:\n"
419
out = self.run_bzr("stat")[0]
420
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
338
out = backtick("bzr stat")
339
assert out == ("unknown:\n"
422
342
progress("command help")
423
self.run_bzr("help st")
425
self.run_bzr("help commands")
426
self.run_bzr("help slartibartfast", retcode=3)
428
out = self.run_bzr("help ci")[0]
429
out.index('Aliases: ci, checkin\n')
345
runbzr("help commands")
346
runbzr("help slartibartfast", 1)
348
out = backtick("bzr help ci")
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')
431
414
f = file('hello.txt', 'wt')
432
415
f.write('some nice new content\n')
435
self.run_bzr("add hello.txt")
437
418
f = file('msg.tmp', 'wt')
438
f.write('this is my new commit\nand it has multiple lines, for fun')
419
f.write('this is my new commit\n')
441
self.run_bzr('commit -F msg.tmp')
443
self.assertEquals(self.run_bzr('revno')[0], '1\n')
444
self.run_bzr('export -r 1 export-1.tmp')
445
self.run_bzr('export export.tmp')
448
self.run_bzr('log -v')
449
self.run_bzr('log -v --forward')
450
self.run_bzr('log -m', retcode=3)
451
log_out = self.run_bzr('log -m commit')[0]
452
self.assert_("this is my new commit\n and" in log_out)
453
self.assert_("rename nested" not in log_out)
454
self.assert_('revision-id' not in log_out)
455
self.assert_('revision-id' in self.run_bzr('log --show-ids -m commit')[0])
457
log_out = self.run_bzr('log --line')[0]
458
# determine the widest line we want
459
max_width = terminal_width() - 1
460
for line in log_out.splitlines():
461
self.assert_(len(line) <= max_width, len(line))
462
self.assert_("this is my new commit and" not in log_out)
463
self.assert_("this is my new commit" in log_out)
422
runbzr('commit -F msg.tmp')
424
assert backtick('bzr revno') == '5\n'
425
runbzr('export -r 5 export-5.tmp')
426
runbzr('export export.tmp')
430
runbzr('log -v --forward')
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')
465
439
progress("file with spaces in name")
466
440
mkdir('sub directory')
467
441
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
468
self.run_bzr('add .')
469
self.run_bzr('diff', retcode=1)
470
self.run_bzr('commit -m add-spaces')
471
self.run_bzr('check')
474
self.run_bzr('log --forward')
483
os.symlink("NOWHERE1", "link1")
484
self.run_bzr('add link1')
485
self.assertEquals(self.run_bzr('unknowns')[0], '')
486
self.run_bzr(['commit', '-m', '1: added symlink link1'])
489
self.run_bzr('add d1')
490
self.assertEquals(self.run_bzr('unknowns')[0], '')
491
os.symlink("NOWHERE2", "d1/link2")
492
self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link2\n')
493
# is d1/link2 found when adding d1
494
self.run_bzr('add d1')
495
self.assertEquals(self.run_bzr('unknowns')[0], '')
496
os.symlink("NOWHERE3", "d1/link3")
497
self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link3\n')
498
self.run_bzr(['commit', '-m', '2: added dir, symlink'])
500
self.run_bzr('rename d1 d2')
501
self.run_bzr('move d2/link2 .')
502
self.run_bzr('move link1 d2')
503
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
504
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
505
self.run_bzr('add d2/link3')
506
self.run_bzr('diff', retcode=1)
507
self.run_bzr(['commit', '-m',
508
'3: rename of dir, move symlinks, add link3'])
511
os.symlink("TARGET 2", "link2")
512
os.unlink("d2/link1")
513
os.symlink("TARGET 1", "d2/link1")
514
self.run_bzr('diff', retcode=1)
515
self.assertEquals(self.run_bzr("relpath d2/link1")[0], "d2/link1\n")
516
self.run_bzr(['commit', '-m', '4: retarget of two links'])
518
self.run_bzr('remove --keep d2/link1')
519
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
520
self.run_bzr(['commit', '-m', '5: remove d2/link1'])
521
# try with the rm alias
522
self.run_bzr('add d2/link1')
523
self.run_bzr(['commit', '-m', '6: add d2/link1'])
524
self.run_bzr('rm --keep d2/link1')
525
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
526
self.run_bzr(['commit', '-m', '7: remove d2/link1'])
529
self.run_bzr('add d1')
530
self.run_bzr('rename d2/link3 d1/link3new')
531
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
532
self.run_bzr(['commit', '-m',
533
'8: remove d2/link1, move/rename link3'])
535
self.run_bzr('check')
537
self.run_bzr('export -r 1 exp1.tmp')
539
self.assertEquals(listdir_sorted("."), [ "link1" ])
540
self.assertEquals(os.readlink("link1"), "NOWHERE1")
543
self.run_bzr('export -r 2 exp2.tmp')
545
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
548
self.run_bzr('export -r 3 exp3.tmp')
550
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
551
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
552
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
553
self.assertEquals(os.readlink("link2") , "NOWHERE2")
556
self.run_bzr('export -r 4 exp4.tmp')
558
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
559
self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
560
self.assertEquals(os.readlink("link2") , "TARGET 2")
561
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
564
self.run_bzr('export -r 5 exp5.tmp')
566
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
567
self.assert_(os.path.islink("link2"))
568
self.assert_(listdir_sorted("d2")== [ "link3" ])
571
self.run_bzr('export -r 8 exp6.tmp')
573
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
574
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
575
self.assertEquals(listdir_sorted("d2"), [])
576
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
579
progress("skipping symlink tests")
582
class RemoteTests(object):
583
"""Test bzr ui commands against remote branches."""
585
def test_branch(self):
587
wt = self.make_branch_and_tree('from')
589
wt.commit('empty commit for nonsense', allow_pointless=True)
590
url = self.get_readonly_url('from')
591
self.run_bzr(['branch', url, 'to'])
592
branch = Branch.open('to')
593
self.assertEqual(1, len(branch.revision_history()))
594
# the branch should be set in to to from
595
self.assertEqual(url + '/', branch.get_parent())
598
self.build_tree(['branch/', 'branch/file'])
599
self.run_bzr('init branch')[0]
600
self.run_bzr('add branch/file')[0]
601
self.run_bzr('commit -m foo branch')[0]
602
url = self.get_readonly_url('branch/file')
603
output = self.run_bzr('log %s' % url)[0]
604
self.assertEqual(8, len(output.split('\n')))
606
def test_check(self):
607
self.build_tree(['branch/', 'branch/file'])
608
self.run_bzr('init branch')[0]
609
self.run_bzr('add branch/file')[0]
610
self.run_bzr('commit -m foo branch')[0]
611
url = self.get_readonly_url('branch/')
612
self.run_bzr(['check', url])
615
# create a source branch
616
os.mkdir('my-branch')
617
os.chdir('my-branch')
619
file('hello', 'wt').write('foo')
620
self.run_bzr('add hello')
621
self.run_bzr('commit -m setup')
623
# with an explicit target work
624
self.run_bzr(['push', self.get_url('output-branch')])
627
class HTTPTests(TestCaseWithWebserver, RemoteTests):
628
"""Test various commands against a HTTP server."""
631
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
632
"""Test various commands against a SFTP server using abs paths."""
635
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
636
"""Test various commands against a SFTP server using abs paths."""
639
super(SFTPTestsAbsoluteSibling, self).setUp()
640
self._override_home = '/dev/noone/runs/tests/here'
643
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
644
"""Test various commands against a SFTP server using homedir rel paths."""
647
super(SFTPTestsRelative, self).setUp()
648
self._get_remote_is_absolute = False
444
runbzr('commit -m add-spaces')
448
runbzr('log --forward')