]> git.ipfire.org Git - pakfire.git/commitdiff
Add requires command to CLI.
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 7 Apr 2011 16:55:19 +0000 (18:55 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 7 Apr 2011 16:55:19 +0000 (18:55 +0200)
pakfire/__init__.py
pakfire/cli.py
pakfire/repository/__init__.py
pakfire/repository/base.py

index a049c457f529019cc73742f3f48b4ba64b88939a..d865fbcef38a59f5509c4aa7e964bdc41f4ff5d2 100644 (file)
@@ -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,
index cb8d5b34fbf26d52c38c21a83a51931a925c90f0..72891b821faae0f32e9ec8626bd9991e7130d4ec 100644 (file)
@@ -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,
                }
index ce943e440f3791859610bcc03e2f8fc41827cd22..6afe87ea102451855b8dae304c56d7f44a2a9242 100644 (file)
@@ -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):
index e6d4e9afefca3650475f5ebac0b71dd8a4783948..cdf65779f38c5a2f753702789d9e6ba36acae9e8 100644 (file)
@@ -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