Chromium Code Reviews| Index: tools/rebaseline_imagefiles.py |
| =================================================================== |
| --- tools/rebaseline_imagefiles.py (revision 9661) |
| +++ tools/rebaseline_imagefiles.py (working copy) |
| @@ -1,20 +1,24 @@ |
| #!/usr/bin/python |
| ''' |
| -Copyright 2012 Google Inc. |
| +Copyright 2013 Google Inc. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| ''' |
| ''' |
| -Rebaselines the given GM tests, on all bots and all configurations. |
| -Must be run from the gm-expected directory. If run from a git or SVN |
| -checkout, the files will be added to the staging area for commit. |
| +Rebaselines GM test results as individual image files |
| +(the "old way", before https://goto.google.com/ChecksumTransitionDetail ). |
|
Stephen White
2013/06/19 17:25:05
Nit: we should probably move this doc to somewhere
epoger
2013/06/19 18:33:00
I think the transition process is "inside baseball
|
| + |
| +Once we have switched our expectations to JSON form for all platforms, |
| +we can delete this file. |
| + |
| +There is a lot of code duplicated between here and rebaseline.py, but |
| +that's fine because we will delete this file soon. |
| ''' |
| # System-level imports |
| -import argparse |
| import os |
| import re |
| import subprocess |
| @@ -39,46 +43,16 @@ |
| import gm_json |
| -# Mapping of gm-expectations subdir (under |
| -# https://skia.googlecode.com/svn/gm-expected/ ) |
| -# to builder name (see list at http://108.170.217.252:10117/builders ) |
| -SUBDIR_MAPPING = { |
| - 'base-shuttle-win7-intel-float': |
| - 'Test-Win7-ShuttleA-HD2000-x86-Release', |
| - 'base-shuttle-win7-intel-angle': |
| - 'Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE', |
| - 'base-shuttle-win7-intel-directwrite': |
| - 'Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite', |
| - 'base-shuttle_ubuntu12_ati5770': |
| - 'Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release', |
| - 'base-macmini': |
| - 'Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release', |
| - 'base-macmini-lion-float': |
| - 'Test-Mac10.7-MacMini4.1-GeForce320M-x86-Release', |
| - 'base-android-galaxy-nexus': |
| - 'Test-Android-GalaxyNexus-SGX540-Arm7-Debug', |
| - 'base-android-nexus-7': |
| - 'Test-Android-Nexus7-Tegra3-Arm7-Release', |
| - 'base-android-nexus-s': |
| - 'Test-Android-NexusS-SGX540-Arm7-Release', |
| - 'base-android-xoom': |
| - 'Test-Android-Xoom-Tegra2-Arm7-Release', |
| - 'base-android-nexus-10': |
| - 'Test-Android-Nexus10-MaliT604-Arm7-Release', |
| -} |
| - |
| - |
| class CommandFailedException(Exception): |
| pass |
| -class Rebaseliner(object): |
| +class ImageRebaseliner(object): |
| # params: |
| + # expectations_root: root directory of all expectations |
| # json_base_url: base URL from which to read json_filename |
| # json_filename: filename (under json_base_url) from which to read a |
| # summary of results; typically "actual-results.json" |
| - # subdirs: which platform subdirectories to rebaseline; if not specified, |
| - # rebaseline all platform subdirectories |
| # tests: list of tests to rebaseline, or None if we should rebaseline |
| # whatever files the JSON results summary file tells us to |
| # configs: which configs to run for each test; this should only be |
| @@ -88,24 +62,22 @@ |
| # files to checkout, display a list of operations that |
| # we would normally perform |
| # add_new: if True, add expectations for tests which don't have any yet |
| - def __init__(self, json_base_url, json_filename, |
| - subdirs=None, tests=None, configs=None, dry_run=False, |
| - add_new=False): |
| + # missing_json_is_fatal: whether to halt execution if we cannot read a |
| + # JSON actual result summary file |
| + def __init__(self, expectations_root, json_base_url, json_filename, |
| + tests=None, configs=None, dry_run=False, |
| + add_new=False, missing_json_is_fatal=False): |
| if configs and not tests: |
| raise ValueError('configs should only be specified if tests ' + |
| 'were specified also') |
| + self._expectations_root = expectations_root |
| self._tests = tests |
| self._configs = configs |
| - if not subdirs: |
| - self._subdirs = sorted(SUBDIR_MAPPING.keys()) |
| - self._missing_json_is_fatal = False |
| - else: |
| - self._subdirs = subdirs |
| - self._missing_json_is_fatal = True |
| self._json_base_url = json_base_url |
| self._json_filename = json_filename |
| self._dry_run = dry_run |
| self._add_new = add_new |
| + self._missing_json_is_fatal = missing_json_is_fatal |
| self._googlestorage_gm_actuals_root = ( |
| 'http://chromium-skia-gm.commondatastorage.googleapis.com/gm') |
| self._testname_pattern = re.compile('(\S+)_(\S+).png') |
| @@ -332,80 +304,38 @@ |
| print '# ' + expectations_subdir + ':' |
| for config in configs: |
| infilename = test + '_' + config + '.png' |
| - outfilename = os.path.join(expectations_subdir, infilename); |
| + outfilename = os.path.join(self._expectations_root, |
| + expectations_subdir, infilename); |
| self._RebaselineOneFile(expectations_subdir=expectations_subdir, |
| builder_name=builder_name, |
| infilename=infilename, |
| outfilename=outfilename, |
| all_results=all_results) |
| - # Rebaseline all platforms/tests/types we specified in the constructor. |
| - def RebaselineAll(self): |
| - for subdir in self._subdirs: |
| - if not subdir in SUBDIR_MAPPING.keys(): |
| - raise Exception(('unrecognized platform subdir "%s"; ' + |
| - 'should be one of %s') % ( |
| - subdir, SUBDIR_MAPPING.keys())) |
| - builder_name = SUBDIR_MAPPING[subdir] |
| - json_url = '/'.join([self._json_base_url, |
| - subdir, builder_name, subdir, |
| - self._json_filename]) |
| - all_results = self._GetActualResults(json_url=json_url) |
| + # Rebaseline all tests/types we specified in the constructor, |
| + # within this gm-expectations subdir. |
| + # |
| + # params: |
| + # subdir : e.g. 'base-shuttle-win7-intel-float' |
| + # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' |
| + def RebaselineSubdir(self, subdir, builder): |
| + json_url = '/'.join([self._json_base_url, |
| + subdir, builder, subdir, |
| + self._json_filename]) |
| + all_results = self._GetActualResults(json_url=json_url) |
| - if self._tests: |
| - for test in self._tests: |
| - self._RebaselineOneTest(expectations_subdir=subdir, |
| - builder_name=builder_name, |
| - test=test, all_results=all_results) |
| - else: # get the raw list of files that need rebaselining from JSON |
| - filenames = self._GetFilesToRebaseline(json_url=json_url, |
| - add_new=self._add_new) |
| - for filename in filenames: |
| - outfilename = os.path.join(subdir, filename); |
| - self._RebaselineOneFile(expectations_subdir=subdir, |
| - builder_name=builder_name, |
| - infilename=filename, |
| - outfilename=outfilename, |
| - all_results=all_results) |
| - |
| -# main... |
| - |
| -parser = argparse.ArgumentParser() |
| -parser.add_argument('--add-new', action='store_true', |
| - help='in addition to the standard behavior of ' + |
| - 'updating expectations for failing tests, add ' + |
| - 'expectations for tests which don\'t have expectations ' + |
| - 'yet.') |
| -parser.add_argument('--configs', metavar='CONFIG', nargs='+', |
| - help='which configurations to rebaseline, e.g. ' + |
| - '"--configs 565 8888"; if unspecified, run a default ' + |
| - 'set of configs. This should ONLY be specified if ' + |
| - '--tests has also been specified.') |
| -parser.add_argument('--dry-run', action='store_true', |
| - help='instead of actually downloading files or adding ' + |
| - 'files to checkout, display a list of operations that ' + |
| - 'we would normally perform') |
| -parser.add_argument('--json-base-url', |
| - help='base URL from which to read JSON_FILENAME ' + |
| - 'files; defaults to %(default)s', |
| - default='http://skia-autogen.googlecode.com/svn/gm-actual') |
| -parser.add_argument('--json-filename', |
| - help='filename (under JSON_BASE_URL) to read a summary ' + |
| - 'of results from; defaults to %(default)s', |
| - default='actual-results.json') |
| -parser.add_argument('--subdirs', metavar='SUBDIR', nargs='+', |
| - help='which platform subdirectories to rebaseline; ' + |
| - 'if unspecified, rebaseline all subdirs, same as ' + |
| - '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys()))) |
| -parser.add_argument('--tests', metavar='TEST', nargs='+', |
| - help='which tests to rebaseline, e.g. ' + |
| - '"--tests aaclip bigmatrix"; if unspecified, then all ' + |
| - 'failing tests (according to the actual-results.json ' + |
| - 'file) will be rebaselined.') |
| -args = parser.parse_args() |
| -rebaseliner = Rebaseliner(tests=args.tests, configs=args.configs, |
| - subdirs=args.subdirs, dry_run=args.dry_run, |
| - json_base_url=args.json_base_url, |
| - json_filename=args.json_filename, |
| - add_new=args.add_new) |
| -rebaseliner.RebaselineAll() |
| + if self._tests: |
| + for test in self._tests: |
| + self._RebaselineOneTest(expectations_subdir=subdir, |
| + builder_name=builder, |
| + test=test, all_results=all_results) |
| + else: # get the raw list of files that need rebaselining from JSON |
| + filenames = self._GetFilesToRebaseline(json_url=json_url, |
| + add_new=self._add_new) |
| + for filename in filenames: |
| + outfilename = os.path.join(subdir, filename); |
| + self._RebaselineOneFile(expectations_subdir=subdir, |
| + builder_name=builder, |
| + infilename=filename, |
| + outfilename=outfilename, |
| + all_results=all_results) |