/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
292 by Martin Pool
- start adding a pure-python blackbox test suite
1
#! /usr/bin/python
561 by Martin Pool
- add failing test for problem with stat after remove,
2
# -*- coding: utf-8 -*-
292 by Martin Pool
- start adding a pure-python blackbox test suite
3
4
# Copyright (C) 2005 Canonical Ltd
5
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20
21
"""External black-box test for bzr.
22
23
This always runs bzr as an external process to try to catch bugs
24
related to argument processing, startup, etc.
25
507 by Martin Pool
- new -p option for testbzr to use a different version of python
26
usage:
27
28
    testbzr [-p PYTHON] [BZR]
29
30
By default this tests the copy of bzr found in the same directory as
31
testbzr, or the first one found on the $PATH.  A copy of bzr may be
32
given on the command line to override this, for example when applying
33
a new test suite to an old copy of bzr or vice versa.
34
35
testbzr normally invokes bzr using the same version of python as it
36
would normally use to run -- that is, the system default python,
37
unless that is older than 2.3.  The -p option allows specification of
38
a different Python interpreter, such as when testing that bzr still
39
works on python2.3.
40
292 by Martin Pool
- start adding a pure-python blackbox test suite
41
This replaces the previous test.sh which was not very portable."""
42
296 by Martin Pool
- better reports from testbzr when it fails
43
import sys, os, traceback
339 by Martin Pool
many more diffs
44
from os import mkdir
45
from os.path import exists
292 by Martin Pool
- start adding a pure-python blackbox test suite
46
335 by Martin Pool
- add new failing test for command parsing
47
TESTDIR = "testbzr.tmp"
48
624 by Martin Pool
- make sure bzr is always explicitly invoked through
49
50
# we always invoke bzr as 'python bzr' (or e.g. 'python2.3 bzr')
51
# partly so as to cope if the bzr binary is not marked executable
52
OVERRIDE_PYTHON = 'python'
507 by Martin Pool
- new -p option for testbzr to use a different version of python
53
335 by Martin Pool
- add new failing test for command parsing
54
LOGFILENAME = 'testbzr.log'
55
292 by Martin Pool
- start adding a pure-python blackbox test suite
56
try:
57
    import shutil
301 by Martin Pool
- provide for catching output from shell commands
58
    from subprocess import call, Popen, PIPE
292 by Martin Pool
- start adding a pure-python blackbox test suite
59
except ImportError, e:
60
    sys.stderr.write("testbzr: sorry, this test suite requires modules from python2.4\n"
61
                     + '    ' + str(e))
62
    sys.exit(1)
63
64
296 by Martin Pool
- better reports from testbzr when it fails
65
66
302 by Martin Pool
testbzr: new backtick() helper
67
def formcmd(cmd):
68
    if isinstance(cmd, basestring):
69
        cmd = cmd.split()
70
398 by Martin Pool
- testbzr finds the right version of bzr to test
71
    if cmd[0] == 'bzr':
72
        cmd[0] = BZRPATH
507 by Martin Pool
- new -p option for testbzr to use a different version of python
73
        if OVERRIDE_PYTHON:
74
            cmd.insert(0, OVERRIDE_PYTHON)
398 by Martin Pool
- testbzr finds the right version of bzr to test
75
507 by Martin Pool
- new -p option for testbzr to use a different version of python
76
    logfile.write('$ %r\n' % cmd)
77
    
302 by Martin Pool
testbzr: new backtick() helper
78
    return cmd
79
80
81
def runcmd(cmd, retcode=0):
300 by Martin Pool
- more tests
82
    """Run one command and check the return code.
292 by Martin Pool
- start adding a pure-python blackbox test suite
83
301 by Martin Pool
- provide for catching output from shell commands
84
    Returns a tuple of (stdout,stderr) strings.
85
292 by Martin Pool
- start adding a pure-python blackbox test suite
86
    If a single string is based, it is split into words.
87
    For commands that are not simple space-separated words, please
88
    pass a list instead."""
302 by Martin Pool
testbzr: new backtick() helper
89
    cmd = formcmd(cmd)
90
    log_linenumber()
91
    
92
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
93
    
94
    if retcode != actual_retcode:
95
        raise CommandFailed("test failed: %r returned %d, expected %d"
96
                            % (cmd, actual_retcode, retcode))
97
98
99
100
def backtick(cmd, retcode=0):
101
    cmd = formcmd(cmd)
