# Copyright (C) 2012 Anaconda, Inc # SPDX-License-Identifier: BSD-3-Clause """CLI implementation for `conda export`. Dumps specified environment package specifications to the screen. """ from argparse import ( ArgumentParser, Namespace, _SubParsersAction, ) from ..common.configuration import YAML_EXTENSIONS from ..exceptions import CondaValueError def configure_parser(sub_parsers: _SubParsersAction, **kwargs) -> ArgumentParser: from ..auxlib.ish import dals from .helpers import add_parser_json, add_parser_prefix summary = "Export a given environment" description = summary epilog = dals( """ Examples:: conda export conda export --file FILE_NAME """ ) p = sub_parsers.add_parser( "export", help=summary, description=description, epilog=epilog, **kwargs, ) p.add_argument( "-c", "--channel", action="append", help="Additional channel to include in the export", ) p.add_argument( "--override-channels", action="store_true", help="Do not include .condarc channels", ) add_parser_prefix(p) p.add_argument( "-f", "--file", default=None, required=False, help=( "File name or path for the exported environment. " "Note: This will silently overwrite any existing file " "of the same name in the current directory." ), ) p.add_argument( "--no-builds", default=False, action="store_true", required=False, help="Remove build specification from dependencies", ) p.add_argument( "--ignore-channels", default=False, action="store_true", required=False, help="Do not include channel names with package names.", ) add_parser_json(p) p.add_argument( "--from-history", default=False, action="store_true", required=False, help="Build environment spec from explicit specs in history", ) p.set_defaults(func="conda.cli.main_export.execute") return p # TODO Make this aware of channels that were used to install packages def execute(args: Namespace, parser: ArgumentParser) -> int: from ..base.context import context, determine_target_prefix, env_name from ..env.env import from_environment from .common import stdout_json prefix = determine_target_prefix(context, args) env = from_environment( env_name(prefix), prefix, no_builds=args.no_builds, ignore_channels=args.ignore_channels, from_history=args.from_history, ) if args.override_channels: env.remove_channels() if args.channel is not None: env.add_channels(args.channel) if args.file is None: stdout_json(env.to_dict()) if args.json else print(env.to_yaml(), end="") else: filename = args.file # check for the proper file extension; otherwise when the export file is used later, # the user will get a file parsing error if not filename.endswith(YAML_EXTENSIONS): raise CondaValueError( f"Export files must have a valid extension {YAML_EXTENSIONS}: {filename}" ) fp = open(args.file, "wb") env.to_dict(stream=fp) if args.json else env.to_yaml(stream=fp) fp.close() return 0