File: C:/Users/fred/anaconda3/Lib/site-packages/conda_libmamba_solver/repoquery.py
# Copyright (C) 2019, QuantStack
# Copyright (C) 2022 Anaconda, Inc
# Copyright (C) 2023 conda
# SPDX-License-Identifier: BSD-3-Clause
import argparse
import json
import sys
from conda.base.context import context
from conda.cli import conda_argparse
from conda.common.io import Spinner
from conda.core.prefix_data import PrefixData
from libmambapy import QueryFormat
from .index import LibMambaIndexHelper
def configure_parser(parser: argparse.ArgumentParser):
package_cmds = argparse.ArgumentParser(add_help=False)
package_cmds.add_argument("package_query", help="The target package.")
package_grp = package_cmds.add_argument_group("Subcommand options")
package_grp.add_argument(
"-i",
"--installed",
action="store_true",
default=True,
help=argparse.SUPPRESS,
)
package_grp.add_argument(
"-p",
"--platform",
default=context.subdir,
help="Platform/subdir to search packages for. Defaults to current platform.",
)
package_grp.add_argument(
"--no-installed", action="store_true", help="Do not search currently installed packages."
)
package_grp.add_argument(
"--pretty", action="store_true", help="Prettier output with more details."
)
package_grp.add_argument(
"-a",
"--all-channels",
action="store_true",
help="Look at all channels (for depends / whoneeds).",
)
view_cmds = argparse.ArgumentParser(add_help=False)
view_grp = view_cmds.add_argument_group("Dependency options")
view_grp.add_argument(
"-t", "--tree", action="store_true", help="Show dependencies in a tree-like format."
)
view_grp.add_argument(
"--recursive", action="store_true", help="Show dependencies recursively."
)
subparser = parser.add_subparsers(dest="subcmd")
whoneeds = subparser.add_parser(
"whoneeds",
help="Show packages that depend on this package.",
parents=[package_cmds, view_cmds],
)
depends = subparser.add_parser(
"depends",
help="Show dependencies of this package.",
parents=[package_cmds, view_cmds],
)
search = subparser.add_parser(
"search",
help="Show all available package versions.",
parents=[package_cmds],
)
for cmd in (whoneeds, search, depends):
conda_argparse.add_parser_channels(cmd)
conda_argparse.add_parser_networking(cmd)
conda_argparse.add_parser_known(cmd)
conda_argparse.add_parser_json(cmd)
def repoquery(args):
if not args.subcmd:
print("repoquery needs a subcommand (search, depends or whoneeds), e.g.:", file=sys.stderr)
print(" conda repoquery search python\n", file=sys.stderr)
return 1
cli_flags = [getattr(args, attr, False) for attr in ("tree", "recursive", "pretty")]
if sum([context.json, *cli_flags]) > 1:
print("Use only one of --json, --tree, --recursive and --pretty.", file=sys.stderr)
return 1
if hasattr(args, "channel"):
channels = args.channel
else:
channels = None
if args.all_channels or (channels is None and args.subcmd == "search"):
if channels:
print("WARNING: Using all channels instead of configured channels\n", file=sys.stderr)
channels = context.channels
use_installed = args.installed
if args.no_installed:
use_installed = False
# if we're asking for depends and channels are given, disregard
# installed packages to prevent weird mixing
if args.subcmd in ("depends", "whoneeds") and use_installed and channels:
use_installed = False
if args.subcmd == "search" and not args.installed:
only_installed = False
elif args.all_channels or (channels and len(channels)):
only_installed = False
else:
only_installed = True
if only_installed and args.no_installed:
print("No channels selected. Use -a to search all channels.", file=sys.stderr)
return 1
if use_installed:
prefix_data = PrefixData(context.target_prefix)
prefix_data.load()
installed_records = prefix_data.iter_records()
else:
installed_records = ()
if context.json:
query_format = QueryFormat.JSON
elif getattr(args, "tree", None):
query_format = QueryFormat.TREE
elif getattr(args, "recursive", None):
query_format = QueryFormat.RECURSIVETABLE
elif getattr(args, "pretty", None):
query_format = QueryFormat.PRETTY
else:
query_format = QueryFormat.TABLE
with Spinner(
"Collecting package metadata",
enabled=not context.verbosity and not context.quiet,
json=context.json,
):
index = LibMambaIndexHelper(
installed_records=installed_records,
channels=channels,
subdirs=(args.platform, "noarch"),
repodata_fn=context.repodata_fns[-1],
query_format=query_format,
)
result = getattr(index, args.subcmd)(args.package_query, records=False)
if context.json:
print(json.dumps(result, indent=2))
else:
print(result)