Subject: bug#42920: conda 4.8.3 on guix cannot activate environments

From: Hugo Buddelmeijer <[email-masked]>
Date: Mon, 1 Mar 2021 19:50:13 +0100

Hi Ricardo et al.,

I've not yet looked into updating the conda package, but want to add a
small thing to the bug report, so it can easily be found.

Lines in the sourced conda.sh script like the one below won't work anymore
once the conda executable is wrapped in the guix shell script, because PS1
is eaten by the wrapper:

    "$CONDA_EXE" $_CE_M $_CE_CONDA

It is necessary to explicitly call bash in interactive mode to have PS1
available:

    bash --norc -i "$CONDA_EXE" $_CE_M $_CE_CONDA

However, that will add every executed line to the .bash_history file,
including very long "export PYTHONPATH" lines. This can be avoided by
explicitly setting the history file to nothing:

    HISTFILE= bash --norc -i "$CONDA_EXE" $_CE_M $_CE_CONDA

Cheers,
Hugo

On Tue, 25 Aug 2020 at 17:03, Hugo Buddelmeijer <[email-masked]>
wrote:

> Hi Ricardo,
>
> On Tue, 25 Aug 2020 at 14:35, Ricardo Wurmus <[email-masked]> wrote:
>
>>
>> > The problem with the prompt arises from step 4), because 'conda' has
>> bash
>> > as interpreter, and "non-interactive bashes go out of their way to unset
>> > PS1":
>> >
>> https://superuser.com/questions/663069/why-does-subshell-not-inherit-exported-variable-ps1
>> > https://tldp.org/HOWTO/Bash-Prompt-HOWTO/setps.html
>>
>> Good sleuthing!
>>
>> > So .conda.real never gets the PS1 variable and it disappears.
>
>
> I did some more experiments, and forcing the wrapper script to start in
> interactive mode solves the problem.
>
> `conda init` adds some things to `.bashrc`, in particular it `eval`s the
> output from `conda shell.bash hook`, which creates the `conda` bash
> function (and associated functions).
>
> The output from `conda shell.bash hook` seems to be based on
> `/etc/profile.d/conda.sh`:
>
> https://github.com/conda/conda/blob/master/conda/shell/etc/profile.d/conda.sh
> As in, it prefixes some environment variables and appends the activation
> of the base environment.
>
> Now if we replace all 5 occurances of
> "$CONDA_EXE" $_CE_M $_CE_CONDA
> in that file with
> bash --norc -i "$CONDA_EXE" $_CE_M $_CE_CONDA
> then everything works as expected.
>
> The -i is to enable interactive mode, preventing PS1 from being eaten.
> --norc is necessary to not source .bashrc.
> There are two occurences of "$CONDA_EXE" that should not be replaced,
> hence adding the CE variables.
>
> Would editing files like that be possible in a guix package script?
>
> It seems that it is only a simple sed replace on a single file. It is a
> bit hackish, because it adds knowledge to the package that a) there is a
> wrapper script and b) it is in bash.
>
> I have only experimented with it by copying the output off `conda
> shell.bash hook` to a file in my home directory and editing that. Maybe I
> can try to update the package too.
>
> Other options:
> - Use some other sh than bash, one that does not eat PS1, (e.g. dash) as
> wrapper script. I just verified that *all* wrappers on my machine are bash.
> However, some are using bash-minimal, so that means that there is a choice,
> so maybe switching shells is possible?
> - Somehow let conda work with another variable than PS1. Seems more
> complicated.
>
> Then what is left is updating `conda init` such that
> - it doesn't complain when it cannot edit files
> - it only uses paths in ~/.guix-profile
> but this is not essential to get conda to work.
>
> Cheers,
> Hugo
>
>