| # 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. | 
 |   if os.path.exists(args.output): | 
 |     os.unlink(args.output) | 
 |  | 
 |   plist = plist_util.LoadPList(args.plist) | 
 |   package_type = plist['CFBundlePackageType'] | 
 |   if package_type != 'APPL': | 
 |     raise ValueError('Expected CFBundlePackageType to be %s, got %s' % \ | 
 |         ('AAPL', 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()) |