| #!/usr/bin/env fuchsia-vendored-python |
| # Copyright 2020 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Reads the contents of a manifest file generated by the build and verifies |
| that there are no collisions among destination paths. |
| """ |
| |
| import argparse |
| import json |
| import sys |
| |
| # Import from the current directory. |
| import distribution_manifest |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument( |
| "--input", help="Path to original manifest", required=True |
| ) |
| parser.add_argument( |
| "--output", help="Path to the updated manifest", required=True |
| ) |
| parser.add_argument("--depfile", help="Path to GN style depfile") |
| parser.add_argument( |
| "--hermetic-inputs-file", |
| metavar="INPUTS_FILE", |
| help="When used, only output the INPUTS_FILE which lists all inputs used " |
| + "by this command, instead of OUTPUT and DEPFILE.", |
| ) |
| parser.add_argument( |
| "--prefix", |
| metavar="PREFIX", |
| help="Prepend PREFIX to each destination path", |
| ) |
| args = parser.parse_args() |
| |
| contents = "" |
| with open(args.input, "r") as input_file: |
| try: |
| contents = json.load(input_file) |
| except Exception as e: |
| print("while reading:\n\t{}:\n\t{}".format(args.input, e)) |
| return 1 |
| |
| opened_files = set() |
| entries, error = distribution_manifest.expand_manifest( |
| contents, opened_files |
| ) |
| if error: |
| print(error, file=sys.stderr) |
| return 1 |
| |
| if args.prefix: |
| entries = [ |
| distribution_manifest.Entry( |
| destination=args.prefix + entry.destination, |
| source=entry.source, |
| label=entry.label, |
| ) |
| for entry in entries |
| ] |
| |
| # NOTE: If --hermetic-inputs-file INPUTS_FILE is used, then |
| # do not output the manifest file or a depfile, only generate an |
| # inputs list file. See hermetrics_inputs_file in BUILDCONFIG.gn. |
| if args.hermetic_inputs_file: |
| with open(args.hermetic_inputs_file, "w") as inputs_file: |
| inputs_file.write("\n".join(sorted(opened_files))) |
| else: |
| if args.output: |
| with open(args.output, "w") as output_file: |
| json.dump( |
| [e._asdict() for e in sorted(entries)], |
| output_file, |
| indent=2, |
| sort_keys=True, |
| separators=(",", ": "), |
| ) |
| |
| if args.depfile: |
| with open(args.depfile, "w+") as depfile: |
| depfile.write( |
| "%s: %s\n" % (args.output, " ".join(opened_files)) |
| ) |
| |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |