skia2/infra/bots/win_toolchain_utils.py

59 lines
1.7 KiB
Python

#!/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)