102
    log_linenumber()
103
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
301 by Martin Pool
- provide for catching output from shell commands
104
    outd, errd = child.communicate()
302 by Martin Pool
testbzr: new backtick() helper
105
    logfile.write(outd)
301 by Martin Pool
- provide for catching output from shell commands
106
    actual_retcode = child.wait()
307 by Martin Pool
testbzr: clean up crlf handling
107
108
    outd = outd.replace('\r', '')
301 by Martin Pool
- provide for catching output from shell commands
109
    
298 by Martin Pool
- test some commands known to fail
110
    if retcode != actual_retcode:
111
        raise CommandFailed("test failed: %r returned %d, expected %d"
112
                            % (cmd, actual_retcode, retcode))
292 by Martin Pool
- start adding a pure-python blackbox test suite
113
302 by Martin Pool
testbzr: new backtick() helper
114
    return outd
115
301 by Martin Pool
- provide for catching output from shell commands
116
292 by Martin Pool
- start adding a pure-python blackbox test suite
117
118
def progress(msg):
119
    print '* ' + msg
120
    logfile.write('* '+ msg + '\n')
297 by Martin Pool
- fix intentional testcase failure
121
    log_linenumber()
122
123
299 by Martin Pool
testbzr:
124
def cd(dirname):
125
    logfile.write('$ cd %s\n' % dirname)
126
    os.chdir(dirname)
127
128
300 by Martin Pool
- more tests
129
297 by Martin Pool
- fix intentional testcase failure
130
def log_linenumber():
131
    """Log the stack frame location two things up."""
132
    stack = traceback.extract_stack()[-3]
133
    logfile.write('   at %s:%d\n' % stack[:2])
134
135
340 by Martin Pool
- more testcase fixes
136
292 by Martin Pool
- start adding a pure-python blackbox test suite
137
# prepare an empty scratch directory
138
if os.path.exists(TESTDIR):
139
    shutil.rmtree(TESTDIR)
140
513 by Martin Pool
- show some log output if the tests fail
141
start_dir = os.getcwd()
142
292 by Martin Pool
- start adding a pure-python blackbox test suite
143
335 by Martin Pool
- add new failing test for command parsing
144
logfile = open(LOGFILENAME, 'wt', buffering=1)
292 by Martin Pool
- start adding a pure-python blackbox test suite
145
641 by Martin Pool
- improved external-command patch from john
146
def test_plugins():
147
    """Run a test involving creating a plugin to load,
148
    and making sure it is seen properly.
149
    """
150
    mkdir('plugin_test')
151
    f = open(os.path.join('plugin_test', 'myplug.py'), 'wb')
152
    f.write("""import bzrlib, bzrlib.commands
153
class cmd_myplug(bzrlib.commands.Command):
154
    '''Just a simple test plugin.'''
155
    aliases = ['mplg']
156
    def run(self):
157
        print 'Hello from my plugin'
158
""")
159
    f.close()
160
161
    os.environ['BZRPLUGINPATH'] = os.path.abspath('plugin_test')
162
    help = backtick('bzr help commands')
163
    assert help.find('myplug') != -1
164
    assert help.find('Just a simple test plugin.') != -1
165
166
    
167
    assert backtick('bzr myplug') == 'Hello from my plugin\n'
168
    assert backtick('bzr mplg') == 'Hello from my plugin\n'
169
170
    f = open(os.path.join('plugin_test', 'override.py'), 'wb')
171
    f.write("""import bzrlib, bzrlib.commands
172
class cmd_commit(bzrlib.commands.cmd_commit):
173
    '''Commit changes into a new revision.'''
174
    def run(self, *args, **kwargs):
175
        print "I'm sorry dave, you can't do that"
176
177
class cmd_help(bzrlib.commands.cmd_help):
178
    '''Show help on a command or other topic.'''
179
    def run(self, *args, **kwargs):
180
        print "You have been overridden"
181
        bzrlib.commands.cmd_help.run(self, *args, **kwargs)
182
183
""")
184
    f.close()
185
186
    newhelp = backtick('bzr help commands')
187
    assert newhelp.startswith('You have been overridden\n')
188
    # We added a line, but the rest should work
189
    assert newhelp[25:] == help
190
191
    assert backtick('bzr commit -m test') == "I'm sorry dave, you can't do that\n"
192
    
