epoger | a8f7745 | 2014-07-17 08:22:12 -0700 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | """Utility to rename a config in some subset of our GM expectation files. |
| 7 | |
| 8 | Created for http://skbug.com/2752 ('split existing "gpu" GM results into "gl" |
| 9 | and "gles"') |
| 10 | |
| 11 | Run with -h to see usage. |
| 12 | |
| 13 | Example command lines: |
| 14 | rename_config.py gpu gles '.*Android.*' |
| 15 | |
| 16 | TODO(epoger): Once https://codereview.chromium.org/397103003/ is committed, |
| 17 | we should add a unittest. Until then, we can test this as follows: |
| 18 | |
| 19 | OLD=expectations/gm && NEW=/tmp/expectations && \ |
| 20 | rm -rf $NEW && \ |
| 21 | cp -a $OLD $NEW && \ |
| 22 | gm/rename_config.py msaa4 gles-msaa4 '.*Android.*' \ |
| 23 | --expectations-root $NEW && \ |
| 24 | diff --recursive $OLD $NEW |
| 25 | """ |
| 26 | __author__ = 'Elliot Poger' |
| 27 | |
| 28 | import argparse |
| 29 | import os |
| 30 | import re |
| 31 | |
| 32 | import gm_json |
| 33 | |
| 34 | DEFAULT_EXPECTATIONS_ROOT = os.path.join( |
| 35 | os.path.dirname(__file__), os.pardir, 'expectations', 'gm') |
| 36 | IMAGE_FILENAME_RE = re.compile(gm_json.IMAGE_FILENAME_PATTERN) |
| 37 | |
| 38 | |
| 39 | class Renamer(object): |
| 40 | |
| 41 | def __init__(self, args): |
| 42 | """ |
| 43 | Params: |
| 44 | args: the Namespace object generated by argparse.parse_args() |
| 45 | """ |
| 46 | self._args = args |
| 47 | |
| 48 | def run(self): |
| 49 | """Perform all the subsitutions.""" |
| 50 | for path in self._get_file_list(): |
| 51 | self._rename_config(path=path, |
| 52 | old=self._args.old_config_name, |
| 53 | new=self._args.new_config_name) |
| 54 | |
| 55 | def _rename_config(self, path, old, new): |
| 56 | """Renames all instances of a config within a GM expectations file. |
| 57 | |
| 58 | Params: |
| 59 | path: path to file which will be modified in place |
| 60 | old: old config name |
| 61 | new: new config name |
| 62 | """ |
| 63 | dic = gm_json.LoadFromFile(file_path=path) |
| 64 | expected_results = dic[gm_json.JSONKEY_EXPECTEDRESULTS] |
| 65 | orig_keys = expected_results.keys() |
| 66 | for key in orig_keys: |
| 67 | result = expected_results.pop(key) |
| 68 | (testname, config) = IMAGE_FILENAME_RE.match(key).groups() |
| 69 | if config == old: |
| 70 | config = new |
| 71 | key = '%s_%s.png' % (testname, config) |
| 72 | expected_results[key] = result |
| 73 | gm_json.WriteToFile(json_dict=dic, file_path=path) |
| 74 | |
| 75 | def _get_file_list(self): |
| 76 | """Returns the list of files we want to operate on (the complete path |
| 77 | to each file).""" |
| 78 | root = self._args.expectations_root |
| 79 | regex = re.compile(self._args.builder_name_pattern) |
| 80 | return [os.path.join(root, builder, 'expected-results.json') |
| 81 | for builder in os.listdir(root) |
| 82 | if regex.match(builder)] |
| 83 | |
| 84 | |
| 85 | def main(): |
| 86 | parser = argparse.ArgumentParser() |
| 87 | parser.add_argument('old_config_name', |
| 88 | help=('Config name we want to replace.')) |
| 89 | parser.add_argument('new_config_name', |
| 90 | help=('Config name we want to replace the old one with.')) |
| 91 | parser.add_argument('builder_name_pattern', |
| 92 | help=('Regex pattern describing which builders we want ' |
| 93 | 'to make the substitution for; \'.*\' to perform ' |
| 94 | 'the replacement on all builders.')) |
| 95 | parser.add_argument('--expectations-root', |
| 96 | default=DEFAULT_EXPECTATIONS_ROOT, |
| 97 | help=('Root of the GM expectations dir; defaults to ' |
| 98 | '%(default)s')) |
| 99 | args = parser.parse_args() |
| 100 | renamer = Renamer(args) |
| 101 | renamer.run() |
| 102 | |
| 103 | if __name__ == '__main__': |
| 104 | main() |