Skip to content

Commit

Permalink
get root from environment variable
Browse files Browse the repository at this point in the history
  • Loading branch information
jan-janssen committed Jun 25, 2024
1 parent 2951b0a commit 06328bd
Showing 1 changed file with 54 additions and 3 deletions.
57 changes: 54 additions & 3 deletions conda_subprocess/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from subprocess import Popen as subprocess_Popen

from conda.auxlib.compat import shlex_split_unicode
from conda.base.context import context, validate_prefix_name
from conda.auxlib.ish import dals
from conda.base.context import context, _first_writable_envs_dir, ROOT_ENV_NAME, PREFIX_NAME_DISALLOWED_CHARS
from conda.exceptions import EnvironmentNameNotFound, CondaValueError
from conda.cli.common import validate_prefix
from conda.common.compat import encode_arguments, encode_environment, isiterable
from conda.common.path import expand
Expand Down Expand Up @@ -37,7 +39,7 @@ def Popen(
):
# create run script
script, command = wrap_subprocess_call(
root_prefix=os.path.abspath(os.path.join(os.environ["CONDA_EXE"], "..", "..")),
root_prefix=context.root_prefix,
prefix=validate_prefix(
prefix=_check_prefix(
prefix_name=prefix_name,
Expand Down Expand Up @@ -92,11 +94,60 @@ def _check_prefix(prefix_name=None, prefix_path=None):
elif prefix_path is not None:
return expand(prefix_path)
else:
return validate_prefix_name(prefix_name, ctx=context)
return _validate_prefix_name(prefix_name, ctx=context)


def _check_args(args):
if isinstance(args, str):
return args.split()
else:
return args


def _locate_prefix_by_name(name, envs_dirs=None):
"""Find the location of a prefix given a conda env name. If the location does not exist, an
error is raised.
"""
assert name
if name in (ROOT_ENV_NAME, "root"):
return context.root_prefix
if envs_dirs is None:
envs_dirs = context.envs_dirs
for envs_dir in envs_dirs:
if not os.path.isdir(envs_dir):
continue
prefix = os.path.join(envs_dir, name)
if os.path.isdir(prefix):
return os.path.abspath(prefix)
raise EnvironmentNameNotFound(name)


def _validate_prefix_name(prefix_name: str, ctx: context.Context, allow_base=True) -> str:
"""Run various validations to make sure prefix_name is valid"""
if PREFIX_NAME_DISALLOWED_CHARS.intersection(prefix_name):
raise CondaValueError(
dals(
f"""
Invalid environment name: {prefix_name!r}
Characters not allowed: {PREFIX_NAME_DISALLOWED_CHARS}
If you are specifying a path to an environment, the `-p`
flag should be used instead.
"""
)
)

if prefix_name in (ROOT_ENV_NAME, "root"):
if allow_base:
return ctx.root_prefix
else:
raise CondaValueError(
"Use of 'base' as environment name is not allowed here."
)

else:
envs_dirs = context.envs_dirs
envs_dirs += [os.path.abspath(os.path.join(os.environ["CONDA_EXE"], "..", ".."))]
try:
return _locate_prefix_by_name(name=prefix_name, envs_dirs=envs_dirs)
except EnvironmentNameNotFound:
return os.path.join(_first_writable_envs_dir(), prefix_name)

0 comments on commit 06328bd

Please sign in to comment.