| #!/usr/bin/env fuchsia-vendored-python |
| # Copyright 2022 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. |
| |
| # Extracts a zip file and writes a partial distribution manifest. |
| # See //docs/development/build/build_system/internals/manifest_formats.md |
| |
| from argparse import ArgumentParser |
| import json |
| from os import path |
| from zipfile import ZipFile |
| |
| parser = ArgumentParser() |
| parser.add_argument( |
| "zip", help="extracts a zip file and writes a partial distribution manifest" |
| ) |
| parser.add_argument( |
| "--output-dir", help="directory to which to extract", required=True |
| ) |
| parser.add_argument( |
| "--output-manifest", |
| help="path to which to output the distribution manifest", |
| required=True, |
| ) |
| parser.add_argument( |
| "--output-depfile", help="path to the generated depfile", required=True |
| ) |
| parser.add_argument( |
| "--dest-path-prefix", |
| help="path to prefix all entries within the zip when writing the manifest", |
| ) |
| |
| |
| def main(): |
| args = parser.parse_args() |
| with ZipFile(args.zip) as archive: |
| archive.extractall(args.output_dir) |
| json_data = [] |
| depfile_data = [] |
| for entry in archive.infolist(): |
| destination = ( |
| path.join(args.dest_path_prefix, entry.filename) |
| if args.dest_path_prefix |
| else entry.filename |
| ) |
| source = path.join(args.output_dir, entry.filename) |
| json_data.append({"destination": destination, "source": source}) |
| depfile_data.append(source) |
| with open(args.output_manifest, "w") as f: |
| json.dump(json_data, f) |
| with open(args.output_depfile, "w") as f: |
| f.write(" ".join(depfile_data)) |
| f.write(f": {args.zip}\n") |
| |
| |
| if __name__ == "__main__": |
| main() |