lit: Add 'cd' support to the internal shell and port some tests
authorReid Kleckner <reid@kleckner.net>
Mon, 2 Mar 2015 21:33:18 +0000 (21:33 +0000)
committerReid Kleckner <reid@kleckner.net>
Mon, 2 Mar 2015 21:33:18 +0000 (21:33 +0000)
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
test/Object/archive-delete.test
test/Object/archive-extract-dir.test
test/Object/archive-format.test
test/Object/archive-move.test
test/Object/archive-update.test
test/Object/extract.ll
test/Object/nm-trivial-object.test
test/tools/llvm-cov/llvm-cov.test
utils/lit/lit/TestRunner.py

index 877870670061b496377e017286d864e0d9987d1d..a159797856c8783a53b192d92cc0ddb9dca8747a 100644 (file)
@@ -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
 
index 552b0e709f61498d74d19e904d3c2a1e650c3d76..c8530beafce4013190ce050b613966da945feeb0 100644 (file)
@@ -1,7 +1,5 @@
 Test the 'd' operation in llvm-ar
 
-REQUIRES: shell
-
 RUN: cd %T
 
 RUN: rm -f %t.a
index c718f90275b653a001cf0df51443ff15f1cda058..5182a2f91411007d86427ef2835f32e5210ce740 100644 (file)
@@ -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
index 20ac1a0d78fb867e4bdf1bf04aca58bb696c8ebc..236a181139a83545229e632738f9d16a2e6ade03 100644 (file)
@@ -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
 
index 0378e9111a96559dfeb4318904b64577c62ccfa4..adc114994d2826e83b0052d002187ab6464d8b0b 100644 (file)
@@ -1,7 +1,5 @@
 Test the 'm' operation in llvm-ar
 
-REQUIRES: shell
-
 RUN: cd %T
 
 RUN: rm -f %t.a
index 20286d2669ad80bc99f4469fd363f6e6b56f05c8..91ca8102c7e122d15fdb46330029fbdae91d57f1 100644 (file)
@@ -1,7 +1,5 @@
 Test the 'u' option of llvm-ar
 
-REQUIRES: shell
-
 RUN: cd %T
 RUN: rm -f %t.a
 
index a4e76499ca6c993421dd6236bb895871e669a20c..8d77f09fe88c10bb51f27a3d2e4b11decc7269f1 100644 (file)
@@ -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
index 0135f2df3cb0a01d31248714e5362c059f3df530..c576c236fc0c7e25ff927aff034a1fb4652f33c4 100644 (file)
@@ -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
index 0d3eb6b8f81b4462c1b5e1bcc7cbac66406fbebc..6a71120c882328d4b88a7546232f7a2287789979 100644 (file)
@@ -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
index 268e46c38f7444b33d5768c160a9664f72e7e5a0..f1734eca37263f36ac060e1c42a59bd580836ee5 100644 (file)
@@ -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