<div dir="rtl"><div dir="ltr">Thanks!</div></div><div class="gmail_extra"><br><div class="gmail_quote"><div dir="ltr">2015-07-20 22:42 GMT+03:00 Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span>:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rnk<br>
Date: Mon Jul 20 14:42:08 2015<br>
New Revision: 242696<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D242696-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Y-IQF15Hm9EQMIQ9mOq5_ZCakDaOfNkvVKLjOlTGGZM&s=qInrzHTFVHfxAWTvk2moF3SkefKtN0eRF3iteiqzZ0o&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=242696&view=rev</a><br>
Log:<br>
[lit] Implement 'env' in the internal shell<br>
<br>
The MSys 2 version of 'env' cannot be used to set 'TZ' in the<br>
environment due to some portability hacks in the process spawning<br>
compatibility layer[1]. This affects test/Object/archive-toc.test, which<br>
tries to set TZ in the environment.<br>
<br>
Other than that, this saves a subprocess invocation of a small unix<br>
utility, which is makes the tests faster.<br>
<br>
The internal shell does not support shell variable expansion, so this<br>
idiom in the ASan tests isn't supported yet:<br>
  RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:opt=1 ...<br>
<br>
[1] <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_Alexpux_MSYS2-2Dpackages_issues_294&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Y-IQF15Hm9EQMIQ9mOq5_ZCakDaOfNkvVKLjOlTGGZM&s=qugao274e44eyYO2dRJjtifba2oR7RePz-N6qZUSWUo&e=" rel="noreferrer" target="_blank">https://github.com/Alexpux/MSYS2-packages/issues/294</a><br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11350&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Y-IQF15Hm9EQMIQ9mOq5_ZCakDaOfNkvVKLjOlTGGZM&s=1BSBHy1Uiv-HNrK4kYne-bHKLQPyFyPF2dX85do11vM&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11350</a><br>
<br>
Modified:<br>
    llvm/trunk/utils/lit/lit/TestRunner.py<br>
<br>
Modified: llvm/trunk/utils/lit/lit/TestRunner.py<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_utils_lit_lit_TestRunner.py-3Frev-3D242696-26r1-3D242695-26r2-3D242696-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Y-IQF15Hm9EQMIQ9mOq5_ZCakDaOfNkvVKLjOlTGGZM&s=D6Q3DZWfYer-duR4j_G8Hkxn-i80WGENyY4OXgfGV2M&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/TestRunner.py?rev=242696&r1=242695&r2=242696&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/lit/lit/TestRunner.py (original)<br>
+++ llvm/trunk/utils/lit/lit/TestRunner.py Mon Jul 20 14:42:08 2015<br>
@@ -31,7 +31,7 @@ class ShellEnvironment(object):<br>
<br>
     def __init__(self, cwd, env):<br>
         self.cwd = cwd<br>
-        self.env = env<br>
+        self.env = dict(env)<br>
<br>
 def executeShCmd(cmd, shenv, results):<br>
     if isinstance(cmd, ShUtil.Seq):<br>
@@ -62,14 +62,18 @@ def executeShCmd(cmd, shenv, results):<br>
<br>
     # Handle shell builtins first.<br>
     if cmd.commands[0].args[0] == 'cd':<br>
-        # Update the cwd in the environment.<br>
+        if len(cmd.commands) != 1:<br>
+            raise ValueError("'cd' cannot be part of a pipeline")<br>
         if len(cmd.commands[0].args) != 2:<br>
-            raise ValueError('cd supports only one argument')<br>
+            raise ValueError("'cd' supports only one argument")<br>
         newdir = cmd.commands[0].args[1]<br>
+        # Update the cwd in the parent environment.<br>
         if os.path.isabs(newdir):<br>
             shenv.cwd = newdir<br>
         else:<br>
             shenv.cwd = os.path.join(shenv.cwd, newdir)<br>
+        # The cd builtin always succeeds. If the directory does not exist, the<br>
+        # following Popen calls will fail instead.<br>
         return 0<br>
<br>
     procs = []<br>
@@ -81,6 +85,23 @@ def executeShCmd(cmd, shenv, results):<br>
     # output. This is null until we have seen some output using<br>
     # stderr.<br>
     for i,j in enumerate(cmd.commands):<br>
+        # Reference the global environment by default.<br>
+        cmd_shenv = shenv<br>
+        if j.args[0] == 'env':<br>
+            # Create a copy of the global environment and modify it for this one<br>
+            # command. There might be multiple envs in a pipeline:<br>
+            #   env FOO=1 llc < %s | env BAR=2 llvm-mc | FileCheck %s<br>
+            cmd_shenv = ShellEnvironment(shenv.cwd, shenv.env)<br>
+            arg_idx = 1<br>
+            for arg_idx, arg in enumerate(j.args[1:]):<br>
+                # Partition the string into KEY=VALUE.<br>
+                key, eq, val = arg.partition('=')<br>
+                # Stop if there was no equals.<br>
+                if eq == '':<br>
+                    break<br>
+                cmd_shenv.env[key] = val<br>
+            j.args = j.args[arg_idx+1:]<br>
+<br>
         # Apply the redirections, we use (N,) as a sentinel to indicate stdin,<br>
         # stdout, stderr for N equal to 0, 1, or 2 respectively. Redirects to or<br>
         # from a file are represented with a list [file, mode, file-object]<br>
@@ -126,7 +147,7 @@ def executeShCmd(cmd, shenv, results):<br>
                         r[2] = tempfile.TemporaryFile(mode=r[1])<br>
                     else:<br>
                         # Make sure relative paths are relative to the cwd.<br>
-                        redir_filename = os.path.join(shenv.cwd, r[0])<br>
+                        redir_filename = os.path.join(cmd_shenv.cwd, r[0])<br>
                         r[2] = open(redir_filename, r[1])<br>
                     # Workaround a Win32 and/or subprocess bug when appending.<br>
                     #<br>
@@ -157,7 +178,7 @@ def executeShCmd(cmd, shenv, results):<br>
<br>
         # Resolve the executable path ourselves.<br>
         args = list(j.args)<br>
-        executable = lit.util.which(args[0], shenv.env['PATH'])<br>
+        executable = lit.util.which(args[0], cmd_shenv.env['PATH'])<br>
         if not executable:<br>
             raise InternalShellError(j, '%r: command not found' % j.args[0])<br>
<br>
@@ -171,12 +192,12 @@ def executeShCmd(cmd, shenv, results):<br>
                     args[i] = <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__f.name&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Y-IQF15Hm9EQMIQ9mOq5_ZCakDaOfNkvVKLjOlTGGZM&s=JaLiEVBRKDNZgd9n0MpAvehryE_95wJSfGmDapxkrVw&e=" rel="noreferrer" target="_blank">f.name</a><br>
<br>
         try:<br>
-            procs.append(subprocess.Popen(args, cwd=shenv.cwd,<br>
+            procs.append(subprocess.Popen(args, cwd=cmd_shenv.cwd,<br>
                                           executable = executable,<br>
                                           stdin = stdin,<br>
                                           stdout = stdout,<br>
                                           stderr = stderr,<br>
-                                          env = shenv.env,<br>
+                                          env = cmd_shenv.env,<br>
                                           close_fds = kUseCloseFDs))<br>
         except OSError as e:<br>
             raise InternalShellError(j, 'Could not create process due to {}'.format(e))<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>