From 71c58d24c0700144e3d788162776f655939b517b Mon Sep 17 00:00:00 2001 From: rybridges Date: Wed, 9 Aug 2017 14:21:59 -0700 Subject: [PATCH] Add ability to list all deps These changes add a new feature which allows users to list all dependencies for their platform in csv format or one dep per line. This is really useful if people want to take the deps found in bindeps.txt and use them in an RPM spec file to build an RPM. USAGE: bindep -l newline * lists all dependencies one per line bindep -l csv * lists all dependencies in csv format Change-Id: I0277689ba727737e11b0adcddf6300b58614ac18 --- bindep/depends.py | 19 ++++++++++++ bindep/main.py | 9 ++++++ bindep/tests/test_depends.py | 59 ++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/bindep/depends.py b/bindep/depends.py index ea9e6f7..51ff3da 100644 --- a/bindep/depends.py +++ b/bindep/depends.py @@ -194,6 +194,25 @@ class Depends(object): result.append(rule) return result + def list_all_packages(self, rules, output_format='newline'): + """Print a list of all packages that are required on this platform + according to the passed in rules. This is useful if we want to build + RPMs based on the deps listed in bindeps.txt + + :param rules: A list of rules, as returned by active_rules. + :param output_format: The format to print the output in. Currently + we support newline format which will print 1 package per line, and + csv format which prints a csv list. + :return: List of all required packages regardless of whether they are + missing. + """ + packages_list = [rule[0] for rule in rules] + if output_format == 'csv': + logging.info(','.join(packages_list)) + elif output_format == 'newline': + logging.info('\n'.join(packages_list)) + return packages_list + def check_rules(self, rules): """Evaluate rules against the local environment. diff --git a/bindep/main.py b/bindep/main.py index 5fd8280..0ef57cb 100644 --- a/bindep/main.py +++ b/bindep/main.py @@ -41,6 +41,12 @@ def main(depends=None): parser.add_option( "--profiles", action="store_true", help="List the platform and configuration profiles.") + parser.add_option( + "-l", "--list_all", dest="list_all", choices=["newline", "csv"], + type="choice", action="store", + help="List all dependencies for this platform and profile." + " Pass in either 'newline' or 'csv' to specify the format" + " of the output.") opts, args = parser.parse_args() if depends is None: depends = bindep.depends.get_depends(opts.filename) @@ -61,6 +67,9 @@ def main(depends=None): profiles = ["default"] profiles = profiles + depends.platform_profiles() rules = depends.active_rules(profiles) + if opts.list_all: + depends.list_all_packages(rules, opts.list_all) + return 0 errors = depends.check_rules(rules) for error in errors: if error[0] == 'missing': diff --git a/bindep/tests/test_depends.py b/bindep/tests/test_depends.py index 976897e..64810d1 100644 --- a/bindep/tests/test_depends.py +++ b/bindep/tests/test_depends.py @@ -350,6 +350,65 @@ class TestDepends(TestCase): set(r[0] for r in depends.active_rules(['platform:rpm', 'test'])), Equals({"install5", "install6", "install8", "install9"})) + def test_list_all(self): + depends = Depends(dedent("""\ + install1 + install2 [test] + install3 [platform:rpm] + install4 [platform:dpkg] + install5 [quark] + install6 [platform:dpkg test] + install7 [quark test] + install8 [platform:dpkg platform:rpm] + install9 [platform:dpkg platform:rpm test] + installA [!platform:dpkg] + installB [!platform:dpkg test] + installC [!platform:dpkg !test] + installD [platform:dpkg !test] + installE [platform:dpkg !platform:rpm] + installF [platform:dpkg !platform:rpm test] + installG [!platform:dpkg !platform:rpm] + installH [!platform:dpkg !platform:rpm test] + installI [!platform:dpkg !platform:rpm !test] + installJ [platform:dpkg !platform:rpm !test] + """)) + + rules_dpkg = depends.active_rules(['platform:dpkg']) + result_dpkg = set(r[0] for r in rules_dpkg) + self.assertEqual(result_dpkg, + set(depends.list_all_packages(rules_dpkg, + output_format='newline'))) + self.assertEqual(result_dpkg, + set(depends.list_all_packages(rules_dpkg, + output_format='csv'))) + + rules_dpkg_test = depends.active_rules(['platform:dpkg', 'test']) + result_dpkg_test = set(r[0] for r in rules_dpkg_test) + self.assertEqual(result_dpkg_test, set(depends.list_all_packages( + rules_dpkg_test, + output_format='newline'))) + self.assertEqual(result_dpkg_test, set(depends.list_all_packages( + rules_dpkg_test, + output_format='csv'))) + + rules_rpm = depends.active_rules(['platform:rpm']) + result_rpm = set(r[0] for r in rules_rpm) + self.assertEqual(result_rpm, set(depends.list_all_packages(rules_rpm, + output_format='newline'))) + self.assertEqual(result_rpm, set(depends.list_all_packages(rules_rpm, + output_format='csv'))) + + rules_rpm_test = depends.active_rules(['platform:rpm', 'test']) + result_rpm_test = set(r[0] for r in rules_rpm_test) + self.assertEqual(result_rpm_test, + set(depends.list_all_packages( + rules_rpm_test, + output_format='newline'))) + self.assertEqual(result_rpm_test, + set(depends.list_all_packages( + rules_rpm_test, + output_format='csv'))) + def test_platforms(self): depends = Depends(dedent("""\ install1