123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- $CONDA_EXE = "/croot/conda_1689269889729/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_p/bin/conda"
- # Copyright (C) 2012 Anaconda, Inc
- # SPDX-License-Identifier: BSD-3-Clause
- # Much of this forked from https://github.com/gforsyth/xonda
- # Copyright (c) 2016, Gil Forsyth, All rights reserved.
- # Original code licensed under BSD-3-Clause.
- from xonsh.lazyasd import lazyobject
- if 'CONDA_EXE' not in ${...}:
- ![python -m conda init --dev out> conda-dev-init.sh]
- source-bash conda-dev-init.sh
- import os
- os.remove("conda-dev-init.sh")
- _REACTIVATE_COMMANDS = ('install', 'update', 'upgrade', 'remove', 'uninstall')
- @lazyobject
- def Env():
- from collections import namedtuple
- return namedtuple('Env', ['name', 'path', 'bin_dir', 'envs_dir'])
- def _parse_args(args=None):
- from argparse import ArgumentParser
- p = ArgumentParser(add_help=False)
- p.add_argument('command', nargs='?')
- p.add_argument('-h', '--help', dest='help', action='store_true', default=False)
- p.add_argument('-v', '--version', dest='version', action='store_true', default=False)
- ns, _ = p.parse_known_args(args)
- if ns.command == 'activate':
- p.add_argument('env_name_or_prefix', default='base')
- elif ns.command in _REACTIVATE_COMMANDS:
- p.add_argument('-n', '--name')
- p.add_argument('-p', '--prefix')
- parsed_args, _ = p.parse_known_args(args)
- return parsed_args
- def _raise_pipeline_error(pipeline):
- stdout = pipeline.out
- stderr = pipeline.err
- if pipeline.returncode != 0:
- message = ("exited with %s\nstdout: %s\nstderr: %s\n"
- "" % (pipeline.returncode, stdout, stderr))
- raise RuntimeError(message)
- return stdout.strip()
- def _conda_activate_handler(env_name_or_prefix):
- import os
- __xonsh__.execer.exec($($CONDA_EXE shell.xonsh activate @(env_name_or_prefix)),
- glbs=__xonsh__.ctx,
- filename="$(conda shell.xonsh activate " + env_name_or_prefix + ")")
- if $CONDA_DEFAULT_ENV != os.path.split(env_name_or_prefix)[1]:
- import sys as _sys
- print("WARNING: conda environment not activated properly. "
- "This is likely because you have a conda init inside of your "
- "~/.bashrc (unix) or *.bat activation file (windows). This is "
- "causing conda to activate twice in xonsh. Please remove the conda "
- "init block from your other shell.", file=_sys.stderr)
- def _conda_deactivate_handler():
- __xonsh__.execer.exec($($CONDA_EXE shell.xonsh deactivate),
- glbs=__xonsh__.ctx,
- filename="$(conda shell.xonsh deactivate)")
- def _conda_passthrough_handler(args):
- pipeline = ![$CONDA_EXE @(args)]
- _raise_pipeline_error(pipeline)
- def _conda_reactivate_handler(args, name_or_prefix_given):
- pipeline = ![$CONDA_EXE @(args)]
- _raise_pipeline_error(pipeline)
- if not name_or_prefix_given:
- __xonsh__.execer.exec($($CONDA_EXE shell.xonsh reactivate),
- glbs=__xonsh__.ctx,
- filename="$(conda shell.xonsh reactivate)")
- def _conda_main(args=None):
- parsed_args = _parse_args(args)
- if parsed_args.command == 'activate':
- _conda_activate_handler(parsed_args.env_name_or_prefix)
- elif parsed_args.command == 'deactivate':
- _conda_deactivate_handler()
- elif parsed_args.command in _REACTIVATE_COMMANDS:
- name_or_prefix_given = bool(parsed_args.name or parsed_args.prefix)
- _conda_reactivate_handler(args, name_or_prefix_given)
- else:
- _conda_passthrough_handler(args)
- if 'CONDA_SHLVL' not in ${...}:
- $CONDA_SHLVL = '0'
- import os as _os
- import sys as _sys
- _sys.path.insert(0, _os.path.join(_os.path.dirname(_os.path.dirname($CONDA_EXE)), "condabin"))
- del _os, _sys
- aliases['conda'] = _conda_main
- def _list_dirs(path):
- """Generator that lists the directories in a given path."""
- import os
- for entry in os.scandir(path):
- if not entry.name.startswith('.') and entry.is_dir():
- yield entry.name
- def _get_envs_unfiltered():
- """Grab a list of all conda env dirs from conda, allowing all warnings."""
- import os
- import importlib
- try:
- # breaking changes introduced in Anaconda 4.4.7
- # try to import newer library structure first
- context = importlib.import_module('conda.base.context')
- config = context.context
- except ModuleNotFoundError:
- config = importlib.import_module('conda.config')
- # create the list of environments
- env_list = []
- for envs_dir in config.envs_dirs:
- # skip non-existing environments directories
- if not os.path.exists(envs_dir):
- continue
- # for each environment in the environments directory
- for env_name in _list_dirs(envs_dir):
- # check for duplicates names
- if env_name in [env.name for env in env_list]:
- raise ValueError('Multiple environments with the same name '
- "in the system is not supported by conda's xonsh tools.")
- # add the environment to the list
- env_list.append(Env(name=env_name,
- path=os.path.join(envs_dir, env_name),
- bin_dir=os.path.join(envs_dir, env_name, 'bin'),
- envs_dir=envs_dir,
- ))
- return env_list
- def _get_envs():
- """Grab a list of all conda env dirs from conda, ignoring all warnings."""
- import warnings
- with warnings.catch_warnings():
- warnings.simplefilter("ignore")
- return _get_envs_unfiltered()
- def _conda_completer(prefix, line, start, end, ctx):
- """Completion for conda."""
- args = line.split(' ')
- possible = set()
- if len(args) == 0 or args[0] not in ['xonda', 'conda']:
- return None
- curix = args.index(prefix)
- if curix == 1:
- possible = {'activate', 'deactivate', 'install', 'remove', 'info',
- 'help', 'list', 'search', 'update', 'upgrade', 'uninstall',
- 'config', 'init', 'clean', 'package', 'bundle', 'env',
- 'select', 'create', '-h', '--help', '-V', '--version'}
- elif curix == 2:
- if args[1] in ['activate', 'select']:
- possible = set([env.name for env in _get_envs()])
- elif args[1] == 'create':
- possible = {'-p', '-n'}
- elif args[1] == 'env':
- possible = {'attach', 'create', 'export', 'list', 'remove',
- 'upload', 'update'}
- elif curix == 3:
- if args[2] == 'export':
- possible = {'-n', '--name'}
- elif args[2] == 'create':
- possible = {'-h', '--help', '-f', '--file', '-n', '--name', '-p',
- '--prefix', '-q', '--quiet', '--force', '--json',
- '--debug', '-v', '--verbose'}
- elif curix == 4:
- if args[2] == 'export' and args[3] in ['-n','--name']:
- possible = set([env.name for env in _get_envs()])
- return {i for i in possible if i.startswith(prefix)}
- # add _xonda_completer to list of completers
- __xonsh__.completers['conda'] = _conda_completer
- # bump to top of list
- __xonsh__.completers.move_to_end('conda', last=False)
|