#!/usr/bin/python # Copyright (c) 2014 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. """Utility to rename a config in some subset of our GM expectation files. Created for http://skbug.com/2752 ('split existing "gpu" GM results into "gl" and "gles"') Run with -h to see usage. Example command lines: rename_config.py gpu gles '.*Android.*' TODO(epoger): Once https://codereview.chromium.org/397103003/ is committed, we should add a unittest. Until then, we can test this as follows: OLD=expectations/gm && NEW=/tmp/expectations && \ rm -rf $NEW && \ cp -a $OLD $NEW && \ gm/rename_config.py msaa4 gles-msaa4 '.*Android.*' \ --expectations-root $NEW && \ diff --recursive $OLD $NEW """ __author__ = 'Elliot Poger' import argparse import os import re import gm_json DEFAULT_EXPECTATIONS_ROOT = os.path.join( os.path.dirname(__file__), os.pardir, 'expectations', 'gm') IMAGE_FILENAME_RE = re.compile(gm_json.IMAGE_FILENAME_PATTERN) class Renamer(object): def __init__(self, args): """ Params: args: the Namespace object generated by argparse.parse_args() """ self._args = args def run(self): """Perform all the subsitutions.""" for path in self._get_file_list(): self._rename_config(path=path, old=self._args.old_config_name, new=self._args.new_config_name) def _rename_config(self, path, old, new): """Renames all instances of a config within a GM expectations file. Params: path: path to file which will be modified in place old: old config name new: new config name """ dic = gm_json.LoadFromFile(file_path=path) expected_results = dic[gm_json.JSONKEY_EXPECTEDRESULTS] orig_keys = expected_results.keys() for key in orig_keys: result = expected_results.pop(key) (testname, config) = IMAGE_FILENAME_RE.match(key).groups() if config == old: config = new key = '%s_%s.png' % (testname, config) expected_results[key] = result gm_json.WriteToFile(json_dict=dic, file_path=path) def _get_file_list(self): """Returns the list of files we want to operate on (the complete path to each file).""" root = self._args.expectations_root regex = re.compile(self._args.builder_name_pattern) return [os.path.join(root, builder, 'expected-results.json') for builder in os.listdir(root) if regex.match(builder)] def main(): parser = argparse.ArgumentParser() parser.add_argument('old_config_name', help=('Config name we want to replace.')) parser.add_argument('new_config_name', help=('Config name we want to replace the old one with.')) parser.add_argument('builder_name_pattern', help=('Regex pattern describing which builders we want ' 'to make the substitution for; \'.*\' to perform ' 'the replacement on all builders.')) parser.add_argument('--expectations-root', default=DEFAULT_EXPECTATIONS_ROOT, help=('Root of the GM expectations dir; defaults to ' '%(default)s')) args = parser.parse_args() renamer = Renamer(args) renamer.run() if __name__ == '__main__': main()