193
    shutil.rmtree('plugin_test')
292 by Martin Pool
- start adding a pure-python blackbox test suite
194
300 by Martin Pool
- more tests
195
try:
507 by Martin Pool
- new -p option for testbzr to use a different version of python
196
    from getopt import getopt
197
    opts, args = getopt(sys.argv[1:], 'p:')
198
199
    for option, value in opts:
200
        if option == '-p':
201
            OVERRIDE_PYTHON = value
202
            
203
    
398 by Martin Pool
- testbzr finds the right version of bzr to test
204
    mypath = os.path.abspath(sys.argv[0])
413 by Martin Pool
- more indicators at top of test output
205
    print '%-30s %s' % ('running tests from', mypath)
398 by Martin Pool
- testbzr finds the right version of bzr to test
206
207
    global BZRPATH
208
507 by Martin Pool
- new -p option for testbzr to use a different version of python
209
    if args:
623 by Martin Pool
- fix invocation of testbzr when giving explicit bzr location
210
        BZRPATH = args[0]
398 by Martin Pool
- testbzr finds the right version of bzr to test
211
    else:
212
        BZRPATH = os.path.join(os.path.split(mypath)[0], 'bzr')
213
413 by Martin Pool
- more indicators at top of test output
214
    print '%-30s %s' % ('against bzr', BZRPATH)
215
    print '%-30s %s' % ('in directory', os.getcwd())
507 by Martin Pool
- new -p option for testbzr to use a different version of python
216
    print '%-30s %s' % ('with python', (OVERRIDE_PYTHON or '(default)'))
398 by Martin Pool
- testbzr finds the right version of bzr to test
217
    print
624 by Martin Pool
- make sure bzr is always explicitly invoked through
218
    print backtick('bzr version')
398 by Martin Pool
- testbzr finds the right version of bzr to test
219
    
300 by Martin Pool
- more tests
220
    runcmd(['mkdir', TESTDIR])
299 by Martin Pool
testbzr:
221
    cd(TESTDIR)
456 by Martin Pool
- tests for bzr root
222
    test_root = os.getcwd()
296 by Martin Pool
- better reports from testbzr when it fails
223
300 by Martin Pool
- more tests
224
    progress("introductory commands")
296 by Martin Pool
- better reports from testbzr when it fails
225
    runcmd("bzr version")
335 by Martin Pool
- add new failing test for command parsing
226
    runcmd("bzr --version")
296 by Martin Pool
- better reports from testbzr when it fails
227
    runcmd("bzr help")
297 by Martin Pool
- fix intentional testcase failure
228
    runcmd("bzr --help")
229
399 by Martin Pool
- testbzr also runs selftests
230
    progress("internal tests")
231
    runcmd("bzr selftest")
232
300 by Martin Pool
- more tests
233
    progress("user identity")
297 by Martin Pool
- fix intentional testcase failure
234
    # this should always identify something, if only "john@localhost"
235
    runcmd("bzr whoami")
298 by Martin Pool
- test some commands known to fail
236
    runcmd("bzr whoami --email")
302 by Martin Pool
testbzr: new backtick() helper
237
    assert backtick("bzr whoami --email").count('@') == 1
298 by Martin Pool
- test some commands known to fail
238
300 by Martin Pool
- more tests
239
    progress("invalid commands")
298 by Martin Pool
- test some commands known to fail
240
    runcmd("bzr pants", retcode=1)
241
    runcmd("bzr --pants off", retcode=1)
382 by Martin Pool
- test previous commit
242
    runcmd("bzr diff --message foo", retcode=1)
296 by Martin Pool
- better reports from testbzr when it fails
243
300 by Martin Pool
- more tests
244
    progress("basic branch creation")
245
    runcmd(['mkdir', 'branch1'])
246
    cd('branch1')
247
    runcmd('bzr init')
303 by Martin Pool
- more tests for unknown file
248
456 by Martin Pool
- tests for bzr root
249
    assert backtick('bzr root')[:-1] == os.path.join(test_root, 'branch1')
250
303 by Martin Pool
- more tests for unknown file
251
    progress("status of new file")
300 by Martin Pool
- more tests
252
    
253
    f = file('test.txt', 'wt')
254
    f.write('hello world!\n')
255
    f.close()
256
307 by Martin Pool
testbzr: clean up crlf handling
257
    out = backtick("bzr unknowns")
