Echo all commands to stdout, as they are being executed.
This can be valuable for debugging test failures, as the last echoed command
will be the one which has failed.
- To help you find the source RUN line, :program:`lit` inserts a no-op ``:``
- command with argument ``'RUN: at line N'`` before each command pipeline.
This option implies ``--verbose``.
.. option:: -a, --show-all
results.append(cmdResult)
return cmdResult.exitCode
- if cmd.commands[0].args[0] == ':':
- if len(cmd.commands) != 1:
- raise InternalShellError(cmd.commands[0], "Unsupported: ':' "
- "cannot be part of a pipeline")
- results.append(ShellCommandResult(cmd.commands[0], '', '', 0, False))
- return 0;
-
procs = []
default_stdin = subprocess.PIPE
stderrTempFiles = []
def parseLine(self, line_number, line):
try:
self.parsed_lines += [(line_number, line)]
- self.value = self.parser(line_number, line, self.value,
- self.keyword)
+ self.value = self.parser(line_number, line, self.value)
except ValueError as e:
raise ValueError(str(e) + ("\nin %s directive on test line %d" %
(self.keyword, line_number)))
return self.value
@staticmethod
- def _handleTag(line_number, line, output, keyword):
+ def _handleTag(line_number, line, output):
"""A helper for parsing TAG type keywords"""
return (not line.strip() or output)
@staticmethod
- def _handleCommand(line_number, line, output, keyword):
+ def _handleCommand(line_number, line, output):
"""A helper for parsing COMMAND type keywords"""
# Trim trailing whitespace.
line = line.rstrip()
else:
if output is None:
output = []
- line = ": '{keyword} at line {line}'; {real_command}".format(
- keyword=keyword,
- line=line_number,
- real_command=line)
output.append(line)
return output
@staticmethod
- def _handleList(line_number, line, output, keyword):
+ def _handleList(line_number, line, output):
"""A parser for LIST type keywords"""
if output is None:
output = []
return output
@staticmethod
- def _handleBooleanExpr(line_number, line, output, keyword):
+ def _handleBooleanExpr(line_number, line, output):
"""A parser for BOOLEAN_EXPR type keywords"""
if output is None:
output = []
return output
@staticmethod
- def _handleRequiresAny(line_number, line, output, keyword):
+ def _handleRequiresAny(line_number, line, output):
"""A custom parser to transform REQUIRES-ANY: into REQUIRES:"""
# Extract the conditions specified in REQUIRES-ANY: as written.
conditions = []
- IntegratedTestKeywordParser._handleList(line_number, line, conditions,
- keyword)
+ IntegratedTestKeywordParser._handleList(line_number, line, conditions)
# Output a `REQUIRES: a || b || c` expression in its place.
expression = ' || '.join(conditions)
- IntegratedTestKeywordParser._handleBooleanExpr(line_number, expression,
- output, keyword)
+ IntegratedTestKeywordParser._handleBooleanExpr(line_number,
+ expression, output)
return output
def parseIntegratedTestScript(test, additional_parsers=[],
+++ /dev/null
-# RUN: true
-# RUN: false
-# RUN: true
+++ /dev/null
-# RUN: : first line continued \
-# RUN: to second line
-# RUN: echo 'foo bar' \
-# RUN: | FileCheck %s
-# RUN: echo \
-# RUN: 'foo baz' \
-# RUN: | FileCheck %s
-# RUN: echo 'foo bar' \
-# RUN: | FileCheck %s
-
-# CHECK: foo bar
+++ /dev/null
-import lit.formats
-config.test_format = lit.formats.ShTest(execute_external=True)
+++ /dev/null
-# RUN: true
-# RUN: false
-# RUN: true
+++ /dev/null
-# RUN: : first line continued \
-# RUN: to second line
-# RUN: echo 'foo bar' \
-# RUN: | FileCheck %s
-# RUN: echo \
-# RUN: 'foo baz' \
-# RUN: | FileCheck %s
-# RUN: echo 'foo bar' \
-# RUN: | FileCheck %s
-
-# CHECK: foo bar
+++ /dev/null
-import lit.formats
-config.test_format = lit.formats.ShTest(execute_external=False)
+++ /dev/null
-import lit.formats
-config.name = 'shtest-run-at-line'
-config.suffixes = ['.txt']
+++ /dev/null
-# Check error on an unsupported ":". (cannot be part of a pipeline)
-#
-# RUN: : | echo "hello"
#
# END.
-# CHECK: Failing Tests (27)
+# CHECK: Failing Tests (26)
# CHECK: Failing Tests (1)
# CHECK: Failing Tests (2)
# CHECK: error: Setting --max-failures to 0 does not have any effect.
#
# CHECK: Command Output (stdout):
# CHECK-NEXT: --
-# CHECK-NEXT: $ ":" "RUN: at line 1"
# CHECK-NEXT: $ "printf"
# CHECK-NEXT: # command output:
# CHECK-NEXT: line 1: failed test output on stdout
#
# CHECK: Command Output
# CHECK-NEXT: --
-# CHECK-NEXT: $ ":" "RUN: at line 1"
# CHECK-NEXT: $ "true"
-# CHECK-NEXT: $ ":" "RUN: at line 2"
# CHECK-NEXT: $ "echo" "hi"
# CHECK-NEXT: # command output:
# CHECK-NEXT: hi
#
-# CHECK: $ ":" "RUN: at line 3"
-# CHECK-NEXT: $ "wc" "missing-file"
+# CHECK: $ "wc" "missing-file"
# CHECK-NEXT: # redirected output from '{{.*(/|\\\\)}}basic.txt.tmp.out':
# CHECK-NEXT: missing-file{{.*}} No such file or directory
# CHECK: note: command had no output on stdout or stderr
+++ /dev/null
-# Check that -vv makes the line number of the failing RUN command clear.
-# (-v is actually sufficient in the case of the internal shell.)
-#
-# RUN: not %{lit} -j 1 -vv %{inputs}/shtest-run-at-line > %t.out
-# RUN: FileCheck --input-file %t.out %s
-#
-# END.
-
-
-# CHECK: Testing: 4 tests
-
-
-# In the case of the external shell, we check for only RUN lines in stderr in
-# case some shell implementations format "set -x" output differently.
-
-# CHECK-LABEL: FAIL: shtest-run-at-line :: external-shell/basic.txt
-
-# CHECK: Script:
-# CHECK: : 'RUN: at line 1'; true
-# CHECK-NEXT: : 'RUN: at line 2'; false
-# CHECK-NEXT: : 'RUN: at line 3'; true
-
-# CHECK: Command Output (stderr)
-# CHECK: RUN: at line 1
-# CHECK: RUN: at line 2
-# CHECK-NOT: RUN
-
-# CHECK-LABEL: FAIL: shtest-run-at-line :: external-shell/line-continuation.txt
-
-# CHECK: Script:
-# CHECK: : 'RUN: at line 1'; : first line continued to second line
-# CHECK-NEXT: : 'RUN: at line 3'; echo 'foo bar' | FileCheck
-# CHECK-NEXT: : 'RUN: at line 5'; echo 'foo baz' | FileCheck
-# CHECK-NEXT: : 'RUN: at line 8'; echo 'foo bar' | FileCheck
-
-# CHECK: Command Output (stderr)
-# CHECK: RUN: at line 1
-# CHECK: RUN: at line 3
-# CHECK: RUN: at line 5
-# CHECK-NOT: RUN
-
-
-# CHECK-LABEL: FAIL: shtest-run-at-line :: internal-shell/basic.txt
-
-# CHECK: Script:
-# CHECK: : 'RUN: at line 1'; true
-# CHECK-NEXT: : 'RUN: at line 2'; false
-# CHECK-NEXT: : 'RUN: at line 3'; true
-
-# CHECK: Command Output (stdout)
-# CHECK: $ ":" "RUN: at line 1"
-# CHECK-NEXT: $ "true"
-# CHECK-NEXT: $ ":" "RUN: at line 2"
-# CHECK-NEXT: $ "false"
-# CHECK-NOT: RUN
-
-# CHECK-LABEL: FAIL: shtest-run-at-line :: internal-shell/line-continuation.txt
-
-# CHECK: Script:
-# CHECK: : 'RUN: at line 1'; : first line continued to second line
-# CHECK-NEXT: : 'RUN: at line 3'; echo 'foo bar' | FileCheck
-# CHECK-NEXT: : 'RUN: at line 5'; echo 'foo baz' | FileCheck
-# CHECK-NEXT: : 'RUN: at line 8'; echo 'foo bar' | FileCheck
-
-# CHECK: Command Output (stdout)
-# CHECK: $ ":" "RUN: at line 1"
-# CHECK-NEXT: $ ":" "first" "line" "continued" "to" "second" "line"
-# CHECK-NEXT: $ ":" "RUN: at line 3"
-# CHECK-NEXT: $ "echo" "foo bar"
-# CHECK-NEXT: $ "FileCheck" "{{.*}}"
-# CHECK-NEXT: $ ":" "RUN: at line 5"
-# CHECK-NEXT: $ "echo" "foo baz"
-# CHECK-NEXT: $ "FileCheck" "{{.*}}"
-# CHECK-NOT: RUN
# CHECK: error: command failed with exit status: 1
# CHECK: ***
-# CHECK: FAIL: shtest-shell :: colon-error.txt
-# CHECK: *** TEST 'shtest-shell :: colon-error.txt' FAILED ***
-# CHECK: $ ":"
-# CHECK: # command stderr:
-# CHECK: Unsupported: ':' cannot be part of a pipeline
-# CHECK: error: command failed with exit status: 127
-# CHECK: ***
-
# CHECK: FAIL: shtest-shell :: diff-error-0.txt
# CHECK: *** TEST 'shtest-shell :: diff-error-0.txt' FAILED ***
# CHECK: $ "diff" "diff-error-0.txt" "diff-error-0.txt"
#
# CHECK: FAIL: shtest-shell :: error-1.txt
# CHECK: *** TEST 'shtest-shell :: error-1.txt' FAILED ***
-# CHECK: shell parser error on: ': \'RUN: at line 3\'; echo "missing quote'
+# CHECK: shell parser error on: 'echo "missing quote'
# CHECK: ***
# CHECK: FAIL: shtest-shell :: error-2.txt
# CHECK: PASS: shtest-shell :: sequencing-0.txt
# CHECK: XFAIL: shtest-shell :: sequencing-1.txt
# CHECK: PASS: shtest-shell :: valid-shell.txt
-# CHECK: Failing Tests (27)
+# CHECK: Failing Tests (26)
@staticmethod
def make_parsers():
- def custom_parse(line_number, line, output, keyword):
+ def custom_parse(line_number, line, output):
if output is None:
output = []
output += [part for part in line.split(' ') if part.strip()]
cmd_parser = self.get_parser(parsers, 'MY_RUN:')
value = cmd_parser.getValue()
self.assertEqual(len(value), 2) # there are only two run lines
- self.assertEqual(value[0].strip(), ": 'MY_RUN: at line 4'; baz")
- self.assertEqual(value[1].strip(), ": 'MY_RUN: at line 7'; foo bar")
+ self.assertEqual(value[0].strip(), 'baz')
+ self.assertEqual(value[1].strip(), 'foo bar')
def test_custom(self):
parsers = self.make_parsers()