From 1bfb36a5febbc4dfd178dd7d557be79de813e18b Mon Sep 17 00:00:00 2001 From: MarkJoy Date: Sat, 4 Nov 2023 22:21:36 +0700 Subject: [PATCH] Add option --user-requested for "pip freeze" and "pip list" --- src/pip/_internal/commands/freeze.py | 10 ++++++++++ src/pip/_internal/commands/list.py | 10 ++++++++++ src/pip/_internal/metadata/base.py | 6 ++++++ src/pip/_internal/operations/freeze.py | 2 ++ 4 files changed, 28 insertions(+) diff --git a/src/pip/_internal/commands/freeze.py b/src/pip/_internal/commands/freeze.py index eb7f29b3e..3816004a2 100644 --- a/src/pip/_internal/commands/freeze.py +++ b/src/pip/_internal/commands/freeze.py @@ -87,6 +87,15 @@ class FreezeCommand(Command): action="store_true", help="Exclude dependency packages from output.", ) + self.cmd_opts.add_option( + "--user-requested", + dest="user_requested", + action="store_true", + help=( + "List packages that were explicitly requested by user, either directly " + "via a command line argument or indirectly via a requirements file." + ), + ) self.cmd_opts.add_option(cmdoptions.list_exclude()) self.parser.insert_option_group(0, self.cmd_opts) @@ -110,6 +119,7 @@ class FreezeCommand(Command): skip=skip, exclude_editable=options.exclude_editable, exclude_dependencies=options.exclude_dependencies, + user_requested=options.user_requested, ): sys.stdout.write(line + "\n") return SUCCESS diff --git a/src/pip/_internal/commands/list.py b/src/pip/_internal/commands/list.py index 0bbe26c04..06cdce6a6 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -135,6 +135,15 @@ class ListCommand(IndexGroupCommand): action="store_true", help="Exclude dependency packages from output.", ) + self.cmd_opts.add_option( + "--user-requested", + dest="user_requested", + action="store_true", + help=( + "List packages that were explicitly requested by user, either directly " + "via a command line argument or indirectly via a requirements file." + ), + ) self.cmd_opts.add_option(cmdoptions.list_exclude()) index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) @@ -183,6 +192,7 @@ class ListCommand(IndexGroupCommand): editables_only=options.editable, include_editables=options.include_editable, exclude_dependencies=options.exclude_dependencies, + user_requested=options.user_requested, skip=skip, ) ] diff --git a/src/pip/_internal/metadata/base.py b/src/pip/_internal/metadata/base.py index cba7dab7c..d30e5895a 100644 --- a/src/pip/_internal/metadata/base.py +++ b/src/pip/_internal/metadata/base.py @@ -650,6 +650,7 @@ class BaseEnvironment: editables_only: bool = False, user_only: bool = False, exclude_dependencies: bool = False, + user_requested: bool = False, ) -> Iterator[BaseDistribution]: """Return a list of installed distributions. @@ -668,6 +669,9 @@ class BaseEnvironment: site directory. :param exclude_dependencies: If True, dont't report distributions that are dependencies of other installed distributions. + :param user_requested: If True, report only distributions that were + explicitly requested by user, either directly via a command line argument + or indirectly via a requirements file. """ if exclude_dependencies: dists = list(self.iter_all_distributions()) @@ -680,6 +684,8 @@ class BaseEnvironment: it = (d for d in it if d.canonical_name not in dep_keys) else: it = self.iter_all_distributions() + if user_requested: + it = (d for d in it if d.requested) if local_only: it = (d for d in it if d.local) if not include_editables: diff --git a/src/pip/_internal/operations/freeze.py b/src/pip/_internal/operations/freeze.py index a0e5a572a..b7dab2f1d 100644 --- a/src/pip/_internal/operations/freeze.py +++ b/src/pip/_internal/operations/freeze.py @@ -31,6 +31,7 @@ def freeze( isolated: bool = False, exclude_editable: bool = False, exclude_dependencies: bool = False, + user_requested: bool = False, skip: Container[str] = (), ) -> Generator[str, None, None]: installations: Dict[str, FrozenRequirement] = {} @@ -40,6 +41,7 @@ def freeze( skip=(), user_only=user_only, exclude_dependencies=exclude_dependencies, + user_requested=user_requested, ) for dist in dists: req = FrozenRequirement.from_dist(dist)