#!/usr/bin/env python3.8
# 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.
# Lint as: python3

import argparse
import json
import os
import sys


# Generates shebang files for binaries so they can be invoked from the shell.
# Generated files look like this:
# #!resolve fuchsia-pkg://fuchsia.com/<package-name>#bin/<bin-name>
def main():
    parser = argparse.ArgumentParser(
        'Generate shebang files for shell binaries')
    parser.add_argument('--package-name', required=True)
    parser.add_argument(
        '--input-distribution-manifest',
        required=True,
        type=argparse.FileType('r'),
        help='Path to a distribution manifest with all shell binaries')
    parser.add_argument(
        '--output-directory',
        required=True,
        help='Path to a directory to store generated shebang files')
    parser.add_argument(
        '--output-distribution-manifest',
        required=True,
        type=argparse.FileType('w'),
        help='Path to write output distribution manifest')
    parser.add_argument(
        '--depfile',
        required=True,
        type=argparse.FileType('w'),
        help='Depfile for listing generated shebang files as additional inputs')
    args = parser.parse_args()

    input_dist = json.load(args.input_distribution_manifest)
    output_dist = []
    shebang_files = []

    for dist in input_dist:
        dest = dist["destination"]
        if not dest.startswith("bin/"):
            continue
        if dest == "bin/grand_unified_binary":
            # This binary may arrive via multiple deps because it's commonly
            # renamed and reused. Ignore it so as not to create conflicting
            # shebang files.
            continue
        shebang_file = os.path.join(
            args.output_directory, "__untraced_shebangs__", dest)
        shebang_files.append(shebang_file)
        os.makedirs(os.path.dirname(shebang_file), exist_ok=True)
        with open(shebang_file, 'w') as f:
            f.write(
                f'#!resolve fuchsia-pkg://fuchsia.com/{args.package_name}#{dest}\n'
            )
        output_dist.append(dict(dist, source=shebang_file))

    json.dump(
        output_dist,
        args.output_distribution_manifest,
        indent=2,
        sort_keys=True,
        separators=(',', ': '))

    args.depfile.write(
        '{}: {}\n'.format(
            args.output_distribution_manifest.name, ' '.join(shebang_files)))

    return 0


if __name__ == '__main__':
    sys.exit(main())
