Deactivate previous env before activating new one (#25409)

* Deactivate previous env before activating new one

Currently on develop you can run `spack env activate` multiple times to switch
between environments, but they leave traces, even though Spack only supports
one active environment at a time.

Currently:

```console
$ spack env create a
$ spack env create b
$ spack env activate -p a
[a] $ spack env activate -p b
[b] [a] $ spack env activate -p b
[a] [b] [a] $ spack env activate -p a
[a] [b] [c] $ echo $MANPATH | tr ":" "\n"
/path/to/environments/a/.spack-env/view/share/man
/path/to/environments/a/.spack-env/view/man
/path/to/environments/b/.spack-env/view/share/man
/path/to/environments/b/.spack-env/view/man
```

This PR fixes that:

```console
$ spack env activate -p a
[a] $ spack env activate -p b
[b] $ spack env activate -p a
[a] $ echo $MANPATH | tr ":" "\n"
/path/to/environments/a/.spack-env/view/share/man
/path/to/environments/a/.spack-env/view/man
```
This commit is contained in:
Harmen Stoppels
2021-10-28 20:39:25 +02:00
committed by GitHub
parent 87e456d59c
commit 6d030ba137
5 changed files with 108 additions and 22 deletions

View File

@@ -88,7 +88,7 @@ end
function spt_succeeds
printf "'$argv' succeeds ... "
set -l output (eval $argv 2>&1)
set -l output ($argv 2>&1)
# Save the command result
set cmd_status $status
@@ -115,7 +115,7 @@ end
function spt_fails
printf "'$argv' fails ... "
set -l output (eval $argv 2>&1)
set -l output ($argv 2>&1)
if test $status -eq 0
fail
@@ -143,7 +143,7 @@ function spt_contains
printf "'$remaining_args' output contains '$target_string' ... "
set -l output (eval $remaining_args 2>&1)
set -l output ($remaining_args 2>&1)
# Save the command result
set cmd_status $status
@@ -166,6 +166,41 @@ function spt_contains
end
#
# Ensure that a string is not in the output of a command. The command must have a 0 exit
# status to guard against false positives. Suppresses output on success.
# On failure, echo the exit code and output.
#
function spt_does_not_contain
set -l target_string $argv[1]
set -l remaining_args $argv[2..-1]
printf "'$remaining_args' does not contain '$target_string' ... "
set -l output ($remaining_args 2>&1)
# Save the command result
set cmd_status $status
if test $cmd_status -ne 0
fail
echo_red "Command exited with error $cmd_status."
else if not echo "$output" | string match -q -r ".*$target_string.*"
pass
return
else
fail
echo_red "'$target_string' was in the output."
end
if test -n "$output"
echo_msg "Output:"
echo "$output"
else
echo_msg "No output."
end
end
#
# Ensure that a variable is set.
#
@@ -255,12 +290,13 @@ spack -m install --fake a
# create a test environment for testing environment commands
echo "Creating a mock environment"
spack env create spack_test_env
spack env create spack_test_2_env
# ensure that we uninstall b on exit
function spt_cleanup -p %self
echo "Removing test environment before exiting."
spack env deactivate 2>&1 > /dev/null
spack env rm -y spack_test_env
spack env rm -y spack_test_env spack_test_2_env
title "Cleanup"
echo "Removing test packages before exiting."
@@ -366,6 +402,12 @@ is_set SPACK_ENV
spack env deactivate
is_not_set SPACK_ENV
echo "Testing spack env activate repeatedly"
spack env activate spack_test_env
spack env activate spack_test_2_env
spt_contains 'spack_test_2_env' 'fish' '-c' 'echo $PATH'
spt_does_not_contain 'spack_test_env' 'fish' '-c' 'echo $PATH'
#
# NOTE: `--prompt` on fish does nothing => currently not implemented.
#

View File

@@ -70,13 +70,13 @@ b_module=$(spack -m module tcl find b)
# Create a test environment for testing environment commands
echo "Creating a mock environment"
spack env create spack_test_env
test_env_location=$(spack location -e spack_test_env)
spack env create spack_test_2_env
# Ensure that we uninstall b on exit
cleanup() {
echo "Removing test environment before exiting."
spack env deactivate 2>&1 > /dev/null
spack env rm -y spack_test_env
spack env rm -y spack_test_env spack_test_2_env
title "Cleanup"
echo "Removing test packages before exiting."
@@ -178,4 +178,10 @@ echo "Testing 'spack env activate --temp'"
spack env activate --temp
is_set SPACK_ENV
spack env deactivate
is_not_set SPACK_ENV
is_not_set SPACK_ENV
echo "Testing spack env activate repeatedly"
spack env activate spack_test_env
spack env activate spack_test_2_env
contains "spack_test_2_env" sh -c 'echo $PATH'
does_not_contain "spack_test_env" sh -c 'echo $PATH'

View File

@@ -132,6 +132,36 @@ contains() {
fi
}
#
# Ensure that a string is not in the output of a command. The command must have a 0 exit
# status to guard against false positives. Suppresses output on success.
# On failure, echo the exit code and output.
#
does_not_contain() {
string="$1"
shift
printf "'%s' output does not contain '$string' ... " "$*"
output=$("$@" 2>&1)
err="$?"
if [ "$err" != 0 ]; then
fail
elif [ "${output#*$string}" = "${output}" ]; then
pass
return
else
fail
echo_red "'$string' was in the output."
fi
if [ -n "$output" ]; then
echo_msg "Output:"
echo "$output"
else
echo_msg "No output."
fi
}
#
# Ensure that a variable is set.
#