From b0bcdb493f8915bb4949e24fd51a27db958a77a8 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 7 Apr 2011 18:55:19 +0200 Subject: [PATCH] Add requires command to CLI. --- pakfire/__init__.py | 12 ++++++++++++ pakfire/cli.py | 18 ++++++++++++++++++ pakfire/repository/__init__.py | 5 +++++ pakfire/repository/base.py | 9 +++++++++ 4 files changed, 44 insertions(+) diff --git a/pakfire/__init__.py b/pakfire/__init__.py index a049c457f..d865fbcef 100644 --- a/pakfire/__init__.py +++ b/pakfire/__init__.py @@ -250,6 +250,18 @@ class Pakfire(object): return pkgs + def requires(self, patterns): + pkgs = [] + + for pattern in patterns: + requires = depsolve.Requires(None, pattern) + pkgs += self.repos.get_by_requires(requires) + + pkgs = packages.PackageListing(pkgs) + #pkgs.unique() + + return pkgs + def repo_create(self, path, input_paths): repo = repository.LocalRepository( self, diff --git a/pakfire/cli.py b/pakfire/cli.py index cb8d5b34f..72891b821 100644 --- a/pakfire/cli.py +++ b/pakfire/cli.py @@ -50,6 +50,7 @@ class Cli(object): self.parse_command_search() self.parse_command_update() self.parse_command_provides() + self.parse_command_requires() self.parse_command_grouplist() self.parse_command_groupinstall() self.parse_command_repolist() @@ -71,6 +72,7 @@ class Cli(object): "info" : self.handle_info, "search" : self.handle_search, "provides" : self.handle_provides, + "requires" : self.handle_requires, "grouplist" : self.handle_grouplist, "groupinstall" : self.handle_groupinstall, "repolist" : self.handle_repolist, @@ -134,6 +136,14 @@ class Cli(object): help=_("File or feature to search for.")) sub_provides.add_argument("action", action="store_const", const="provides") + def parse_command_requires(self): + # Implement the "requires" command + sub_requires = self.sub_commands.add_parser("requires", + help=_("Get a list of packages that require a given file or feature.")) + sub_requires.add_argument("pattern", nargs="+", + help=_("File or feature to search for.")) + sub_requires.add_argument("action", action="store_const", const="requires") + def parse_command_grouplist(self): # Implement the "grouplist" command sub_grouplist = self.sub_commands.add_parser("grouplist", @@ -211,6 +221,12 @@ class Cli(object): for pkg in pkgs: print pkg.dump() + def handle_requires(self): + pkgs = self.pakfire.requires(self.args.pattern) + + for pkg in pkgs: + print pkg.dump() + def handle_grouplist(self): pkgs = self.pakfire.grouplist(self.args.group[0]) @@ -256,6 +272,7 @@ class CliBuilder(Cli): self.parse_command_shell() self.parse_command_update() self.parse_command_provides() + self.parse_command_requires() self.parse_command_grouplist() self.parse_command_repolist() @@ -276,6 +293,7 @@ class CliBuilder(Cli): "search" : self.handle_search, "shell" : self.handle_shell, "provides" : self.handle_provides, + "requires" : self.handle_requires, "grouplist" : self.handle_grouplist, "repolist" : self.handle_repolist, } diff --git a/pakfire/repository/__init__.py b/pakfire/repository/__init__.py index ce943e440..6afe87ea1 100644 --- a/pakfire/repository/__init__.py +++ b/pakfire/repository/__init__.py @@ -118,6 +118,11 @@ class Repositories(object): for pkg in repo.get_by_provides(requires): yield pkg + def get_by_requires(self, requires): + for repo in self.enabled: + for pkg in repo.get_by_requires(requires): + yield pkg + def get_by_file(self, filename): for repo in self.enabled: for pkg in repo.get_by_file(filename): diff --git a/pakfire/repository/base.py b/pakfire/repository/base.py index e6d4e9afe..cdf65779f 100644 --- a/pakfire/repository/base.py +++ b/pakfire/repository/base.py @@ -77,6 +77,15 @@ class RepositoryFactory(object): if pkg.does_provide(requires): yield pkg + def get_by_requires(self, requires): + """ + Returns a list of all packages that require the given requirement. + """ + for pkg in self.packages: + # XXX does not use the cmp() function of Requires. + if requires.requires in pkg.requires: + yield pkg + def get_by_file(self, filename): for pkg in self.packages: match = False -- 2.39.5