diff options
author | 2014-07-17 08:22:12 -0700 | |
---|---|---|
committer | 2014-07-17 08:22:12 -0700 | |
commit | a8f774549e35b743afae35e3436f73e8849e869d (patch) | |
tree | 671904064e92f28ca5638a6550e7b66c8f9ec10d | |
parent | ac298384b33efaa9e87431dd42a7270753de9864 (diff) |
create copy_config.py and rename_config.py for skbug 2752
BUG=skia:2752
NOTRY=True
(SkipBuildbotRuns)
R=bsalomon@google.com
Author: epoger@google.com
Review URL: https://codereview.chromium.org/397293002
-rwxr-xr-x | gm/copy_config.py | 104 | ||||
-rwxr-xr-x | gm/rename_config.py | 104 |
2 files changed, 208 insertions, 0 deletions
diff --git a/gm/copy_config.py b/gm/copy_config.py new file mode 100755 index 0000000000..57743ae895 --- /dev/null +++ b/gm/copy_config.py @@ -0,0 +1,104 @@ +#!/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() diff --git a/gm/rename_config.py b/gm/rename_config.py new file mode 100755 index 0000000000..d1c6d568a7 --- /dev/null +++ b/gm/rename_config.py @@ -0,0 +1,104 @@ +#!/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() |