这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions conda/cli/conda_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -991,6 +991,10 @@ def configure_parser_list(sub_parsers):

conda list

List all packages in reverse order::

conda list --reverse

List all packages installed into the environment 'myenv'::

conda list -n myenv
Expand Down Expand Up @@ -1021,6 +1025,12 @@ def configure_parser_list(sub_parsers):
add_parser_prefix(p)
add_parser_json(p)
add_parser_show_channel_urls(p)
p.add_argument(
"--reverse",
action="store_true",
default=False,
help="List installed packages in reverse order.",
)
p.add_argument(
"-c",
"--canonical",
Expand Down
44 changes: 31 additions & 13 deletions conda/cli/main_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,25 @@ def get_packages(installed, regex):
yield prefix_rec


def list_packages(prefix, regex=None, format="human", show_channel_urls=None):
def list_packages(
prefix, regex=None, format="human", reverse=False, show_channel_urls=None
):
res = 0
result = []

if format == "human":
result.append("# packages in environment at %s:" % prefix)
result.append("#")
result.append("# %-23s %-15s %15s Channel" % ("Name", "Version", "Build"))

installed = sorted(
PrefixData(prefix, pip_interop_enabled=True).iter_records(),
key=lambda x: x.name,
)

packages = []
for prec in get_packages(installed, regex) if regex else installed:
if format == "canonical":
result.append(prec.dist_fields_dump() if context.json else prec.dist_str())
packages.append(
prec.dist_fields_dump() if context.json else prec.dist_str()
)
continue
if format == "export":
result.append("=".join((prec.name, prec.version, prec.build)))
packages.append("=".join((prec.name, prec.version, prec.build)))
continue

features = set(prec.get("features") or ())
Expand All @@ -61,7 +60,20 @@ def list_packages(prefix, regex=None, format="human", show_channel_urls=None):
and schannel != DEFAULTS_CHANNEL_NAME
):
disp += " %s" % schannel
result.append(disp)

packages.append(disp)

if reverse:
packages = reversed(packages)

result = []
if format == "human":
result = [
"# packages in environment at %s:" % prefix,
"#",
"# %-23s %-15s %15s Channel" % ("Name", "Version", "Build"),
]
result.extend(packages)

return res, result

Expand All @@ -70,6 +82,7 @@ def print_packages(
prefix,
regex=None,
format="human",
reverse=False,
piplist=False,
json=False,
show_channel_urls=None,
Expand All @@ -84,7 +97,11 @@ def print_packages(
print_export_header(context.subdir)

exitcode, output = list_packages(
prefix, regex, format=format, show_channel_urls=show_channel_urls
prefix,
regex,
format=format,
reverse=reverse,
show_channel_urls=show_channel_urls,
)
if context.json:
stdout_json(output)
Expand Down Expand Up @@ -145,15 +162,16 @@ def execute(args, parser):
format = "export"
else:
format = "human"

if context.json:
format = "canonical"

exitcode = print_packages(
return print_packages(
prefix,
regex,
format,
reverse=args.reverse,
piplist=args.pip,
json=context.json,
show_channel_urls=context.show_channel_urls,
)
return exitcode
3 changes: 3 additions & 0 deletions news/gh-11954-list-reverse
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Enhancements

* Added `conda list --reverse` to return a reversed list of installed packages. (#11954)
26 changes: 26 additions & 0 deletions tests/cli/test_main_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause
import json

from conda.testing.integration import Commands, make_temp_env, run_command


# conda list
def test_list():
pkg = "ca-certificates" # has no dependencies
with make_temp_env(pkg) as prefix:
stdout, _, _ = run_command(Commands.LIST, prefix, "--json")
assert any(item["name"] == pkg for item in json.loads(stdout))


# conda list --reverse
def test_list_reverse():
pkg = "curl" # has dependencies
with make_temp_env(pkg) as prefix:
stdout, _, _ = run_command(Commands.LIST, prefix, "--json")
names = [item["name"] for item in json.loads(stdout)]
assert names == sorted(names)

stdout, _, _ = run_command(Commands.LIST, prefix, "--reverse", "--json")
names = [item["name"] for item in json.loads(stdout)]
assert names == sorted(names, reverse=True)