~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/script.py

  • Committer: John Arbash Meinel
  • Date: 2010-02-17 17:11:16 UTC
  • mfrom: (4797.2.17 2.1)
  • mto: (4797.2.18 2.1)
  • mto: This revision was merged to the branch mainline in revision 5055.
  • Revision ID: john@arbash-meinel.com-20100217171116-h7t9223ystbnx5h8
merge bzr.2.1 in preparation for NEWS entry.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009 Canonical Ltd
 
1
# Copyright (C) 2009, 2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
107
107
                error = []
108
108
            error.append(line[2:] + '\n')
109
109
        else:
 
110
            # can happen if the first line is not recognized as a command, eg
 
111
            # if the prompt has leading whitespace
110
112
            if output is None:
111
113
                if cmd_cur is None:
112
 
                    raise SyntaxError('No command for that output',
 
114
                    raise SyntaxError('No command for line %r' % (line,),
113
115
                                      (file_name, lineno, 1, orig))
114
116
                output = []
115
117
            output.append(line + '\n')
217
219
            # Specifying None means: any output is accepted
218
220
            return
219
221
        if actual is None:
220
 
            test_case.fail('Unexpected: %s' % actual)
 
222
            test_case.fail('We expected output: %r, but found None'
 
223
                           % (expected,))
221
224
        matching = self.output_checker.check_output(
222
225
            expected, actual, self.check_options)
223
226
        if not matching:
289
292
            try:
290
293
                inputs.append(self._read_input(None, in_name))
291
294
            except IOError, e:
292
 
                if e.errno == errno.ENOENT:
 
295
                # Some filenames are illegal on Windows and generate EINVAL
 
296
                # rather than just saying the filename doesn't exist
 
297
                if e.errno in (errno.ENOENT, errno.EINVAL):
293
298
                    return (1, None,
294
299
                            '%s: No such file or directory\n' % (in_name,))
 
300
                raise
295
301
        # Basically cat copy input to output
296
302
        output = ''.join(inputs)
297
303
        # Handle output redirections
298
304
        try:
299
305
            output = self._write_output(output, out_name, out_mode)
300
306
        except IOError, e:
301
 
            if e.errno == errno.ENOENT:
 
307
            # If out_name cannot be created, we may get 'ENOENT', however if
 
308
            # out_name is something like '', we can get EINVAL
 
309
            if e.errno in (errno.ENOENT, errno.EINVAL):
302
310
                return 1, None, '%s: No such file or directory\n' % (out_name,)
 
311
            raise
303
312
        return 0, output, None
304
313
 
305
314
    def do_echo(self, test_case, input, args):
306
315
        (in_name, out_name, out_mode, args) = _scan_redirection_options(args)
307
 
        if input and args:
308
 
                raise SyntaxError('Specify parameters OR use redirection')
 
316
        if input or in_name:
 
317
            raise SyntaxError('echo doesn\'t read from stdin')
309
318
        if args:
310
319
            input = ' '.join(args)
311
 
        try:
312
 
            input = self._read_input(input, in_name)
313
 
        except IOError, e:
314
 
            if e.errno == errno.ENOENT:
315
 
                return 1, None, '%s: No such file or directory\n' % (in_name,)
316
320
        # Always append a \n'
317
321
        input += '\n'
318
322
        # Process output
321
325
        try:
322
326
            output = self._write_output(output, out_name, out_mode)
323
327
        except IOError, e:
324
 
            if e.errno == errno.ENOENT:
 
328
            if e.errno in (errno.ENOENT, errno.EINVAL):
325
329
                return 1, None, '%s: No such file or directory\n' % (out_name,)
 
330
            raise
326
331
        return 0, output, None
327
332
 
328
333
    def _get_jail_root(self, test_case):
397
402
            retcode = 0
398
403
        return retcode, None, err
399
404
 
 
405
    def do_mv(self, test_case, input, args):
 
406
        err = None
 
407
        def error(msg, src, dst):
 
408
            return "mv: cannot move %s to %s: %s\n" % (src, dst, msg)
 
409
 
 
410
        if not args or len(args) != 2:
 
411
            raise SyntaxError("Usage: mv path1 path2")
 
412
        src, dst = args
 
413
        try:
 
414
            real_dst = dst
 
415
            if os.path.isdir(dst):
 
416
                real_dst = os.path.join(dst, os.path.basename(src))
 
417
            os.rename(src, real_dst)
 
418
        except OSError, e:
 
419
            if e.errno == errno.ENOENT:
 
420
                err = error('No such file or directory', src, dst)
 
421
            else:
 
422
                raise
 
423
        if err:
 
424
            retcode = 1
 
425
        else:
 
426
            retcode = 0
 
427
        return retcode, None, err
 
428
 
 
429
 
400
430
 
401
431
class TestCaseWithMemoryTransportAndScript(tests.TestCaseWithMemoryTransport):
402
432
    """Helper class to experiment shell-like test and memory fs.