|  | @@ -0,0 +1,56 @@
 | 
	
		
			
				|  |  | +#!/usr/bin/python
 | 
	
		
			
				|  |  | +# produces cleaner build.json files
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import collections
 | 
	
		
			
				|  |  | +import json
 | 
	
		
			
				|  |  | +import os
 | 
	
		
			
				|  |  | +import sys
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +_TOP_LEVEL_KEYS = ['settings', 'filegroups', 'libs', 'targets']
 | 
	
		
			
				|  |  | +_VERSION_KEYS = ['major', 'minor', 'micro', 'build']
 | 
	
		
			
				|  |  | +_ELEM_KEYS = [
 | 
	
		
			
				|  |  | +    'name', 
 | 
	
		
			
				|  |  | +    'build', 
 | 
	
		
			
				|  |  | +    'language', 
 | 
	
		
			
				|  |  | +    'public_headers', 
 | 
	
		
			
				|  |  | +    'headers', 
 | 
	
		
			
				|  |  | +    'src', 
 | 
	
		
			
				|  |  | +    'deps']
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def rebuild_as_ordered_dict(indict, special_keys):
 | 
	
		
			
				|  |  | +  outdict = collections.OrderedDict()
 | 
	
		
			
				|  |  | +  for key in special_keys:
 | 
	
		
			
				|  |  | +    if key in indict:
 | 
	
		
			
				|  |  | +      outdict[key] = indict[key]
 | 
	
		
			
				|  |  | +  for key in sorted(indict.keys()):
 | 
	
		
			
				|  |  | +    if key in special_keys: continue
 | 
	
		
			
				|  |  | +    outdict[key] = indict[key]
 | 
	
		
			
				|  |  | +  return outdict
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def clean_elem(indict):
 | 
	
		
			
				|  |  | +  for name in ['public_headers', 'headers', 'src']:
 | 
	
		
			
				|  |  | +    if name not in indict: continue
 | 
	
		
			
				|  |  | +    inlist = indict[name]
 | 
	
		
			
				|  |  | +    protos = set(x for x in inlist if os.path.splitext(x)[1] == '.proto')
 | 
	
		
			
				|  |  | +    others = set(x for x in inlist if x not in protos)
 | 
	
		
			
				|  |  | +    indict[name] = sorted(protos) + sorted(others)
 | 
	
		
			
				|  |  | +  return rebuild_as_ordered_dict(indict, _ELEM_KEYS)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +for filename in sys.argv[1:]:
 | 
	
		
			
				|  |  | +  with open(filename) as f:
 | 
	
		
			
				|  |  | +    js = json.load(f)
 | 
	
		
			
				|  |  | +  js = rebuild_as_ordered_dict(js, _TOP_LEVEL_KEYS)
 | 
	
		
			
				|  |  | +  js['settings']['version'] = rebuild_as_ordered_dict(
 | 
	
		
			
				|  |  | +      js['settings']['version'], _VERSION_KEYS)
 | 
	
		
			
				|  |  | +  for grp in ['filegroups', 'libs', 'targets']:
 | 
	
		
			
				|  |  | +    if grp not in js: continue
 | 
	
		
			
				|  |  | +    js[grp] = sorted([clean_elem(x) for x in js[grp]],
 | 
	
		
			
				|  |  | +                     key=lambda x: x['name'])
 | 
	
		
			
				|  |  | +  output = json.dumps(js, indent = 2)
 | 
	
		
			
				|  |  | +  # massage out trailing whitespace
 | 
	
		
			
				|  |  | +  lines = []
 | 
	
		
			
				|  |  | +  for line in output.splitlines():
 | 
	
		
			
				|  |  | +    lines.append(line.rstrip() + '\n')
 | 
	
		
			
				|  |  | +  with open(filename, 'w') as f:
 | 
	
		
			
				|  |  | +    f.write(''.join(lines))
 | 
	
		
			
				|  |  | +
 |