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
This commit is contained in:
rybridges 2017-08-09 14:21:59 -07:00
parent 125de90c2a
commit 71c58d24c0
3 changed files with 87 additions and 0 deletions

View File

@ -194,6 +194,25 @@ class Depends(object):
result.append(rule) result.append(rule)
return result 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): def check_rules(self, rules):
"""Evaluate rules against the local environment. """Evaluate rules against the local environment.

View File

@ -41,6 +41,12 @@ def main(depends=None):
parser.add_option( parser.add_option(
"--profiles", action="store_true", "--profiles", action="store_true",
help="List the platform and configuration profiles.") 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() opts, args = parser.parse_args()
if depends is None: if depends is None:
depends = bindep.depends.get_depends(opts.filename) depends = bindep.depends.get_depends(opts.filename)
@ -61,6 +67,9 @@ def main(depends=None):
profiles = ["default"] profiles = ["default"]
profiles = profiles + depends.platform_profiles() profiles = profiles + depends.platform_profiles()
rules = depends.active_rules(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) errors = depends.check_rules(rules)
for error in errors: for error in errors:
if error[0] == 'missing': if error[0] == 'missing':

View File

@ -350,6 +350,65 @@ class TestDepends(TestCase):
set(r[0] for r in depends.active_rules(['platform:rpm', 'test'])), set(r[0] for r in depends.active_rules(['platform:rpm', 'test'])),
Equals({"install5", "install6", "install8", "install9"})) 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): def test_platforms(self):
depends = Depends(dedent("""\ depends = Depends(dedent("""\
install1 install1