diff options
-rw-r--r-- | src/lib/core/conda.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/lib/core/conda.c b/src/lib/core/conda.c index 0e0161d..48ed6c4 100644 --- a/src/lib/core/conda.c +++ b/src/lib/core/conda.c @@ -266,24 +266,28 @@ int conda_activate(const char *root, const char *env_name) { return -1; } + // Fully activate conda and record its effect on the runtime environment + char command[PATH_MAX * 3]; + const char *conda_shlvl_str = getenv("CONDA_SHLVL"); + unsigned long conda_shlvl = 0; + if (conda_shlvl_str) { + conda_shlvl = strtol(conda_shlvl_str, NULL, 10); + } + if (conda_prepend_bin(root)) { remove(logfile); return -1; } - // Fully activate conda and record its effect on the runtime environment - char command[PATH_MAX * 3]; - const char *conda_shlvl = getenv("CONDA_SHLVL"); - if (conda_shlvl == NULL || strcmp(conda_shlvl, "0") == 0) { - // First-run initialization - snprintf(command, sizeof(command) - 1, "source %s; source %s; conda activate %s &>/dev/null; env -0", path_conda, path_mamba, env_name); - } else { - // Conda is already available and configured. - // Make calls directly to conda using conda's base interpreter. - // The shell functions generated by sourcing path_conda and path_mamba are extremely inconsistent - // in this environment. DO NOT USE THEM. - snprintf(command, sizeof(command) - 1, "$CONDA_PYTHON_EXE $CONDA_EXE activate %s &>/dev/null; env -0", env_name); - } + snprintf(command, sizeof(command) - 1, + "set -a\n" + "source %s\n" + "function __conda_exe (\n\t\"$CONDA_PYTHON_EXE\" \"$CONDA_EXE\" $_CE_M $_CE_CONDA \"$@\"\n)\n" + "source %s\n" + "%s\n" + "conda activate %s 1>&2\n" + "env -0\n", path_conda, path_mamba, conda_shlvl ? "conda deactivate" : ":", env_name); + int retval = shell(&proc, command); if (retval) { // it didn't work; drop out for cleanup |