<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>