Skip to content

Commit 7f5b281

Browse files
committed
Update conda environment if its outdated compared to the environment.yml
1 parent 7b735b0 commit 7f5b281

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

scripts/activateCondaEnvironment.sh

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,34 @@ set -o errexit -o pipefail
1717
# CDPATH reduces the scope of the cd command to potentially prevent unintended directory changes.
1818
# This way non-standard tools like readlink aren't needed.
1919
SCRIPTS_DIR=${SCRIPTS_DIR:-$( CDPATH=. cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P )} # Repository directory containing the shell scripts
20-
echo "activateCondaEnvironment: SCRIPTS_DIR=$SCRIPTS_DIR"
20+
echo "activateCondaEnvironment: SCRIPTS_DIR=${SCRIPTS_DIR}"
2121

2222
# Get the "jupyter" directory by taking the path of this script and going two directory up and then to "jupyter".
2323
JUPYTER_NOTEBOOK_DIRECTORY=${JUPYTER_NOTEBOOK_DIRECTORY:-"${SCRIPTS_DIR}/../jupyter"} # Repository directory containing the Jupyter Notebooks
24-
echo "activateCondaEnvironment: JUPYTER_NOTEBOOK_DIRECTORY=$JUPYTER_NOTEBOOK_DIRECTORY"
24+
echo "activateCondaEnvironment: JUPYTER_NOTEBOOK_DIRECTORY=${JUPYTER_NOTEBOOK_DIRECTORY}"
25+
26+
# Get the file name of the environment description file for the conda package and environment manager
27+
# that contains all dependencies and their versions.
28+
CONDA_ENVIRONMENT_FILE=${CONDA_ENVIRONMENT_FILE:-"${JUPYTER_NOTEBOOK_DIRECTORY}/environment.yml"} # Conda (package manager for Python) environment file path
29+
if [ ! -f "${CONDA_ENVIRONMENT_FILE}" ] ; then
30+
echo "activateCondaEnvironment: Couldn't find environment file ${CONDA_ENVIRONMENT_FILE}."
31+
exit 2
32+
fi
2533

2634
# Define conda environment to use for code structure analysis. Default "codegraph"
2735
CODEGRAPH_CONDA_ENVIRONMENT=${CODEGRAPH_CONDA_ENVIRONMENT:-"codegraph"} # Name of the conda environment to use for code graph analysis
2836
echo "activateCondaEnvironment: CONDA_PREFIX=${CONDA_PREFIX}"
2937
echo "activateCondaEnvironment: Current conda environment=${CONDA_DEFAULT_ENV}"
3038
echo "activateCondaEnvironment: Target conda environment=${CODEGRAPH_CONDA_ENVIRONMENT}"
3139

32-
if [ "${CONDA_DEFAULT_ENV}" = "${CODEGRAPH_CONDA_ENVIRONMENT}" ] ; then
33-
echo "activateCondaEnvironment: Skipping activation. Target conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} is already activated."
34-
# "return" needs to be used here instead of "exit".
35-
# This script is included in another script by using "source".
36-
# "exit" would end the main script, "return" just ends this sub script.
37-
return 0
38-
fi
40+
# TODO Find out, if conda updates (when needed) should also be done here instead of just returning 0.
41+
# if [ "${CONDA_DEFAULT_ENV}" = "${CODEGRAPH_CONDA_ENVIRONMENT}" ] ; then
42+
# echo "activateCondaEnvironment: Skipping activation. Target conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} is already activated."
43+
# # "return" needs to be used here instead of "exit".
44+
# # This script is included in another script by using "source".
45+
# # "exit" would end the main script, "return" just ends this sub script.
46+
# return 0
47+
# fi
3948

4049
# Include operation system function to for example detect Windows.
4150
source "${SCRIPTS_DIR}/operatingSystemFunctions.sh"
@@ -60,18 +69,24 @@ echo "activateCondaEnvironment: scriptExtension=${scriptExtension}"
6069
eval "$(${pathToConda}conda${scriptExtension} shell.bash hook)"
6170
echo "activateCondaEnvironment: Current conda environment after shell hook=${CONDA_DEFAULT_ENV}"
6271

63-
# Create (if missing) and activate Conda environment for code structure graph analysis
64-
if { "${pathToConda}conda" env list | grep "${CODEGRAPH_CONDA_ENVIRONMENT} "; } >/dev/null 2>&1; then
65-
echo "activateCondaEnvironment: Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} already created"
66-
else
67-
if [ ! -f "${JUPYTER_NOTEBOOK_DIRECTORY}/environment.yml" ] ; then
68-
echo "activateCondaEnvironment: Couldn't find environment file ${JUPYTER_NOTEBOOK_DIRECTORY}/environment.yml."
69-
exit 2
72+
# If missing, create Conda environment for code graph analysis
73+
# Note: The curly braces are grouping the outputs of both (piped) operations together to suppress them later (dev/null).
74+
if "${pathToConda}conda" env list | grep "${CODEGRAPH_CONDA_ENVIRONMENT} " >/dev/null 2>&1; then
75+
echo "activateCondaEnvironment: Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} has already been created."
76+
77+
# Check if the declaration in the environment file matches the actual environment to find out if it needs to be updated.
78+
if "${pathToConda}conda" compare --name "${CODEGRAPH_CONDA_ENVIRONMENT}" "${CONDA_ENVIRONMENT_FILE}" >/dev/null 2>&1; then
79+
echo "activateCondaEnvironment: Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} is up-to-date."
80+
else
81+
echo "activateCondaEnvironment: Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT} needs to be updated."
82+
"${pathToConda}conda" env update --file "${CONDA_ENVIRONMENT_FILE}" --name ${CODEGRAPH_CONDA_ENVIRONMENT} --prune
7083
fi
71-
echo "activateCondaEnvironment: Creating Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT}"
72-
"${pathToConda}conda" env create --file "${JUPYTER_NOTEBOOK_DIRECTORY}/environment.yml" --name "${CODEGRAPH_CONDA_ENVIRONMENT}"
84+
else
85+
echo "activateCondaEnvironment: Creating Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT}..."
86+
"${pathToConda}conda" env create --file "${CONDA_ENVIRONMENT_FILE}" --name "${CODEGRAPH_CONDA_ENVIRONMENT}"
7387
fi
7488

89+
# Activate code graph Conda environment
7590
echo "activateCondaEnvironment: Activating Conda environment ${CODEGRAPH_CONDA_ENVIRONMENT}"
7691
"${pathToConda}conda" activate ${CODEGRAPH_CONDA_ENVIRONMENT}
7792

0 commit comments

Comments
 (0)