From 2dc2d3f820494f5041905121472ca199858807d1 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 2 Mar 2015 21:33:18 +0000 Subject: [PATCH] lit: Add 'cd' support to the internal shell and port some tests The internal shell was already threading around a 'cwd' parameter. We just have to make it mutable so that we can update it as the test script executes. If the shell ever grows support for environment variable substitution, we could also implement support for export. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231017 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Linker/targettriple.ll | 1 - test/Object/archive-delete.test | 2 -- test/Object/archive-extract-dir.test | 4 +-- test/Object/archive-format.test | 2 -- test/Object/archive-move.test | 2 -- test/Object/archive-update.test | 2 -- test/Object/extract.ll | 2 -- test/Object/nm-trivial-object.test | 1 - test/tools/llvm-cov/llvm-cov.test | 3 +- utils/lit/lit/TestRunner.py | 52 +++++++++++++++++++++------- 10 files changed, 42 insertions(+), 29 deletions(-) diff --git a/test/Linker/targettriple.ll b/test/Linker/targettriple.ll index 87787067006..a159797856c 100644 --- a/test/Linker/targettriple.ll +++ b/test/Linker/targettriple.ll @@ -1,4 +1,3 @@ -; REQUIRES: shell ; RUN: llvm-link %s %S/Inputs/targettriple-a.ll -S -o - 2>%t.a.err | FileCheck %s ; RUN: cat %t.a.err | FileCheck --check-prefix=WARN-A %s --allow-empty diff --git a/test/Object/archive-delete.test b/test/Object/archive-delete.test index 552b0e709f6..c8530beafce 100644 --- a/test/Object/archive-delete.test +++ b/test/Object/archive-delete.test @@ -1,7 +1,5 @@ Test the 'd' operation in llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/archive-extract-dir.test b/test/Object/archive-extract-dir.test index c718f90275b..5182a2f9141 100644 --- a/test/Object/archive-extract-dir.test +++ b/test/Object/archive-extract-dir.test @@ -1,5 +1,3 @@ -REQUIRES: shell - RUN: mkdir -p %t RUN: cd %t RUN: rm -rf foo @@ -10,4 +8,4 @@ RUN: rm foo RUN: mkdir foo RUN: not llvm-ar x test.a foo 2>&1 | FileCheck %s -CHECK: foo: Is a directory +CHECK: foo: {{[Ii]}}s a directory diff --git a/test/Object/archive-format.test b/test/Object/archive-format.test index 20ac1a0d78f..236a181139a 100644 --- a/test/Object/archive-format.test +++ b/test/Object/archive-format.test @@ -1,8 +1,6 @@ Test the exact archive format. In particular, test which file names use the string table or not. -REQUIRES: shell - RUN: mkdir -p %t RUN: cd %t diff --git a/test/Object/archive-move.test b/test/Object/archive-move.test index 0378e9111a9..adc114994d2 100644 --- a/test/Object/archive-move.test +++ b/test/Object/archive-move.test @@ -1,7 +1,5 @@ Test the 'm' operation in llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/archive-update.test b/test/Object/archive-update.test index 20286d2669a..91ca8102c7e 100644 --- a/test/Object/archive-update.test +++ b/test/Object/archive-update.test @@ -1,7 +1,5 @@ Test the 'u' option of llvm-ar -REQUIRES: shell - RUN: cd %T RUN: rm -f %t.a diff --git a/test/Object/extract.ll b/test/Object/extract.ll index a4e76499ca6..8d77f09fe88 100644 --- a/test/Object/extract.ll +++ b/test/Object/extract.ll @@ -3,8 +3,6 @@ ; This test just makes sure that llvm-ar can extract bytecode members ; from various style archives. -; REQUIRES: shell - ; RUN: cd %T ; RUN: rm -f very_long_bytecode_file_name.bc diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index 0135f2df3cb..c576c236fc0 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -46,7 +46,6 @@ RUN: mkdir -p %t RUN: cd %t RUN: cp %p/Inputs/trivial-object-test.macho-i386 a.out RUN: llvm-nm | FileCheck %s -check-prefix A-OUT -REQUIRES: shell COFF: 00000000 {{.*}} d .data diff --git a/test/tools/llvm-cov/llvm-cov.test b/test/tools/llvm-cov/llvm-cov.test index 0d3eb6b8f81..6a71120c882 100644 --- a/test/tools/llvm-cov/llvm-cov.test +++ b/test/tools/llvm-cov/llvm-cov.test @@ -1,7 +1,8 @@ # Tests for compatibility between llvm-cov and gcov. These work by # comparing llvm-cov against reference outputs generated by gcov 4.2. -# "cd" and globbing are unsupported in lit internal runner. +# Test fails on Windows where internal shell is used due to path separator +# mismatches. REQUIRES: shell RUN: rm -rf %t diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 268e46c38f7..f1734eca372 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -22,33 +22,56 @@ kUseCloseFDs = not kIsWindows # Use temporary files to replace /dev/null on Windows. kAvoidDevNull = kIsWindows -def executeShCmd(cmd, cfg, cwd, results): +class ShellEnvironment(object): + + """Mutable shell environment containing things like CWD and env vars. + + Environment variables are not implemented, but cwd tracking is. + """ + + def __init__(self, cwd, env): + self.cwd = cwd + self.env = env + +def executeShCmd(cmd, shenv, results): if isinstance(cmd, ShUtil.Seq): if cmd.op == ';': - res = executeShCmd(cmd.lhs, cfg, cwd, results) - return executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) + return executeShCmd(cmd.rhs, shenv, results) if cmd.op == '&': raise InternalShellError(cmd,"unsupported shell operator: '&'") if cmd.op == '||': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res != 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res if cmd.op == '&&': - res = executeShCmd(cmd.lhs, cfg, cwd, results) + res = executeShCmd(cmd.lhs, shenv, results) if res is None: return res if res == 0: - res = executeShCmd(cmd.rhs, cfg, cwd, results) + res = executeShCmd(cmd.rhs, shenv, results) return res raise ValueError('Unknown shell command: %r' % cmd.op) - assert isinstance(cmd, ShUtil.Pipeline) + + # Handle shell builtins first. + if cmd.commands[0].args[0] == 'cd': + # Update the cwd in the environment. + if len(cmd.commands[0].args) != 2: + raise ValueError('cd supports only one argument') + newdir = cmd.commands[0].args[1] + if os.path.isabs(newdir): + shenv.cwd = newdir + else: + shenv.cwd = os.path.join(shenv.cwd, newdir) + return 0 + procs = [] input = subprocess.PIPE stderrTempFiles = [] @@ -102,7 +125,9 @@ def executeShCmd(cmd, cfg, cwd, results): if kAvoidDevNull and r[0] == '/dev/null': r[2] = tempfile.TemporaryFile(mode=r[1]) else: - r[2] = open(r[0], r[1]) + # Make sure relative paths are relative to the cwd. + redir_filename = os.path.join(shenv.cwd, r[0]) + r[2] = open(redir_filename, r[1]) # Workaround a Win32 and/or subprocess bug when appending. # # FIXME: Actually, this is probably an instance of PR6753. @@ -132,7 +157,7 @@ def executeShCmd(cmd, cfg, cwd, results): # Resolve the executable path ourselves. args = list(j.args) - executable = lit.util.which(args[0], cfg.environment['PATH']) + executable = lit.util.which(args[0], shenv.env['PATH']) if not executable: raise InternalShellError(j, '%r: command not found' % j.args[0]) @@ -146,12 +171,12 @@ def executeShCmd(cmd, cfg, cwd, results): args[i] = f.name try: - procs.append(subprocess.Popen(args, cwd=cwd, + procs.append(subprocess.Popen(args, cwd=shenv.cwd, executable = executable, stdin = stdin, stdout = stdout, stderr = stderr, - env = cfg.environment, + env = shenv.env, close_fds = kUseCloseFDs)) except OSError as e: raise InternalShellError(j, 'Could not create process due to {}'.format(e)) @@ -257,7 +282,8 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd): results = [] try: - exitCode = executeShCmd(cmd, test.config, cwd, results) + shenv = ShellEnvironment(cwd, test.config.environment) + exitCode = executeShCmd(cmd, shenv, results) except InternalShellError: e = sys.exc_info()[1] exitCode = 127 -- 2.34.1