258
    assert out == 'test.txt\n'
303 by Martin Pool
- more tests for unknown file
259
307 by Martin Pool
testbzr: clean up crlf handling
260
    out = backtick("bzr status")
477 by Martin Pool
- fix header for listing of unknown files
261
    assert out == 'unknown:\n  test.txt\n'
303 by Martin Pool
- more tests for unknown file
262
307 by Martin Pool
testbzr: clean up crlf handling
263
    out = backtick("bzr status --all")
477 by Martin Pool
- fix header for listing of unknown files
264
    assert out == "unknown:\n  test.txt\n"
304 by Martin Pool
testbzr: test adding a file
265
404 by Martin Pool
- bzr status now optionally takes filenames to check
266
    out = backtick("bzr status test.txt --all")
477 by Martin Pool
- fix header for listing of unknown files
267
    assert out == "unknown:\n  test.txt\n"
404 by Martin Pool
- bzr status now optionally takes filenames to check
268
269
    f = file('test2.txt', 'wt')
270
    f.write('goodbye cruel world...\n')
271
    f.close()
272
273
    out = backtick("bzr status test.txt")
480 by Martin Pool
- more status form test fixes
274
    assert out == "unknown:\n  test.txt\n"
404 by Martin Pool
- bzr status now optionally takes filenames to check
275
276
    out = backtick("bzr status")
480 by Martin Pool
- more status form test fixes
277
    assert out == ("unknown:\n"
278
                   "  test.txt\n"
279
                   "  test2.txt\n")
404 by Martin Pool
- bzr status now optionally takes filenames to check
280
281
    os.unlink('test2.txt')
282
350 by Martin Pool
- refactor command aliases into command classes
283
    progress("command aliases")
284
    out = backtick("bzr st --all")
482 by Martin Pool
- more status form test fixes
285
    assert out == ("unknown:\n"
286
                   "  test.txt\n")
287
    
350 by Martin Pool
- refactor command aliases into command classes
288
    out = backtick("bzr stat")
482 by Martin Pool
- more status form test fixes
289
    assert out == ("unknown:\n"
290
                   "  test.txt\n")
350 by Martin Pool
- refactor command aliases into command classes
291
292
    progress("command help")
293
    runcmd("bzr help st")
294
    runcmd("bzr help")
295
    runcmd("bzr help commands")
352 by Martin Pool
- Show aliases in command help
296
    runcmd("bzr help slartibartfast", 1)
297
298
    out = backtick("bzr help ci")
299
    out.index('aliases: ')
350 by Martin Pool
- refactor command aliases into command classes
300
305 by Martin Pool
testbzr: test renames
301
    progress("can't rename unversioned file")
302
    runcmd("bzr rename test.txt new-test.txt", 1)
303
304 by Martin Pool
testbzr: test adding a file
304
    progress("adding a file")
305
306
    runcmd("bzr add test.txt")
307
    assert backtick("bzr unknowns") == ''
482 by Martin Pool
- more status form test fixes
308
    assert backtick("bzr status --all") == ("added:\n"
309
                                            "  test.txt\n")
300 by Martin Pool
- more tests
310
305 by Martin Pool
testbzr: test renames
311
    progress("rename newly-added file")
312
    runcmd("bzr rename test.txt hello.txt")
306 by Martin Pool
testbzr: test renames
313
    assert os.path.exists("hello.txt")
314
    assert not os.path.exists("test.txt")
305 by Martin Pool
testbzr: test renames
315
308 by Martin Pool
fix test suite
316
    assert backtick("bzr revno") == '0\n'
307 by Martin Pool
testbzr: clean up crlf handling
317
339 by Martin Pool
many more diffs
318
    progress("add first revision")
319
    runcmd(["bzr", "commit", "-m", 'add first revision'])
320
321
    progress("more complex renames")
322
    os.mkdir("sub1")
323
    runcmd("bzr rename hello.txt sub1", 1)
324
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
325
    runcmd("bzr move hello.txt sub1", 1)
326
327
    runcmd("bzr add sub1")
328
    runcmd("bzr rename sub1 sub2")
329
    runcmd("bzr move hello.txt sub2")
560 by Martin Pool
- fix testbzr for win32
330
    assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
339 by Martin Pool
many more diffs
331
332
    assert exists("sub2")
333
    assert exists("sub2/hello.txt")
334
    assert not exists("sub1")
