#!/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, "__shebang__", 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())
