| #!/usr/bin/env python |
| # |
| # Copyright 2016 Google Inc. |
| # |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| |
| """Utilities for manipulating the win_toolchain.json file.""" |
| |
| |
| import json |
| import os |
| import stat |
| |
| |
| PLACEHOLDER = '<(TOOLCHAIN_BASE_DIR)' |
| |
| |
| def _replace_prefix(val, before, after): |
| """Replace the given prefix with the given string.""" |
| if val.startswith(before): |
| return val.replace(before, after, 1) |
| return val |
| |
| |
| def _replace(val, before, after): |
| """Replace occurrences of one string with another within the data.""" |
| if isinstance(val, basestring): |
| return _replace_prefix(val, before, after) |
| elif isinstance(val, (list, tuple)): |
| return [_replace(elem, before, after) for elem in val] |
| elif isinstance(val, dict): |
| return {_replace(k, before, after): |
| _replace(v, before, after) for k, v in val.iteritems()} |
| raise Exception('Cannot replace variable: %s' % val) |
| |
| |
| def _replace_in_file(filename, before, after): |
| """Replace occurrences of one string with another within the file.""" |
| # Make the file writeable, or the below won't work. |
| os.chmod(filename, stat.S_IWRITE) |
| |
| with open(filename) as f: |
| contents = json.load(f) |
| new_contents = _replace(contents, before, after) |
| with open(filename, 'w') as f: |
| json.dump(new_contents, f) |
| |
| |
| def abstract(win_toolchain_json, old_path): |
| """Replace absolute paths in win_toolchain.json with placeholders.""" |
| _replace_in_file(win_toolchain_json, old_path, PLACEHOLDER) |
| |
| |
| def resolve(win_toolchain_json, new_path): |
| """Replace placeholders in win_toolchain.json with absolute paths.""" |
| _replace_in_file(win_toolchain_json, PLACEHOLDER, new_path) |