# Copyright 2016 The Chromium Authors. All rights reserved. # 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())