#!/usr/bin/python # Copyright 2015 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 json import sys DESCRIPTION = '''This tools reads in a GYP file, parses it as JSON, grabs the requested object(s) using the passed in |key_name| and |key_value| and then builds up a space delimited string using the |return_key| given. The built up string is then output to STDOUT which can be read and tokenized in bash or python scripts.''' FILE_HELP = '''The GYP file to parse''' APP_KEY_NAME_HELP = '''Key name used to identify relevant webapp details''' APP_KEY_VALUE_HELP = '''Key value used to identify relevant webapp details, multiple values can be passed in''' TARGET_KEY_VALUE_HELP = '''The key name used to output the targeted value''' DEBUG_HELP = '''Turns on verbose debugging output''' # Cleans up the text in the passed in GYP file, updates it to make it valid JSON # and returns the valid json string. def gyp_file_to_json_string(gyp_file): # First, read in each line and discard comments and whitespace. line_data = '' for line in gyp_file: lines = line.split("#") line_data += lines[0].strip() # Trailing commas are valid in GYP files but invalid in JSON, so remove them # here. Also convert double quotes to single quotes and those throw off the # python json parser. line_data = line_data.replace(',}', '}') line_data = line_data.replace(',]', ']') line_data = line_data.replace('\'', '\"') return line_data # Finds the matching app detail sections in |data| and generates a space # delimited string with the |return_key|'s value. If we found at least one # matching app and created a string, we output it to STDOUT. def print_details(data, key_name, key_values, target_key): output_string = '' for target in data['targets']: if target[key_name] in key_values: if output_string: output_string += " " + target[target_key] else: output_string += target[target_key] if output_string: print output_string def main(): parser = argparse.ArgumentParser(description = DESCRIPTION) parser.add_argument('file', nargs = '+', help = FILE_HELP) parser.add_argument('-k', '--key_name', help = APP_KEY_NAME_HELP, nargs = '?', required=True) parser.add_argument('-v', '--key_value', help = APP_KEY_VALUE_HELP, nargs = '+', required=True) parser.add_argument('-t', '--target_key', help = TARGET_KEY_VALUE_HELP, nargs = '?', required=True) parser.add_argument('-d', '--debug', help = DEBUG_HELP, action='store_true') options = parser.parse_args() if options.debug: print 'Reading from file \"' + options.file[0] + '\"' gyp_file = open(options.file[0]) json_string = gyp_file_to_json_string(gyp_file) json_object = json.loads(json_string) if options.debug: print 'The following app details were found:' for target in json_object['targets']: print target['target_name'], target['app_id'], target['app_name'] print_details(json_object, options.key_name, options.key_value, options.target_key) return 0 if __name__ == '__main__': sys.exit(main())