Allow command access to dump/pickle_environment from #8476 (#11434)

* Allow command access to dump/pickle_environment from #8476
This commit is contained in:
Chris Green 2019-05-16 19:15:33 -05:00 committed by Greg Becker
parent f90507a227
commit b9370bf20b
2 changed files with 56 additions and 7 deletions

View File

@ -12,17 +12,33 @@
import spack.build_environment as build_environment
import spack.cmd
import spack.cmd.common.arguments as arguments
from spack.util.environment import dump_environment, pickle_environment
description = "show install environment for a spec, and run commands"
description = "run a command in a spec's install environment, " \
"or dump its environment to screen or file"
section = "build"
level = "long"
def setup_parser(subparser):
arguments.add_common_arguments(subparser, ['clean', 'dirty'])
subparser.add_argument(
'--dump', metavar="FILE",
help="dump a source-able environment to FILE"
)
subparser.add_argument(
'--pickle', metavar="FILE",
help="dump a pickled source-able environment to FILE"
)
subparser.add_argument(
'spec', nargs=argparse.REMAINDER,
metavar='spec [--] [cmd]...',
help="specs of package environment to emulate")
subparser.epilog\
= 'If a command is not specified, the environment will be printed ' \
'to standard output (cf /usr/bin/env) unless --dump and/or --pickle ' \
'are specified.\n\nIf a command is specified and spec is ' \
'multi-word, then the -- separator is obligatory.'
def build_env(parser, args):
@ -49,11 +65,23 @@ def build_env(parser, args):
build_environment.setup_package(spec.package, args.dirty)
if not cmd:
# If no command act like the "env" command and print out env vars.
if args.dump:
# Dump a source-able environment to a text file.
tty.msg("Dumping a source-able environment to {0}".format(args.dump))
dump_environment(args.dump)
if args.pickle:
# Dump a source-able environment to a pickle file.
tty.msg(
"Pickling a source-able environment to {0}".format(args.pickle))
pickle_environment(args.pickle)
if cmd:
# Execute the command with the new environment
os.execvp(cmd[0], cmd)
elif not bool(args.pickle or args.dump):
# If no command or dump/pickle option act like the "env" command
# and print out env vars.
for key, val in os.environ.items():
print("%s=%s" % (key, val))
else:
# Otherwise execute the command with the new environment
os.execvp(cmd[0], cmd)

View File

@ -3,6 +3,7 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from six.moves import cPickle
import pytest
from spack.main import SpackCommand, SpackCommandError
@ -27,3 +28,23 @@ def test_it_just_runs(pkg):
def test_it_just_fails(pkg, error_cls):
with pytest.raises(error_cls):
info(pkg)
_out_file = 'env.out'
@pytest.mark.usefixtures('config')
def test_dump(tmpdir):
with tmpdir.as_cwd():
info('--dump', _out_file, 'zlib')
with open(_out_file) as f:
assert(any(line.startswith('PATH=') for line in f.readlines()))
@pytest.mark.usefixtures('config')
def test_pickle(tmpdir):
with tmpdir.as_cwd():
info('--pickle', _out_file, 'zlib')
environment = cPickle.load(open(_out_file, 'rb'))
assert(type(environment) == dict)
assert('PATH' in environment)