blob: c29590a257dcec0cf5573bfaa5d7e2ca0b50b8f7 [file] [log] [blame]
#!/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())