1
# Copyright (C) 2005-2011 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
29
from cStringIO import StringIO
33
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
45
34
from bzrlib.branch import Branch
46
from bzrlib.errors import BzrCommandError
47
from bzrlib.tests.http_utils import TestCaseWithWebserver
48
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
49
from bzrlib.tests import TestCaseWithTransport
50
from bzrlib.workingtree import WorkingTree
53
class TestCommands(TestCaseWithTransport):
35
from bzrlib.commands import run_bzr
38
class ExternalBase(TestCaseInTempDir):
39
def runbzr(self, args, retcode=0, backtick=False):
40
if isinstance(args, basestring):
44
return self.run_bzr_captured(args, retcode=retcode)[0]
46
return self.run_bzr_captured(args, retcode=retcode)
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
bzr_email = os.environ.get('BZREMAIL')
76
if bzr_email is not None:
77
del os.environ['BZREMAIL']
78
whoami = self.runbzr("whoami",backtick=True)
79
whoami_email = self.runbzr("whoami --email",backtick=True)
80
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
81
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
82
# Verify that the environment variable overrides the value
84
os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
85
whoami = self.runbzr("whoami",backtick=True)
86
whoami_email = self.runbzr("whoami --email",backtick=True)
87
self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
88
self.assertTrue(whoami_email.startswith('other@environ.ment'))
89
if bzr_email is not None:
90
os.environ['BZREMAIL'] = bzr_email
55
92
def test_invalid_commands(self):
56
self.run_bzr("pants", retcode=3)
57
self.run_bzr("--pants off", retcode=3)
58
self.run_bzr("diff --message foo", retcode=3)
93
self.runbzr("pants", retcode=1)
94
self.runbzr("--pants off", retcode=1)
95
self.runbzr("diff --message foo", retcode=1)
97
def test_empty_commit(self):
99
self.build_tree(['hello.txt'])
100
self.runbzr("commit -m empty", retcode=1)
101
self.runbzr("add hello.txt")
102
self.runbzr("commit -m added")
104
def test_ignore_patterns(self):
105
from bzrlib.branch import Branch
107
b = Branch.initialize('.')
108
self.assertEquals(list(b.unknowns()), [])
110
file('foo.tmp', 'wt').write('tmp files are ignored')
111
self.assertEquals(list(b.unknowns()), [])
112
assert self.capture('unknowns') == ''
114
file('foo.c', 'wt').write('int main() {}')
115
self.assertEquals(list(b.unknowns()), ['foo.c'])
116
assert self.capture('unknowns') == 'foo.c\n'
118
self.runbzr(['add', 'foo.c'])
119
assert self.capture('unknowns') == ''
121
# 'ignore' works when creating the .bzignore file
122
file('foo.blah', 'wt').write('blah')
123
self.assertEquals(list(b.unknowns()), ['foo.blah'])
124
self.runbzr('ignore *.blah')
125
self.assertEquals(list(b.unknowns()), [])
126
assert file('.bzrignore', 'rb').read() == '*.blah\n'
128
# 'ignore' works when then .bzrignore file already exists
129
file('garh', 'wt').write('garh')
130
self.assertEquals(list(b.unknowns()), ['garh'])
131
assert self.capture('unknowns') == 'garh\n'
132
self.runbzr('ignore garh')
133
self.assertEquals(list(b.unknowns()), [])
134
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
60
136
def test_revert(self):
63
with file('hello', 'wt') as f: f.write('foo')
64
self.run_bzr('add hello')
65
self.run_bzr('commit -m setup hello')
67
with file('goodbye', 'wt') as f: f.write('baz')
68
self.run_bzr('add goodbye')
69
self.run_bzr('commit -m setup goodbye')
71
with file('hello', 'wt') as f: f.write('bar')
72
with file('goodbye', 'wt') as f: f.write('qux')
73
self.run_bzr('revert hello')
139
file('hello', 'wt').write('foo')
140
self.runbzr('add hello')
141
self.runbzr('commit -m setup hello')
143
file('goodbye', 'wt').write('baz')
144
self.runbzr('add goodbye')
145
self.runbzr('commit -m setup goodbye')
147
file('hello', 'wt').write('bar')
148
file('goodbye', 'wt').write('qux')
149
self.runbzr('revert hello')
74
150
self.check_file_contents('hello', 'foo')
75
151
self.check_file_contents('goodbye', 'qux')
76
self.run_bzr('revert')
152
self.runbzr('revert')
77
153
self.check_file_contents('goodbye', 'baz')
79
155
os.mkdir('revertdir')
80
self.run_bzr('add revertdir')
81
self.run_bzr('commit -m f')
156
self.runbzr('add revertdir')
157
self.runbzr('commit -m f')
82
158
os.rmdir('revertdir')
83
self.run_bzr('revert')
85
if osutils.has_symlinks():
86
os.symlink('/unlikely/to/exist', 'symlink')
87
self.run_bzr('add symlink')
88
self.run_bzr('commit -m f')
90
self.run_bzr('revert')
91
self.assertPathExists('symlink')
93
os.symlink('a-different-path', 'symlink')
94
self.run_bzr('revert')
95
self.assertEqual('/unlikely/to/exist',
96
os.readlink('symlink'))
98
self.log("skipping revert symlink tests")
100
with file('hello', 'wt') as f: f.write('xyz')
101
self.run_bzr('commit -m xyz hello')
102
self.run_bzr('revert -r 1 hello')
159
self.runbzr('revert')
161
file('hello', 'wt').write('xyz')
162
self.runbzr('commit -m xyz hello')
163
self.runbzr('revert -r 1 hello')
103
164
self.check_file_contents('hello', 'foo')
104
self.run_bzr('revert hello')
165
self.runbzr('revert hello')
105
166
self.check_file_contents('hello', 'xyz')
106
os.chdir('revertdir')
107
self.run_bzr('revert')
168
def test_mv_modes(self):
169
"""Test two modes of operation for mv"""
170
from bzrlib.branch import Branch
171
b = Branch.initialize('.')
172
self.build_tree(['a', 'c', 'subdir/'])
173
self.run_bzr('add', self.test_dir)
174
self.run_bzr('mv', 'a', 'b')
175
self.run_bzr('mv', 'b', 'subdir')
176
self.run_bzr('mv', 'subdir/b', 'a')
177
self.run_bzr('mv', 'a', 'c', 'subdir')
178
self.run_bzr('mv', 'subdir/a', 'subdir/newa')
181
def test_main_version(self):
182
"""Check output from version command and master option is reasonable"""
183
# output is intentionally passed through to stdout so that we
184
# can see the version being tested
185
output = self.runbzr('version', backtick=1)
186
self.log('bzr version output:')
188
self.assert_(output.startswith('bzr (bazaar-ng) '))
189
self.assertNotEqual(output.index('Canonical'), -1)
190
# make sure --version is consistent
191
tmp_output = self.runbzr('--version', backtick=1)
192
self.log('bzr --version output:')
194
self.assertEquals(output, tmp_output)
110
196
def example_branch(test):
112
with file('hello', 'wt') as f: f.write('foo')
113
test.run_bzr('add hello')
114
test.run_bzr('commit -m setup hello')
115
with file('goodbye', 'wt') as f: f.write('baz')
116
test.run_bzr('add goodbye')
117
test.run_bzr('commit -m setup goodbye')
119
def test_pull_verbose(self):
120
"""Pull changes from one branch to another and watch the output."""
125
self.example_branch()
128
self.run_bzr('branch a b')
130
with open('b', 'wb') as f: f.write('else\n')
131
self.run_bzr('add b')
132
self.run_bzr(['commit', '-m', 'added b'])
135
out = self.run_bzr('pull --verbose ../b')[0]
136
self.assertNotEqual(out.find('Added Revisions:'), -1)
137
self.assertNotEqual(out.find('message:\n added b'), -1)
138
self.assertNotEqual(out.find('added b'), -1)
140
# Check that --overwrite --verbose prints out the removed entries
141
self.run_bzr('commit -m foo --unchanged')
143
self.run_bzr('commit -m baz --unchanged')
144
self.run_bzr('pull ../a', retcode=3)
145
out = self.run_bzr('pull --overwrite --verbose ../a')[0]
147
remove_loc = out.find('Removed Revisions:')
148
self.assertNotEqual(remove_loc, -1)
149
added_loc = out.find('Added Revisions:')
150
self.assertNotEqual(added_loc, -1)
152
removed_message = out.find('message:\n baz')
153
self.assertNotEqual(removed_message, -1)
154
self.assertTrue(remove_loc < removed_message < added_loc)
156
added_message = out.find('message:\n foo')
157
self.assertNotEqual(added_message, -1)
158
self.assertTrue(added_loc < added_message)
160
def test_locations(self):
161
"""Using and remembering different locations"""
165
self.run_bzr('commit -m unchanged --unchanged')
166
self.run_bzr('pull', retcode=3)
167
self.run_bzr('merge', retcode=3)
168
self.run_bzr('branch . ../b')
171
self.run_bzr('branch . ../c')
172
self.run_bzr('pull ../c')
173
self.run_bzr('merge')
175
self.run_bzr('pull ../b')
177
self.run_bzr('pull ../c')
178
self.run_bzr('branch ../c ../d')
179
osutils.rmtree('../c')
184
self.run_bzr('pull', retcode=3)
185
self.run_bzr('pull ../a --remember')
198
file('hello', 'wt').write('foo')
199
test.runbzr('add hello')
200
test.runbzr('commit -m setup hello')
201
file('goodbye', 'wt').write('baz')
202
test.runbzr('add goodbye')
203
test.runbzr('commit -m setup goodbye')
206
self.example_branch()
207
file('hello', 'wt').write('hello world!')
208
self.runbzr('commit -m fixing hello')
209
output = self.runbzr('diff -r 2..3', backtick=1)
210
self.assert_('\n+hello world!' in output)
211
output = self.runbzr('diff -r last:3..last:1', backtick=1)
212
self.assert_('\n+baz' in output)
215
self.example_branch()
216
file('hello', 'wt').write('hello world!')
217
self.runbzr('commit -m fixing hello')
218
output = self.runbzr('diff -r 2..3', backtick=1)
219
self.assert_('\n+hello world!' in output)
220
output = self.runbzr('diff -r last:3..last:1', backtick=1)
221
self.assert_('\n+baz' in output)
223
def test_merge(self):
224
from bzrlib.branch import Branch
228
self.example_branch()
230
self.runbzr('branch a b')
232
file('goodbye', 'wt').write('quux')
233
self.runbzr(['commit', '-m', "more u's are always good"])
236
file('hello', 'wt').write('quuux')
237
# We can't merge when there are in-tree changes
238
self.runbzr('merge ../b', retcode=1)
239
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
240
self.runbzr('merge ../b')
241
self.check_file_contents('goodbye', 'quux')
242
# Merging a branch pulls its revision into the tree
244
b = Branch.open('../b')
245
a.get_revision_xml(b.last_patch())
246
self.log('pending merges: %s', a.pending_merges())
247
# assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
248
# % (a.pending_merges(), b.last_patch())
251
"""Pull changes from one branch to another."""
255
self.example_branch()
256
self.runbzr('pull', retcode=1)
257
self.runbzr('missing', retcode=1)
258
self.runbzr('missing .')
259
self.runbzr('missing')
261
self.runbzr('pull /', retcode=1)
265
self.runbzr('branch a b')
268
self.runbzr('commit -m blah --unchanged')
271
b = Branch.open('../b')
272
assert a.revision_history() == b.revision_history()[:-1]
273
self.runbzr('pull ../b')
274
assert a.revision_history() == b.revision_history()
275
self.runbzr('commit -m blah2 --unchanged')
277
self.runbzr('commit -m blah3 --unchanged')
278
self.runbzr('pull ../a', retcode=1)
280
self.runbzr('merge ../b')
281
self.runbzr('commit -m blah4 --unchanged')
283
self.runbzr('pull ../a')
284
assert a.revision_history()[-1] == b.revision_history()[-1]
286
def test_add_reports(self):
287
"""add command prints the names of added files."""
288
b = Branch.initialize('.')
289
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
291
ret = self.apply_redirected(None, out, None,
294
self.assertEquals(ret, 0)
295
# the ordering is not defined at the moment
296
results = sorted(out.getvalue().rstrip('\n').split('\n'))
297
self.assertEquals(['added dir',
188
302
def test_unknown_command(self):
189
303
"""Handling of unknown command."""
190
out, err = self.run_bzr('fluffy-badger', retcode=3)
304
out, err = self.run_bzr_captured(['fluffy-badger'],
191
306
self.assertEquals(out, '')
192
307
err.index('unknown command')
194
def create_conflicts(self):
195
"""Create a conflicted tree"""
198
with file('hello', 'wb') as f: f.write("hi world")
199
with file('answer', 'wb') as f: f.write("42")
202
self.run_bzr('commit -m base')
203
self.run_bzr('branch . ../other')
204
self.run_bzr('branch . ../this')
206
with file('hello', 'wb') as f: f.write("Hello.")
207
with file('answer', 'wb') as f: f.write("Is anyone there?")
208
self.run_bzr('commit -m other')
210
with file('hello', 'wb') as f: f.write("Hello, world")
211
self.run_bzr('mv answer question')
212
with file('question', 'wb') as f: f.write("What do you get when you multiply six"
214
self.run_bzr('commit -m this')
216
def test_status(self):
220
self.run_bzr('commit --unchanged --message f')
221
self.run_bzr('branch . ../branch2')
222
self.run_bzr('branch . ../branch3')
223
self.run_bzr('commit --unchanged --message peter')
224
os.chdir('../branch2')
225
self.run_bzr('merge ../branch1')
226
self.run_bzr('commit --unchanged --message pumpkin')
227
os.chdir('../branch3')
228
self.run_bzr('merge ../branch2')
229
message = self.run_bzr('status')[0]
232
def test_conflicts(self):
233
"""Handling of merge conflicts"""
234
self.create_conflicts()
235
self.run_bzr('merge ../other --show-base', retcode=1)
236
conflict_text = file('hello').read()
237
self.assert_('<<<<<<<' in conflict_text)
238
self.assert_('>>>>>>>' in conflict_text)
239
self.assert_('=======' in conflict_text)
240
self.assert_('|||||||' in conflict_text)
241
self.assert_('hi world' in conflict_text)
242
self.run_bzr('revert')
243
self.run_bzr('resolve --all')
244
self.run_bzr('merge ../other', retcode=1)
245
conflict_text = file('hello').read()
246
self.assert_('|||||||' not in conflict_text)
247
self.assert_('hi world' not in conflict_text)
248
result = self.run_bzr('conflicts')[0]
249
self.assertEquals(result, "Text conflict in hello\nText conflict in"
251
result = self.run_bzr('status')[0]
252
self.assert_("conflicts:\n Text conflict in hello\n"
253
" Text conflict in question\n" in result, result)
254
self.run_bzr('resolve hello')
255
result = self.run_bzr('conflicts')[0]
256
self.assertEquals(result, "Text conflict in question\n")
257
self.run_bzr('commit -m conflicts', retcode=3)
258
self.run_bzr('resolve --all')
259
result = self.run_bzr('conflicts')[0]
260
self.run_bzr('commit -m conflicts')
261
self.assertEquals(result, "")
264
# create a source branch
265
os.mkdir('my-branch')
266
os.chdir('my-branch')
267
self.example_branch()
269
# with no push target, fail
270
self.run_bzr('push', retcode=3)
271
# with an explicit target work
272
self.run_bzr('push ../output-branch')
273
# with an implicit target work
276
self.run_bzr('missing ../output-branch')
277
# advance this branch
278
self.run_bzr('commit --unchanged -m unchanged')
280
os.chdir('../output-branch')
281
# There is no longer a difference as long as we have
282
# access to the working tree
285
# But we should be missing a revision
286
self.run_bzr('missing ../my-branch', retcode=1)
288
# diverge the branches
289
self.run_bzr('commit --unchanged -m unchanged')
290
os.chdir('../my-branch')
292
self.run_bzr('push', retcode=3)
293
# and there are difference
294
self.run_bzr('missing ../output-branch', retcode=1)
295
self.run_bzr('missing --verbose ../output-branch', retcode=1)
296
# but we can force a push
297
self.run_bzr('push --overwrite')
299
self.run_bzr('missing ../output-branch')
301
# pushing to a new dir with no parent should fail
302
self.run_bzr('push ../missing/new-branch', retcode=3)
303
# unless we provide --create-prefix
304
self.run_bzr('push --create-prefix ../missing/new-branch')
306
self.run_bzr('missing ../missing/new-branch')
308
def test_external_command(self):
309
"""Test that external commands can be run by setting the path
311
# We don't at present run bzr in a subprocess for blackbox tests, and so
312
# don't really capture stdout, only the internal python stream.
313
# Therefore we don't use a subcommand that produces any output or does
314
# anything -- we just check that it can be run successfully.
315
cmd_name = 'test-command'
316
if sys.platform == 'win32':
318
self.overrideEnv('BZRPATH', None)
320
f = file(cmd_name, 'wb')
321
if sys.platform == 'win32':
322
f.write('@echo off\n')
324
f.write('#!/bin/sh\n')
325
# f.write('echo Hello from test-command')
327
os.chmod(cmd_name, 0755)
329
# It should not find the command in the local
330
# directory by default, since it is not in my path
331
self.run_bzr(cmd_name, retcode=3)
333
# Now put it into my path
334
self.overrideEnv('BZRPATH', '.')
335
self.run_bzr(cmd_name)
337
# Make sure empty path elements are ignored
338
self.overrideEnv('BZRPATH', os.pathsep)
339
self.run_bzr(cmd_name, retcode=3)
342
def listdir_sorted(dir):
348
class OldTests(TestCaseWithTransport):
311
class OldTests(ExternalBase):
349
312
"""old tests moved from ./testbzr."""
351
314
def test_bzr(self):
352
315
from os import chdir, mkdir
353
316
from os.path import exists
319
capture = self.capture
355
320
progress = self.log
357
322
progress("basic branch creation")
362
self.assertIsSameRealPath(self.run_bzr('root')[0].rstrip(),
363
osutils.pathjoin(self.test_dir, 'branch1'))
327
self.assertEquals(capture('root').rstrip(),
328
os.path.join(self.test_dir, 'branch1'))
365
330
progress("status of new file")
368
333
f.write('hello world!\n')
371
self.assertEquals(self.run_bzr('unknowns')[0], 'test.txt\n')
373
out = self.run_bzr("status")[0]
374
self.assertEquals(out, 'unknown:\n test.txt\n')
336
self.assertEquals(capture('unknowns'), 'test.txt\n')
338
out = capture("status")
339
assert out == 'unknown:\n test.txt\n'
341
out = capture("status --all")
342
assert out == "unknown:\n test.txt\n"
344
out = capture("status test.txt --all")
345
assert out == "unknown:\n test.txt\n"
376
347
f = file('test2.txt', 'wt')
377
348
f.write('goodbye cruel world...\n')
380
out = self.run_bzr("status test.txt")[0]
381
self.assertEquals(out, "unknown:\n test.txt\n")
351
out = capture("status test.txt")
352
assert out == "unknown:\n test.txt\n"
383
out = self.run_bzr("status")[0]
384
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
354
out = capture("status")
355
assert out == ("unknown:\n"
386
359
os.unlink('test2.txt')
388
361
progress("command aliases")
389
out = self.run_bzr("st")[0]
390
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
362
out = capture("st --all")
363
assert out == ("unknown:\n"
392
out = self.run_bzr("stat")[0]
393
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
366
out = capture("stat")
367
assert out == ("unknown:\n"
395
370
progress("command help")
396
self.run_bzr("help st")
398
self.run_bzr("help commands")
399
self.run_bzr("help slartibartfast", retcode=3)
401
out = self.run_bzr("help ci")[0]
402
out.index('Aliases: ci, checkin\n')
373
runbzr("help commands")
374
runbzr("help slartibartfast", 1)
376
out = capture("help ci")
377
out.index('aliases: ')
379
progress("can't rename unversioned file")
380
runbzr("rename test.txt new-test.txt", 1)
382
progress("adding a file")
384
runbzr("add test.txt")
385
assert capture("unknowns") == ''
386
assert capture("status --all") == ("added:\n"
389
progress("rename newly-added file")
390
runbzr("rename test.txt hello.txt")
391
assert os.path.exists("hello.txt")
392
assert not os.path.exists("test.txt")
394
assert capture("revno") == '0\n'
396
progress("add first revision")
397
runbzr(['commit', '-m', 'add first revision'])
399
progress("more complex renames")
401
runbzr("rename hello.txt sub1", 1)
402
runbzr("rename hello.txt sub1/hello.txt", 1)
403
runbzr("move hello.txt sub1", 1)
406
runbzr("rename sub1 sub2")
407
runbzr("move hello.txt sub2")
408
assert capture("relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
410
assert exists("sub2")
411
assert exists("sub2/hello.txt")
412
assert not exists("sub1")
413
assert not exists("hello.txt")
415
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
419
runbzr('move sub2/hello.txt sub1')
420
assert not exists('sub2/hello.txt')
421
assert exists('sub1/hello.txt')
422
runbzr('move sub2 sub1')
423
assert not exists('sub2')
424
assert exists('sub1/sub2')
426
runbzr(['commit', '-m', 'rename nested subdirectories'])
429
self.assertEquals(capture('root')[:-1],
430
os.path.join(self.test_dir, 'branch1'))
431
runbzr('move ../hello.txt .')
432
assert exists('./hello.txt')
433
self.assertEquals(capture('relpath hello.txt'),
434
os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
435
assert capture('relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
436
runbzr(['commit', '-m', 'move to parent directory'])
438
assert capture('relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
440
runbzr('move sub2/hello.txt .')
441
assert exists('hello.txt')
404
443
f = file('hello.txt', 'wt')
405
444
f.write('some nice new content\n')
408
self.run_bzr("add hello.txt")
410
447
f = file('msg.tmp', 'wt')
411
f.write('this is my new commit\nand it has multiple lines, for fun')
448
f.write('this is my new commit\n')
414
self.run_bzr('commit -F msg.tmp')
416
self.assertEquals(self.run_bzr('revno')[0], '1\n')
417
self.run_bzr('export -r 1 export-1.tmp')
418
self.run_bzr('export export.tmp')
421
self.run_bzr('log -v')
422
self.run_bzr('log -v --forward')
423
self.run_bzr('log -m', retcode=3)
424
log_out = self.run_bzr('log -m commit')[0]
425
self.assert_("this is my new commit\n and" in log_out)
426
self.assert_("rename nested" not in log_out)
427
self.assert_('revision-id' not in log_out)
428
self.assert_('revision-id' in self.run_bzr('log --show-ids -m commit')[0])
430
log_out = self.run_bzr('log --line')[0]
431
# determine the widest line we want
432
max_width = osutils.terminal_width()
433
if max_width is not None:
434
for line in log_out.splitlines():
435
self.assert_(len(line) <= max_width - 1, len(line))
436
self.assert_("this is my new commit and" not in log_out)
437
self.assert_("this is my new commit" in log_out)
451
runbzr('commit -F msg.tmp')
453
assert capture('revno') == '5\n'
454
runbzr('export -r 5 export-5.tmp')
455
runbzr('export export.tmp')
459
runbzr('log -v --forward')
460
runbzr('log -m', retcode=1)
461
log_out = capture('log -m commit')
462
assert "this is my new commit" in log_out
463
assert "rename nested" not in log_out
464
assert 'revision-id' not in log_out
465
assert 'revision-id' in capture('log --show-ids -m commit')
439
468
progress("file with spaces in name")
440
469
mkdir('sub directory')
441
with file('sub directory/file with spaces ', 'wt') as f: f.write('see how this works\n')
442
self.run_bzr('add .')
443
self.run_bzr('diff', retcode=1)
444
self.run_bzr('commit -m add-spaces')
445
self.run_bzr('check')
448
self.run_bzr('log --forward')
452
if osutils.has_symlinks():
457
os.symlink("NOWHERE1", "link1")
458
self.run_bzr('add link1')
459
self.assertEquals(self.run_bzr('unknowns')[0], '')
460
self.run_bzr(['commit', '-m', '1: added symlink link1'])
463
self.run_bzr('add d1')
464
self.assertEquals(self.run_bzr('unknowns')[0], '')
465
os.symlink("NOWHERE2", "d1/link2")
466
self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link2\n')
467
# is d1/link2 found when adding d1
468
self.run_bzr('add d1')
469
self.assertEquals(self.run_bzr('unknowns')[0], '')
470
os.symlink("NOWHERE3", "d1/link3")
471
self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link3\n')
472
self.run_bzr(['commit', '-m', '2: added dir, symlink'])
474
self.run_bzr('rename d1 d2')
475
self.run_bzr('move d2/link2 .')
476
self.run_bzr('move link1 d2')
477
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
478
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
479
self.run_bzr('add d2/link3')
480
self.run_bzr('diff', retcode=1)
481
self.run_bzr(['commit', '-m',
482
'3: rename of dir, move symlinks, add link3'])
485
os.symlink("TARGET 2", "link2")
486
os.unlink("d2/link1")
487
os.symlink("TARGET 1", "d2/link1")
488
self.run_bzr('diff', retcode=1)
489
self.assertEquals(self.run_bzr("relpath d2/link1")[0], "d2/link1\n")
490
self.run_bzr(['commit', '-m', '4: retarget of two links'])
492
self.run_bzr('remove --keep d2/link1')
493
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
494
self.run_bzr(['commit', '-m', '5: remove d2/link1'])
495
# try with the rm alias
496
self.run_bzr('add d2/link1')
497
self.run_bzr(['commit', '-m', '6: add d2/link1'])
498
self.run_bzr('rm --keep d2/link1')
499
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
500
self.run_bzr(['commit', '-m', '7: remove d2/link1'])
503
self.run_bzr('add d1')
504
self.run_bzr('rename d2/link3 d1/link3new')
505
self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n')
506
self.run_bzr(['commit', '-m',
507
'8: remove d2/link1, move/rename link3'])
509
self.run_bzr('check')
511
self.run_bzr('export -r 1 exp1.tmp')
513
self.assertEquals(listdir_sorted("."), [ "link1" ])
514
self.assertEquals(os.readlink("link1"), "NOWHERE1")
517
self.run_bzr('export -r 2 exp2.tmp')
519
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
522
self.run_bzr('export -r 3 exp3.tmp')
524
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
525
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
526
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
527
self.assertEquals(os.readlink("link2") , "NOWHERE2")
530
self.run_bzr('export -r 4 exp4.tmp')
532
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
533
self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
534
self.assertEquals(os.readlink("link2") , "TARGET 2")
535
self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
538
self.run_bzr('export -r 5 exp5.tmp')
540
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
541
self.assert_(os.path.islink("link2"))
542
self.assert_(listdir_sorted("d2")== [ "link3" ])
545
self.run_bzr('export -r 8 exp6.tmp')
547
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
548
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
549
self.assertEquals(listdir_sorted("d2"), [])
550
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
553
progress("skipping symlink tests")
556
class RemoteTests(object):
557
"""Test bzr ui commands against remote branches."""
559
def test_branch(self):
561
wt = self.make_branch_and_tree('from')
563
wt.commit('empty commit for nonsense', allow_pointless=True)
564
url = self.get_readonly_url('from')
565
self.run_bzr(['branch', url, 'to'])
566
branch = Branch.open('to')
567
self.assertEqual(1, branch.last_revision_info()[0])
568
# the branch should be set in to to from
569
self.assertEqual(url + '/', branch.get_parent())
572
self.build_tree(['branch/', 'branch/file'])
573
self.run_bzr('init branch')[0]
574
self.run_bzr('add branch/file')[0]
575
self.run_bzr('commit -m foo branch')[0]
576
url = self.get_readonly_url('branch/file')
577
output = self.run_bzr('log %s' % url)[0]
578
self.assertEqual(8, len(output.split('\n')))
580
def test_check(self):
581
self.build_tree(['branch/', 'branch/file'])
582
self.run_bzr('init branch')[0]
583
self.run_bzr('add branch/file')[0]
584
self.run_bzr('commit -m foo branch')[0]
585
url = self.get_readonly_url('branch/')
586
self.run_bzr(['check', url])
589
# create a source branch
590
os.mkdir('my-branch')
591
os.chdir('my-branch')
593
with file('hello', 'wt') as f: f.write('foo')
594
self.run_bzr('add hello')
595
self.run_bzr('commit -m setup')
597
# with an explicit target work
598
self.run_bzr(['push', self.get_url('output-branch')])
601
class HTTPTests(TestCaseWithWebserver, RemoteTests):
602
"""Test various commands against a HTTP server."""
605
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
606
"""Test various commands against a SFTP server using abs paths."""
609
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
610
"""Test various commands against a SFTP server using abs paths."""
613
super(SFTPTestsAbsoluteSibling, self).setUp()
614
self._override_home = '/dev/noone/runs/tests/here'
617
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
618
"""Test various commands against a SFTP server using homedir rel paths."""
621
super(SFTPTestsRelative, self).setUp()
622
self._get_remote_is_absolute = False
470
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
473
runbzr('commit -m add-spaces')
477
runbzr('log --forward')