diff --git a/unbundle b/unbundle index aa175d7..b8eb8f1 100755 --- a/unbundle +++ b/unbundle @@ -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))))