Detect include loops and report failures

Catch recursion errors and report them, report other failures and set
the returncode to 1 on failures.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
This commit is contained in:
Matthew Johnson
2018-04-13 14:38:41 -07:00
parent 19ad0c6713
commit 093e50b043
+26 -6
View File
@@ -19,9 +19,15 @@ def resolve_includes(bundle_name, bundle_path, bundles=False):
packages_f = os.path.join(bundle_path, "packages")
if not os.path.exists(packages_f):
# pundle definition file does not exist
return set()
print(f"ERROR: could not find {bundle_name} bundle")
return set(), False
# find name on its own line
return set([bundle_name]) if f"\n{bundle_name}\n" in open(packages_f, "r").read() else set()
if f"\n{bundle_name}\n" in open(packages_f, "r").read():
return set([bundle_name]), True
print(f"ERROR: could not find {bundle_name} bundle")
return set(), False
packages = set()
for line in lines:
@@ -31,7 +37,14 @@ def resolve_includes(bundle_name, bundle_path, bundles=False):
if line.startswith("include("):
inc_bundle = line[len("include("):].rsplit(")")[0]
packages = packages.union(resolve_includes(inc_bundle, bundle_path, bundles))
try:
n_packages, success = resolve_includes(inc_bundle, bundle_path, bundles)
if not success:
return set(), False
packages = packages.union(n_packages)
except RecursionError:
print("ERROR: include loop found")
return set(), False
if bundles:
packages.add(inc_bundle)
@@ -40,7 +53,7 @@ def resolve_includes(bundle_name, bundle_path, bundles=False):
if not bundles:
packages.add(line)
return packages
return packages, True
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process bundle packages following includes')
@@ -49,10 +62,17 @@ if __name__ == "__main__":
parser.add_argument('--bundles', default=False, action='store_true',
help='Report only included bundle names')
args = parser.parse_args()
success = True
if args.bundles:
os_core_set = set(["os-core"])
else:
os_core_set = resolve_includes("os-core", args.bundle_path)
os_core_set, success = resolve_includes("os-core", args.bundle_path)
if not success:
sys.exit(1)
bundle_set, success = resolve_includes(args.bundle_name, args.bundle_path, bundles=args.bundles)
if not success:
sys.exit(1)
bundle_set = resolve_includes(args.bundle_name, args.bundle_path, bundles=args.bundles)
print('\n'.join(sorted(os_core_set.union(bundle_set))))