1#!/usr/bin/env python 2# 3# Copyright 2016 Google Inc. 4# 5# Use of this source code is governed by a BSD-style license that can be 6# found in the LICENSE file. 7 8 9"""Utilities for manipulating the win_toolchain.json file.""" 10 11 12import json 13import os 14import stat 15 16 17PLACEHOLDER = '<(TOOLCHAIN_BASE_DIR)' 18 19 20def _replace_prefix(val, before, after): 21 """Replace the given prefix with the given string.""" 22 if val.startswith(before): 23 return val.replace(before, after, 1) 24 return val 25 26 27def _replace(val, before, after): 28 """Replace occurrences of one string with another within the data.""" 29 if isinstance(val, basestring): 30 return _replace_prefix(val, before, after) 31 elif isinstance(val, (list, tuple)): 32 return [_replace(elem, before, after) for elem in val] 33 elif isinstance(val, dict): 34 return {_replace(k, before, after): 35 _replace(v, before, after) for k, v in val.iteritems()} 36 raise Exception('Cannot replace variable: %s' % val) 37 38 39def _replace_in_file(filename, before, after): 40 """Replace occurrences of one string with another within the file.""" 41 # Make the file writeable, or the below won't work. 42 os.chmod(filename, stat.S_IWRITE) 43 44 with open(filename) as f: 45 contents = json.load(f) 46 new_contents = _replace(contents, before, after) 47 with open(filename, 'w') as f: 48 json.dump(new_contents, f) 49 50 51def abstract(win_toolchain_json, old_path): 52 """Replace absolute paths in win_toolchain.json with placeholders.""" 53 _replace_in_file(win_toolchain_json, old_path, PLACEHOLDER) 54 55 56def resolve(win_toolchain_json, new_path): 57 """Replace placeholders in win_toolchain.json with absolute paths.""" 58 _replace_in_file(win_toolchain_json, PLACEHOLDER, new_path) 59