335
    assert not exists("hello.txt")
336
337
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
338
339
    mkdir("sub1")
340
    runcmd('bzr add sub1')
341
    runcmd('bzr move sub2/hello.txt sub1')
342
    assert not exists('sub2/hello.txt')
343
    assert exists('sub1/hello.txt')
344
    runcmd('bzr move sub2 sub1')
345
    assert not exists('sub2')
346
    assert exists('sub1/sub2')
347
348
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
349
350
    cd('sub1/sub2')
456 by Martin Pool
- tests for bzr root
351
    assert backtick('bzr root')[:-1] == os.path.join(test_root, 'branch1')
339 by Martin Pool
many more diffs
352
    runcmd('bzr move ../hello.txt .')
340 by Martin Pool
- more testcase fixes
353
    assert exists('./hello.txt')
560 by Martin Pool
- fix testbzr for win32
354
    assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
355
    assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
339 by Martin Pool
many more diffs
356
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
357
    cd('..')
560 by Martin Pool
- fix testbzr for win32
358
    assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
340 by Martin Pool
- more testcase fixes
359
360
    runcmd('bzr move sub2/hello.txt .')
361
    assert exists('hello.txt')
389 by Martin Pool
- new commit --file option!
362
363
    f = file('hello.txt', 'wt')
364
    f.write('some nice new content\n')
365
    f.close()
366
367
    f = file('msg.tmp', 'wt')
368
    f.write('this is my new commit\n')
369
    f.close()
370
371
    runcmd('bzr commit -F msg.tmp')
394 by Martin Pool
- Fix argument handling in export command
372
373
    assert backtick('bzr revno') == '5\n'
374
    runcmd('bzr export -r 5 export-5.tmp')
375
    runcmd('bzr export export.tmp')
461 by Martin Pool
- remove compare_inventories() in favor of compare_trees()
376
377
    runcmd('bzr log')
378
    runcmd('bzr log -v')
511 by Martin Pool
- add tests for files and directories with spaces in name
379
380
381
382
    progress("file with spaces in name")
383
    mkdir('sub directory')
384
    file('sub directory/file with spaces ', 'wt').write('see how this works\n')
385
    runcmd('bzr add .')
386
    runcmd('bzr diff')
387
    runcmd('bzr commit -m add-spaces')
388
    runcmd('bzr check')
389
545 by Martin Pool
- --forward option for log
390
    runcmd('bzr log')
391
    runcmd('bzr log --forward')
392
541 by Martin Pool
- add lazy test for 'bzr info'
393
    runcmd('bzr info')
561 by Martin Pool
- add failing test for problem with stat after remove,
394
395
595 by Martin Pool
- tests for add --no-recurse
396
    
397
398
561 by Martin Pool
- add failing test for problem with stat after remove,
399
400
    cd('..')
401
    cd('..')
628 by Martin Pool
- merge aaron's updated merge/pull code
402
    progress('branch')
403
    # Can't create a branch if it already exists
404
    runcmd('bzr branch branch1', retcode=1)
405
    # Can't create a branch if its parent doesn't exist
406
    runcmd('bzr branch /unlikely/to/exist', retcode=1)
407
    runcmd('bzr branch branch1 branch2')
408
409
    progress("pull")
410
    cd('branch1')
411
    runcmd('bzr pull', retcode=1)
412
    runcmd('bzr pull ../branch2')
413
    cd('.bzr')
414
    runcmd('bzr pull')
415
    runcmd('bzr commit -m empty')
416
    runcmd('bzr pull')
417
    cd('../../branch2')
418
    runcmd('bzr pull')
419
    runcmd('bzr commit -m empty')
420
    cd('../branch1')
421
    runcmd('bzr commit -m empty')
422
    runcmd('bzr pull', retcode=1)
423
    cd ('..')
561 by Martin Pool
- add failing test for problem with stat after remove,
424
425
    progress('status after remove')
426
    mkdir('status-after-remove')
427
    # see mail from William Dodé, 2005-05-25
428
    # $ bzr init; touch a; bzr add a; bzr commit -m "add a"
429
    #     * looking for changes...
430
    #     added a
431
    #     * commited r1
432
    #     $ bzr remove a
433
    #     $ bzr status
434
    #     bzr: local variable 'kind' referenced before assignment
435
    #     at /vrac/python/bazaar-ng/bzrlib/diff.py:286 in compare_trees()
