summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam J. Stewart <ajstewart426@gmail.com>2020-03-31 18:57:14 -0500
committerTodd Gamblin <tgamblin@llnl.gov>2020-04-15 12:38:31 -0700
commitc6c1d01ab6b9dd9975d2e9171c8183d6f921cb21 (patch)
tree8ff2e68cd6e99dc2c62916efc9ab2c5c9bfb340f
parentb9688a8c35cd2b64a6ad2d2e3157267cda71fc6c (diff)
downloadspack-c6c1d01ab6b9dd9975d2e9171c8183d6f921cb21.tar.gz
spack-c6c1d01ab6b9dd9975d2e9171c8183d6f921cb21.tar.bz2
spack-c6c1d01ab6b9dd9975d2e9171c8183d6f921cb21.tar.xz
spack-c6c1d01ab6b9dd9975d2e9171c8183d6f921cb21.zip
Allow Spack Environments with '-h' in the name (#15429)
If a user invoked "spack env activate example-henv", Spack would mistakenly interpret the "-h" from "example-henv" as the "-h" option. This commit allows users to create and activate environments with "-h" in the name. This issue existed for bash shell support as well as csh support, and this commit addresses both, along with some other unrelated csh support issues.
-rw-r--r--share/spack/csh/spack.csh46
-rwxr-xr-xshare/spack/setup-env.sh49
2 files changed, 63 insertions, 32 deletions
diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh
index b4d963ae10..7a51050281 100644
--- a/share/spack/csh/spack.csh
+++ b/share/spack/csh/spack.csh
@@ -66,7 +66,7 @@ case cd:
[ $#_sp_args -gt 0 ] && set _sp_arg = ($_sp_args[1])
shift _sp_args
- if ( "$_sp_arg" == "-h" ) then
+ if ( "$_sp_arg" == "-h" || "$_sp_args" == "--help" ) then
\spack cd -h
else
cd `\spack location $_sp_arg $_sp_args`
@@ -78,7 +78,7 @@ case env:
set _sp_arg=""
[ $#_sp_args -gt 0 ] && set _sp_arg = ($_sp_args[1])
- if ( "$_sp_arg" == "-h" ) then
+ if ( "$_sp_arg" == "-h" || "$_sp_arg" == "--help" ) then
\spack env -h
else
switch ($_sp_arg)
@@ -86,12 +86,18 @@ case env:
set _sp_env_arg=""
[ $#_sp_args -gt 1 ] && set _sp_env_arg = ($_sp_args[2])
- if ( "$_sp_env_arg" == "" || "$_sp_args" =~ "*--sh*" || "$_sp_args" =~ "*--csh*" || "$_sp_args" =~ "*-h*" ) then
- # no args or args contain -h/--help, --sh, or --csh: just execute
+ # Space needed here to differentiate between `-h`
+ # argument and environments with "-h" in the name.
+ if ( "$_sp_env_arg" == "" || \
+ "$_sp_args" =~ "* --sh*" || \
+ "$_sp_args" =~ "* --csh*" || \
+ "$_sp_args" =~ "* -h*" || \
+ "$_sp_args" =~ "* --help*" ) then
+ # No args or args contain --sh, --csh, or -h/--help: just execute.
\spack $_sp_flags env $_sp_args
else
shift _sp_args # consume 'activate' or 'deactivate'
- # actual call to activate: source the output
+ # Actual call to activate: source the output.
eval `\spack $_sp_flags env activate --csh $_sp_args`
endif
breaksw
@@ -99,30 +105,40 @@ case env:
set _sp_env_arg=""
[ $#_sp_args -gt 1 ] && set _sp_env_arg = ($_sp_args[2])
- if ( "$_sp_env_arg" != "" ) then
- # with args: execute the command
+ # Space needed here to differentiate between `--sh`
+ # argument and environments with "--sh" in the name.
+ if ( "$_sp_args" =~ "* --sh*" || \
+ "$_sp_args" =~ "* --csh*" ) then
+ # Args contain --sh or --csh: just execute.
\spack $_sp_flags env $_sp_args
+ else if ( "$_sp_env_arg" != "" ) then
+ # Any other arguments are an error or -h/--help: just run help.
+ \spack $_sp_flags env deactivate -h
else
- # no args: source the output
+ # No args: source the output of the command.
eval `\spack $_sp_flags env deactivate --csh`
endif
breaksw
default:
- echo default
\spack $_sp_flags env $_sp_args
breaksw
endsw
endif
+ breaksw
+
case load:
case unload:
- # Space in `-h` portion is important for differentiating -h option
- # from variants that begin with "h" or packages with "-h" in name
- if ( "$_sp_spec" =~ "*--sh*" || "$_sp_spec" =~ "*--csh*" || \
- " $_sp_spec" =~ "* -h*" || "$_sp_spec" =~ "*--help*") then
- # IF a shell is given, print shell output
+ # Get --sh, --csh, -h, or --help arguments.
+ # Space needed here to differentiate between `-h`
+ # argument and specs with "-h" in the name.
+ if ( " $_sp_spec" =~ "* --sh*" || \
+ " $_sp_spec" =~ "* --csh*" || \
+ " $_sp_spec" =~ "* -h*" || \
+ " $_sp_spec" =~ "* --help*") then
+ # Args contain --sh, --csh, or -h/--help: just execute.
\spack $_sp_flags $_sp_subcommand $_sp_spec
else
- # otherwise eval with csh
+ # Otherwise, eval with csh.
eval `\spack $_sp_flags $_sp_subcommand --csh $_sp_spec || \
echo "exit 1"`
endif
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index c3d9ef260c..5968c4c016 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -115,31 +115,44 @@ spack() {
else
case $_sp_arg in
activate)
- _a="$@"
+ # Get --sh, --csh, or -h/--help arguments.
+ # Space needed here becauses regexes start with a space
+ # and `-h` may be the only argument.
+ _a=" $@"
+ # Space needed here to differentiate between `-h`
+ # argument and environments with "-h" in the name.
+ # Also see: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion
if [ -z ${1+x} ] || \
- [ "${_a#*--sh}" != "$_a" ] || \
- [ "${_a#*--csh}" != "$_a" ] || \
- [ "${_a#*-h}" != "$_a" ];
+ [ "${_a#* --sh}" != "$_a" ] || \
+ [ "${_a#* --csh}" != "$_a" ] || \
+ [ "${_a#* -h}" != "$_a" ] || \
+ [ "${_a#* --help}" != "$_a" ];
then
- # no args or args contain -h/--help, --sh, or --csh: just execute
+ # No args or args contain --sh, --csh, or -h/--help: just execute.
command spack env activate "$@"
else
- # actual call to activate: source the output
+ # Actual call to activate: source the output.
eval $(command spack $_sp_flags env activate --sh "$@")
fi
;;
deactivate)
- _a="$@"
- if [ "${_a#*--sh}" != "$_a" ] || \
- [ "${_a#*--csh}" != "$_a" ];
+ # Get --sh, --csh, or -h/--help arguments.
+ # Space needed here becauses regexes start with a space
+ # and `-h` may be the only argument.
+ _a=" $@"
+ # Space needed here to differentiate between `--sh`
+ # argument and environments with "--sh" in the name.
+ # Also see: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion
+ if [ "${_a#* --sh}" != "$_a" ] || \
+ [ "${_a#* --csh}" != "$_a" ];
then
- # just execute the command if --sh or --csh are provided
+ # Args contain --sh or --csh: just execute.
command spack env deactivate "$@"
elif [ -n "$*" ]; then
- # any other arguments are an error or help, so just run help
+ # Any other arguments are an error or -h/--help: just run help.
command spack env deactivate -h
else
- # no args: source the output of the command
+ # No args: source the output of the command.
eval $(command spack $_sp_flags env deactivate --sh)
fi
;;
@@ -151,17 +164,19 @@ spack() {
return
;;
"load"|"unload")
- # get --sh, --csh, --help, or -h arguments
- # space is important for -h case to differentiate between `-h`
- # argument and specs with "-h" in package name or variant settings
+ # Get --sh, --csh, -h, or --help arguments.
+ # Space needed here becauses regexes start with a space
+ # and `-h` may be the only argument.
_a=" $@"
+ # Space needed here to differentiate between `-h`
+ # argument and specs with "-h" in the name.
+ # Also see: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion
if [ "${_a#* --sh}" != "$_a" ] || \
[ "${_a#* --csh}" != "$_a" ] || \
[ "${_a#* -h}" != "$_a" ] || \
[ "${_a#* --help}" != "$_a" ];
then
- # just execute the command if --sh or --csh are provided
- # or if the -h or --help arguments are provided
+ # Args contain --sh, --csh, or -h/--help: just execute.
command spack $_sp_flags $_sp_subcommand "$@"
else
eval $(command spack $_sp_flags $_sp_subcommand --sh "$@" || \