[PATCH] D82811: [lit] Highlight failing line with colored output.

Varun Gandhi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 29 14:59:04 PDT 2020


varungandhi-apple created this revision.
varungandhi-apple added a reviewer: yln.
Herald added subscribers: llvm-commits, delcypher.
Herald added a project: LLVM.

Highlight failing line in lit.py output with color.
Split out from D80694 <https://reviews.llvm.org/D80694>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D82811

Files:
  llvm/docs/CommandGuide/lit.rst
  llvm/utils/lit/lit/TestRunner.py


Index: llvm/utils/lit/lit/TestRunner.py
===================================================================
--- llvm/utils/lit/lit/TestRunner.py
+++ llvm/utils/lit/lit/TestRunner.py
@@ -17,6 +17,7 @@
 except ImportError:
     from io import StringIO
 
+from lit.ProgressBar import TerminalController
 import lit.OutputSettings as OutputSettings
 from lit.ShCommands import GlobItem, Command
 import lit.ShUtil as ShUtil
@@ -1578,7 +1579,12 @@
     last_run_line_str = last_run_line.group(0)[delta:]
     return (last_run_line.start(), last_run_line_str)
 
-def make_script_output(lit_config, script_lines, exit_code):
+def highlight_failure_lines(text):
+    term = TerminalController()
+    return term.render('${BOLD}${RED}%s${NORMAL}' % text)
+
+def make_script_output(lit_config, script_lines, stdout, stderr, test_status,
+                       exit_code):
     def make_output(script_display_lines):
         return ("""Script:\n--\n%s\n--\nExit Code: %d\n"""
                 % ('\n'.join(script_display_lines), exit_code))
@@ -1586,11 +1592,36 @@
     def default_output():
         return make_output(script_lines)
 
+    def split_on_substring(strings, substring):
+        for i, s in enumerate(strings):
+            if substring in s:
+                return (strings[:i], s, strings[i+1:])
+        return (None, None, None)
+
+    def highlighted_output(last_run_line):
+        (pre, failing_line, post) = split_on_substring(script_lines,
+                                                       last_run_line)
+        if failing_line is None:
+            return default_output()
+        highlighted_failing_line = highlight_failure_lines(failing_line)
+        return make_output(pre + [highlighted_failing_line] + post)
+
     if lit_config.script_output_style == OutputSettings.NO_SCRIPT:
         return ""
 
     assert(lit_config.script_output_style == OutputSettings.FULL_SCRIPT)
-    return default_output()
+
+    if not test_status.isFailure:
+        return default_output()
+    last_run_line = None
+    if stderr is not None:
+        _, last_run_line = locate_last_run_line(stderr)
+    if (last_run_line is None) and (stdout is not None):
+        _, last_run_line = locate_last_run_line(stdout)
+    if last_run_line is None:
+        return default_output()
+
+    return highlighted_output(last_run_line)
 
 def make_command_output(lit_config, cmd_output, stream_name, test_status):
     def make_output(output_str, is_truncated=False):
@@ -1621,7 +1652,9 @@
 
     assert(lit_config.command_output_style
            == OutputSettings.UP_TO_AND_INCLUDING_FAILING_COMMAND)
-    return make_output(cmd_output, is_truncated=False)
+    failing_lines = highlight_failure_lines(cmd_output[line_start:])
+    return make_output(cmd_output[:line_start] + failing_lines,
+                       is_truncated=False)
 
 def _runShTest(test, litConfig, useExternalSh, script, tmpBase):
     def runOnce(execdir):
@@ -1663,7 +1696,7 @@
         status = Test.FLAKYPASS
 
     # Form the output log.
-    output = make_script_output(litConfig, script, exitCode)
+    output = make_script_output(litConfig, script, out, err, status, exitCode)
 
     if timeoutInfo is not None:
         output += """Timeout: %s\n""" % (timeoutInfo,)
Index: llvm/docs/CommandGuide/lit.rst
===================================================================
--- llvm/docs/CommandGuide/lit.rst
+++ llvm/docs/CommandGuide/lit.rst
@@ -97,6 +97,9 @@
  option also causes those no-op commands to be echoed to stdout to help you
  locate the source line of the failed command.
 
+ The failing command and corresponding output are highlighted in color if the
+ terminal supports it.
+
 .. option:: -vv, --echo-all-commands
 
  Alias for ``-v``/``--verbose`` (for backwards compatibility).


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82811.274246.patch
Type: text/x-patch
Size: 3788 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200629/a8a487da/attachment.bin>


More information about the llvm-commits mailing list