| #!/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 duplicate 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: |
| copy_config.py gl gles '.*Mac10.7.*' |
| |
| 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/copy_config.py 8888 8888-copy '.*Mac10.7.*' \ |
| --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 Copier(object): |
| |
| def __init__(self, args): |
| """ |
| Params: |
| args: the Namespace object generated by argparse.parse_args() |
| """ |
| self._args = args |
| |
| def run(self): |
| """Perform all the duplications.""" |
| for path in self._get_file_list(): |
| self._duplicate_config(path=path, |
| old=self._args.old_config_name, |
| new=self._args.new_config_name) |
| |
| def _duplicate_config(self, path, old, new): |
| """Duplicates 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[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 we want to duplicate.')) |
| parser.add_argument('new_config_name', |
| help=('Name of the new config we want to create.')) |
| parser.add_argument('builder_name_pattern', |
| help=('Regex pattern describing which builders we want ' |
| 'to make the duplication for; \'.*\' to perform ' |
| 'the duplication 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() |
| copier = Copier(args) |
| copier.run() |
| |
| if __name__ == '__main__': |
| main() |