436
    #     see ~/.bzr.log for debug information
437
    cd('status-after-remove')
438
    runcmd('bzr init')
439
    file('a', 'w').write('foo')
440
    runcmd('bzr add a')
441
    runcmd(['bzr', 'commit', '-m', 'add a'])
442
    runcmd('bzr remove a')
443
    runcmd('bzr status')
444
410 by Martin Pool
- Fix ignore command and add tests
445
    cd('..')
446
447
    progress('ignore patterns')
448
    mkdir('ignorebranch')
449
    cd('ignorebranch')
450
    runcmd('bzr init')
451
    assert backtick('bzr unknowns') == ''
452
453
    file('foo.tmp', 'wt').write('tmp files are ignored')
454
    assert backtick('bzr unknowns') == ''
455
456
    file('foo.c', 'wt').write('int main() {}')
457
    assert backtick('bzr unknowns') == 'foo.c\n'
458
    runcmd('bzr add foo.c')
459
    assert backtick('bzr unknowns') == ''
460
499 by Martin Pool
- new bzr ignore test cases from ddaa
461
    # 'ignore' works when creating the .bzignore file
410 by Martin Pool
- Fix ignore command and add tests
462
    file('foo.blah', 'wt').write('blah')
463
    assert backtick('bzr unknowns') == 'foo.blah\n'
464
    runcmd('bzr ignore *.blah')
465
    assert backtick('bzr unknowns') == ''
499 by Martin Pool
- new bzr ignore test cases from ddaa
466
    assert file('.bzrignore', 'rb').read() == '*.blah\n'
410 by Martin Pool
- Fix ignore command and add tests
467
499 by Martin Pool
- new bzr ignore test cases from ddaa
468
    # 'ignore' works when then .bzrignore file already exists
469
    file('garh', 'wt').write('garh')
470
    assert backtick('bzr unknowns') == 'garh\n'
471
    runcmd('bzr ignore garh')
472
    assert backtick('bzr unknowns') == ''
473
    assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
300 by Martin Pool
- more tests
474
595 by Martin Pool
- tests for add --no-recurse
475
    cd('..')
476
477
478
479
480
    progress("recursive and non-recursive add")
481
    mkdir('no-recurse')
482
    cd('no-recurse')
483
    runcmd('bzr init')
484
    mkdir('foo')
485
    fp = os.path.join('foo', 'test.txt')
486
    f = file(fp, 'w')
487
    f.write('hello!\n')
488
    f.close()
489
    runcmd('bzr add --no-recurse foo')
490
    runcmd('bzr file-id foo')
491
    runcmd('bzr file-id ' + fp, 1)      # not versioned yet
492
    runcmd('bzr commit -m add-dir-only')
493
494
    runcmd('bzr file-id ' + fp, 1)      # still not versioned 
495
496
    runcmd('bzr add foo')
497
    runcmd('bzr file-id ' + fp)
498
    runcmd('bzr commit -m add-sub-file')
499
    
500
    cd('..')
501
502
511 by Martin Pool
- add tests for files and directories with spaces in name
503
504
641 by Martin Pool
- improved external-command patch from john
505
    # Run any function in this 
506
    g = globals()
507
    funcs = g.keys()
508
    funcs.sort()
509
    for k in funcs:
510
        if k.startswith('test_') and callable(g[k]):
511
            progress(k[5:].replace('_', ' '))
512
            g[k]()
513
296 by Martin Pool
- better reports from testbzr when it fails
514
    progress("all tests passed!")
515
except Exception, e:
516
    sys.stderr.write('*' * 50 + '\n'
517
                     + 'testbzr: tests failed\n'
335 by Martin Pool
- add new failing test for command parsing
518
                     + 'see ' + LOGFILENAME + ' for more information\n'
296 by Martin Pool
- better reports from testbzr when it fails
519
                     + '*' * 50 + '\n')
520
    logfile.write('tests failed!\n')
521
    traceback.print_exc(None, logfile)
513 by Martin Pool
- show some log output if the tests fail
522
    logfile.close()
523
524
    sys.stdout.writelines(file(os.path.join(start_dir, LOGFILENAME), 'rt').readlines()[-50:])
525
    
296 by Martin Pool
- better reports from testbzr when it fails
526
    sys.exit(1)
513 by Martin Pool
- show some log output if the tests fail
527