blob: 6793af640e10d61fd704bfec9cd40d7c524f9864 [file]
# Copyright 2016 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
from __future__ import print_function
from . import loader
def add_subparser(parser):
helpstr = 'List places referencing given recipe module(s).'
refs_p = parser.add_parser(
'refs', help=helpstr, description=helpstr)
refs_p.add_argument('modules', nargs='+', help='Module(s) to query for')
refs_p.add_argument('--transitive', action='store_true',
help='Compute transitive closure of the references')
refs_p.set_defaults(func=main)
def main(package_deps, args):
universe = loader.RecipeUniverse(package_deps, args.package)
own_package = package_deps.root_package
modules = args.modules
transitive = args.transitive
result_modules = set()
result_recipes = set()
module_dependencies = {}
for package, module_name in universe.loop_over_recipe_modules():
mod = universe.load(package, module_name)
module_dependencies[mod.NAME] = mod.LOADED_DEPS
for module in modules:
if module in mod.LOADED_DEPS:
result_modules.add(mod.NAME)
break
if transitive:
queue = list(result_modules)
while queue:
module = queue.pop()
for iter_module, deps in module_dependencies.iteritems():
if iter_module in result_modules:
continue
if module in deps:
result_modules.add(iter_module)
queue.append(iter_module)
universe_view = loader.UniverseView(universe, own_package)
for _, recipe_name in universe_view.loop_over_recipes():
recipe = universe_view.load_recipe(recipe_name)
for module in modules + (list(result_modules) if transitive else []):
if module in recipe.LOADED_DEPS:
result_recipes.add(recipe_name)
if result_modules:
print('Modules:')
for module in sorted(result_modules):
print(' %s' % module)
if result_recipes:
print('Recipes:')
for recipe in sorted(result_recipes):
print(' %s' % recipe)