# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import plist_util
import sys

# This script creates a PkgInfo file for an OS X .app bundle's plist.
# Usage: python write_pkg_info.py --plist Foo.app/Contents/Info.plist \
#           --output Foo.app/Contents/PkgInfo


def Main():
    parser = argparse.ArgumentParser(
        description='A script to write PkgInfo files for .app bundles.'
    )
    parser.add_argument(
        '--plist', required=True, help='Path to the Info.plist for the .app.'
    )
    parser.add_argument(
        '--output', required=True, help='Path to the desired output file.'
    )
    args = parser.parse_args()

    # Remove the output if it exists already.
    try:
        os.unlink(args.output)
    except FileNotFoundError:
        pass

    plist = plist_util.LoadPList(args.plist)
    package_type = plist['CFBundlePackageType']
    if package_type != 'APPL':
        raise ValueError(
            'Expected CFBundlePackageType to be %s, got %s'
            % ('APPL', package_type)
        )

    # The format of PkgInfo is eight characters, representing the bundle type
    # and bundle signature, each four characters. If that is missing, four
    # '?' characters are used instead.
    signature_code = plist.get('CFBundleSignature', '????')
    if len(signature_code) != 4:
        raise ValueError(
            'CFBundleSignature should be exactly four characters, '
            + 'got %s' % signature_code
        )

    with open(args.output, 'w') as fp:
        fp.write('%s%s' % (package_type, signature_code))
    return 0


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