Eek, will fix.<br><br>On Tuesday, June 7, 2016, Michael Spencer <<a href="mailto:bigcheesegs@gmail.com">bigcheesegs@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Jun 7, 2016 at 9:13 AM, Daniel Dunbar via llvm-commits<br>
<<a href="javascript:;" onclick="_e(event, 'cvml', 'llvm-commits@lists.llvm.org')">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: ddunbar<br>
> Date: Tue Jun  7 11:13:40 2016<br>
> New Revision: 272021<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=272021&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=272021&view=rev</a><br>
> Log:<br>
> [lit] Improve logging with file redirection.<br>
><br>
>  - This will cause lit to automatically include the first 1K of data in<br>
>    redirected output files when a command fails (previously if the command<br>
>    failed, but the main point of the test was, say, a `FileCheck` later on, then<br>
>    the log wasn't helpful in showing why the command failed).<br>
><br>
> Modified:<br>
>     llvm/trunk/utils/lit/lit/TestRunner.py<br>
>     llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt<br>
>     llvm/trunk/utils/lit/tests/shtest-output-printing.py<br>
>     llvm/trunk/utils/lit/tests/shtest-shell.py<br>
><br>
> Modified: llvm/trunk/utils/lit/lit/TestRunner.py<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/TestRunner.py?rev=272021&r1=272020&r2=272021&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/TestRunner.py?rev=272021&r1=272020&r2=272021&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/utils/lit/lit/TestRunner.py (original)<br>
> +++ llvm/trunk/utils/lit/lit/TestRunner.py Tue Jun  7 11:13:40 2016<br>
> @@ -113,12 +113,14 @@ class TimeoutHelper(object):<br>
>  class ShellCommandResult(object):<br>
>      """Captures the result of an individual command."""<br>
><br>
> -    def __init__(self, command, stdout, stderr, exitCode, timeoutReached):<br>
> +    def __init__(self, command, stdout, stderr, exitCode, timeoutReached,<br>
> +                 outputFiles = []):<br>
>          self.command = command<br>
>          self.stdout = stdout<br>
>          self.stderr = stderr<br>
>          self.exitCode = exitCode<br>
>          self.timeoutReached = timeoutReached<br>
> +        self.outputFiles = list(outputFiles)<br>
><br>
>  def executeShCmd(cmd, shenv, results, timeout=0):<br>
>      """<br>
> @@ -268,7 +270,7 @@ def _executeShCmd(cmd, shenv, results, t<br>
>                      # FIXME: Actually, this is probably an instance of PR6753.<br>
>                      if r[1] == 'a':<br>
>                          r[2].seek(0, 2)<br>
> -                    opened_files.append(r[2])<br>
> +                    opened_files.append(tuple(r) + (redir_filename,))<br>
>                  result = r[2]<br>
>              final_redirects.append(result)<br>
><br>
> @@ -342,7 +344,7 @@ def _executeShCmd(cmd, shenv, results, t<br>
>      # need to release any handles we may have on the temporary files (important<br>
>      # on Win32, for example). Since we have already spawned the subprocess, our<br>
>      # handles have already been transferred so we do not need them anymore.<br>
> -    for f in opened_files:<br>
> +    for (name, mode, f, path) in opened_files:<br>
>          f.close()<br>
><br>
>      # FIXME: There is probably still deadlock potential here. Yawn.<br>
> @@ -393,8 +395,21 @@ def _executeShCmd(cmd, shenv, results, t<br>
>          except:<br>
>              err = str(err)<br>
><br>
> +        # Gather the redirected output files.<br>
> +        output_files = []<br>
> +        for (name, mode, f, path) in sorted(opened_files):<br>
> +            if mode in ('w', 'a'):<br>
> +                try:<br>
> +                    with open(path) as f:<br>
> +                        data = f.read()<br>
> +                except:<br>
> +                    data = None<br>
> +                if data != None:<br>
> +                    output_files.append((name, path, data))<br>
> +<br>
>          results.append(ShellCommandResult(<br>
> -            cmd.commands[i], out, err, res, timeoutHelper.timeoutReached()))<br>
> +            cmd.commands[i], out, err, res, timeoutHelper.timeoutReached(),<br>
> +            output_files))<br>
>          if cmd.pipe_err:<br>
>              # Python treats the exit code as a signed char.<br>
>              if exitCode is None:<br>
> @@ -455,6 +470,19 @@ def executeScriptInternal(test, litConfi<br>
>              continue<br>
><br>
>          # Otherwise, something failed or was printed, show it.<br>
> +<br>
> +        # Add the command output, if redirected.<br>
> +        for (name, path, data) in result.outputFiles:<br>
> +            if data.strip():<br>
> +                out += "# redirected output from %r:\n" % (name,)<br>
> +                data = to_string(data.decode('utf-8'))<br>
> +                if len(data) > 1024:<br>
> +                    out += data[:1024] + "\n...\n"<br>
> +                    out += "note: data was truncated\n"<br>
> +                else:<br>
> +                    out += data<br>
> +                out += "\n"<br>
> +<br>
>          if result.stdout.strip():<br>
>              out += '# command output:\n%s\n' % (result.stdout,)<br>
>          if result.stderr.strip():<br>
><br>
> Modified: llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt?rev=272021&r1=272020&r2=272021&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt?rev=272021&r1=272020&r2=272021&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt (original)<br>
> +++ llvm/trunk/utils/lit/tests/Inputs/shtest-output-printing/basic.txt Tue Jun  7 11:13:40 2016<br>
> @@ -1,3 +1,3 @@<br>
>  # RUN: true<br>
>  # RUN: echo hi<br>
> -# RUN: false<br>
> +# RUN: wc missing-file &> %t.out<br>
><br>
> Modified: llvm/trunk/utils/lit/tests/shtest-output-printing.py<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/shtest-output-printing.py?rev=272021&r1=272020&r2=272021&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/shtest-output-printing.py?rev=272021&r1=272020&r2=272021&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/utils/lit/tests/shtest-output-printing.py (original)<br>
> +++ llvm/trunk/utils/lit/tests/shtest-output-printing.py Tue Jun  7 11:13:40 2016<br>
> @@ -1,7 +1,7 @@<br>
>  # Check the various features of the ShTest format.<br>
>  #<br>
>  # RUN: not %{lit} -j 1 -v %{inputs}/shtest-output-printing > %t.out<br>
> -# RUN: FileCheck < %t.out %s<br>
> +# RUN: FileCheck --input-file %t.out %s<br>
>  #<br>
>  # END.<br>
><br>
> @@ -21,6 +21,8 @@<br>
>  # CHECK-NEXT: # command output:<br>
>  # CHECK-NEXT: hi<br>
>  #<br>
> -# CHECK:      $ "false"<br>
> -# CHECK-NEXT: note: command had no output on stdout or stderr<br>
> +# CHECK:      $ "wc" "missing-file"<br>
> +# CHECK-NEXT: # redirected output from '{{.*}}/basic.txt.tmp.out':<br>
> +# CHECK-NEXT: missing-file{{.*}} No such file or directory<br>
> +# CHECK:      note: command had no output on stdout or stderr<br>
>  # CHECK-NEXT: error: command failed with exit status: 1<br>
><br>
> Modified: llvm/trunk/utils/lit/tests/shtest-shell.py<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/shtest-shell.py?rev=272021&r1=272020&r2=272021&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/tests/shtest-shell.py?rev=272021&r1=272020&r2=272021&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/utils/lit/tests/shtest-shell.py (original)<br>
> +++ llvm/trunk/utils/lit/tests/shtest-shell.py Tue Jun  7 11:13:40 2016<br>
> @@ -1,7 +1,7 @@<br>
>  # Check the internal shell handling component of the ShTest format.<br>
>  #<br>
>  # RUN: not %{lit} -j 1 -v %{inputs}/shtest-shell > %t.out<br>
> -# RUN: FileCheck < %t.out %s<br>
> +# RUN: FileCheck --input-file %t.out %s<br>
>  #<br>
>  # END.<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="javascript:;" onclick="_e(event, 'cvml', 'llvm-commits@lists.llvm.org')">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br>
This breaks for me for some tests with:<br>
<br>
UnboundLocalError: local variable 'redir_filename' referenced before assignment<br>
<br>
Python 2.7.10<br>
<br>
Unresolved Tests (70):<br>
    Clang :: Analysis/inline-unique-reports.c<br>
    Clang :: CodeGenCXX/microsoft-abi-alignment-fail.cpp<br>
    Clang :: CodeGenCXX/microsoft-abi-non-virtual-base-ordering.cpp<br>
    Clang :: CodeGenCXX/microsoft-abi-rtti.cpp<br>
    Clang :: CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp<br>
    Clang :: Driver/msc-version.c<br>
    Clang :: Format/multiple-inputs-error.cpp<br>
    Clang :: Frontend/optimization-remark.c<br>
    Clang :: Frontend/profile-sample-use-loc-tracking.c<br>
    Clang :: Frontend/stdin.c<br>
    Clang :: Integration/cocoa-pch.m<br>
    Clang :: Layout/itanium-union-bitfield.cpp<br>
    Clang :: Layout/ms-x86-alias-avoidance-padding.cpp<br>
    Clang :: Layout/ms-x86-aligned-tail-padding.cpp<br>
    Clang :: Layout/ms-x86-basic-layout.cpp<br>
    Clang :: Layout/ms-x86-bitfields-vbases.cpp<br>
    Clang :: Layout/ms-x86-declspec-empty_bases.cpp<br>
    Clang :: Layout/ms-x86-empty-base-after-base-with-vbptr.cpp<br>
    Clang :: Layout/ms-x86-empty-layout.c<br>
    Clang :: Layout/ms-x86-empty-nonvirtual-bases.cpp<br>
    Clang :: Layout/ms-x86-empty-virtual-base.cpp<br>
    Clang :: Layout/ms-x86-lazy-empty-nonvirtual-base.cpp<br>
    Clang :: Layout/ms-x86-misalignedarray.cpp<br>
    Clang :: Layout/ms-x86-pack-and-align.cpp<br>
    Clang :: Layout/ms-x86-primary-bases.cpp<br>
    Clang :: Layout/ms-x86-size-alignment-fail.cpp<br>
    Clang :: Layout/ms-x86-vfvb-alignment.cpp<br>
    Clang :: Layout/ms-x86-vfvb-sharing.cpp<br>
    Clang :: Layout/ms-x86-vtordisp.cpp<br>
    Clang :: Layout/ms_struct-bitfields.c<br>
    Clang :: Misc/serialized-diags-frontend.c<br>
    Clang :: Misc/serialized-diags-no-category.c<br>
    Clang :: Misc/serialized-diags-stable.c<br>
    Clang :: Misc/serialized-diags.c<br>
    Clang :: Misc/serialized-diags.m<br>
    Clang :: Modules/serialized-diags.m<br>
    Clang :: Preprocessor/include-directive1.c<br>
    Clang :: Preprocessor/include-directive3.c<br>
    Clang :: Preprocessor/init-v7k-compat.c<br>
    Clang :: Preprocessor/init.c<br>
    Clang :: Sema/ms_bitfield_layout.c<br>
    Clang :: Sema/ms_class_layout.cpp<br>
    LLVM :: Assembler/align-inst-alloca.ll<br>
    LLVM :: Assembler/align-inst-load.ll<br>
    LLVM :: Assembler/align-inst-store.ll<br>
    LLVM :: Bindings/llvm-c/add_named_metadata_operand.ll<br>
    LLVM :: Bindings/llvm-c/objectfile.ll<br>
    LLVM :: Bindings/llvm-c/set_metadata.ll<br>
    LLVM :: FileCheck/check-empty.txt<br>
    LLVM :: Linker/2002-07-17-LinkTest2.ll<br>
    LLVM :: Linker/2002-08-20-ConstantExpr.ll<br>
    LLVM :: Linker/2009-09-03-mdnode.ll<br>
    LLVM :: MC/AArch64/arm64-v128_lo-diagnostics.s<br>
    LLVM :: MC/AsmParser/floating-literals.s<br>
    LLVM :: MC/Mips/elf_eflags_micromips.s<br>
    LLVM :: Other/2009-09-14-function-elements.ll<br>
    LLVM :: Other/ResponseFile.ll<br>
    LLVM :: TableGen/BitsInitOverflow.td<br>
    LLVM :: tools/llvm-objdump/eh_frame-arm64.test<br>
    LLVM :: tools/llvm-objdump/eh_frame_zero_cie.test<br>
    LLVM :: tools/llvm-objdump/macho-exports-trie.test<br>
    LLVM :: tools/llvm-objdump/macho-unwind-info-arm64.test<br>
    LLVM :: tools/llvm-objdump/macho-unwind-info-no-relocs.test<br>
    LLVM :: tools/llvm-objdump/macho-unwind-info-x86_64.test<br>
    lld :: ELF/default-output.s<br>
    lld :: ELF/linkerscript-ouputformat.s<br>
    lld :: ELF/linkerscript-outputarch.s<br>
    lld :: ELF/warn-common.s<br>
    lld :: mach-o/image-base.yaml<br>
    lld :: mach-o/stack-size.yaml<br>
<br>
<br>
- Michael Spencer<br>
</blockquote>