| Index: trunk/tools/rebaseline.py
|
| ===================================================================
|
| --- trunk/tools/rebaseline.py (revision 10814)
|
| +++ trunk/tools/rebaseline.py (working copy)
|
| @@ -13,6 +13,7 @@
|
|
|
| # System-level imports
|
| import argparse
|
| +import json
|
| import os
|
| import re
|
| import subprocess
|
| @@ -34,39 +35,16 @@
|
| os.path.join(os.path.dirname(os.path.dirname(__file__)), 'gm'))
|
| if GM_DIRECTORY not in sys.path:
|
| sys.path.append(GM_DIRECTORY)
|
| +import buildbot_globals
|
| import gm_json
|
|
|
| -# Mapping of expectations/gm subdir (under
|
| -# https://skia.googlecode.com/svn/trunk/expectations/gm/ )
|
| -# 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',
|
| - 'base-android-nexus-4':
|
| - 'Test-Android-Nexus4-Adreno320-Arm7-Release',
|
| -}
|
| +MASTER_HOST_URL = 'http://%s:%s' % (buildbot_globals.Get('master_host'),
|
| + buildbot_globals.Get('external_port'))
|
| +ALL_BUILDERS = list(json.load(urllib2.urlopen(
|
| + MASTER_HOST_URL + '/json/builders')))
|
| +TEST_BUILDERS = filter(lambda x: 'Trybot' not in x and 'Test' in x,
|
| + ALL_BUILDERS)
|
|
|
| -
|
| class _InternalException(Exception):
|
| pass
|
|
|
| @@ -213,17 +191,15 @@
|
| return results_to_return
|
|
|
| # Rebaseline all tests/types we specified in the constructor,
|
| - # within this expectations/gm subdir.
|
| + # within this builder's subdirectory in expectations/gm .
|
| #
|
| # params:
|
| - # subdir : e.g. 'base-shuttle-win7-intel-float'
|
| # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release'
|
| - def RebaselineSubdir(self, subdir, builder):
|
| + def RebaselineSubdir(self, builder):
|
| # Read in the actual result summary, and extract all the tests whose
|
| # results we need to update.
|
| actuals_url = '/'.join([self._actuals_base_url,
|
| - subdir, builder, subdir,
|
| - self._actuals_filename])
|
| + builder, self._actuals_filename])
|
| # In most cases, we won't need to re-record results that are already
|
| # succeeding, but including the SUCCEEDED results will allow us to
|
| # re-record expectations if they somehow get out of sync.
|
| @@ -236,7 +212,7 @@
|
|
|
| # Read in current expectations.
|
| expectations_input_filepath = os.path.join(
|
| - self._expectations_root, subdir, self._expectations_input_filename)
|
| + self._expectations_root, builder, self._expectations_input_filename)
|
| expectations_dict = gm_json.LoadFromFile(expectations_input_filepath)
|
| expected_results = expectations_dict[gm_json.JSONKEY_EXPECTEDRESULTS]
|
|
|
| @@ -261,7 +237,7 @@
|
|
|
| # Write out updated expectations.
|
| expectations_output_filepath = os.path.join(
|
| - self._expectations_root, subdir, self._expectations_output_filename)
|
| + self._expectations_root, builder, self._expectations_output_filename)
|
| gm_json.WriteToFile(expectations_dict, expectations_output_filepath)
|
|
|
| # Mark the JSON file as plaintext, so text-style diffs can be applied.
|
| @@ -278,7 +254,7 @@
|
| 'summaries of actual GM results; defaults to %(default)s',
|
| default='http://skia-autogen.googlecode.com/svn/gm-actual')
|
| parser.add_argument('--actuals-filename',
|
| - help='filename (within platform-specific subdirectories ' +
|
| + help='filename (within builder-specific subdirectories ' +
|
| 'of ACTUALS_BASE_URL) to read a summary of results from; ' +
|
| 'defaults to %(default)s',
|
| default='actual-results.json')
|
| @@ -288,6 +264,10 @@
|
| 'updating expectations for failing tests, add ' +
|
| 'expectations for tests which don\'t have expectations ' +
|
| 'yet.')
|
| +parser.add_argument('--builders', metavar='BUILDER', nargs='+',
|
| + help='which platforms to rebaseline; ' +
|
| + 'if unspecified, rebaseline all platforms, same as ' +
|
| + '"--builders %s"' % ' '.join(sorted(TEST_BUILDERS)))
|
| # TODO(epoger): Add test that exercises --configs argument.
|
| parser.add_argument('--configs', metavar='CONFIG', nargs='+',
|
| help='which configurations to rebaseline, e.g. ' +
|
| @@ -308,17 +288,13 @@
|
| default='')
|
| parser.add_argument('--expectations-root',
|
| help='root of expectations directory to update-- should ' +
|
| - 'contain one or more base-* subdirectories. Defaults to ' +
|
| + 'contain one or more builder subdirectories. Defaults to ' +
|
| '%(default)s',
|
| default=os.path.join('expectations', 'gm'))
|
| parser.add_argument('--keep-going-on-failure', action='store_true',
|
| help='instead of halting at the first error encountered, ' +
|
| 'keep going and rebaseline as many tests as possible, ' +
|
| 'and then report the full set of errors at the end')
|
| -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())))
|
| # TODO(epoger): Add test that exercises --tests argument.
|
| parser.add_argument('--tests', metavar='TEST', nargs='+',
|
| help='which tests to rebaseline, e.g. ' +
|
| @@ -328,27 +304,19 @@
|
| args = parser.parse_args()
|
| exception_handler = ExceptionHandler(
|
| keep_going_on_failure=args.keep_going_on_failure)
|
| -if args.subdirs:
|
| - subdirs = args.subdirs
|
| +if args.builders:
|
| + builders = args.builders
|
| missing_json_is_fatal = True
|
| else:
|
| - subdirs = sorted(SUBDIR_MAPPING.keys())
|
| + builders = sorted(TEST_BUILDERS)
|
| missing_json_is_fatal = False
|
| -for subdir in subdirs:
|
| - if not subdir in SUBDIR_MAPPING.keys():
|
| - raise Exception(('unrecognized platform subdir "%s"; ' +
|
| +for builder in builders:
|
| + if not builder in TEST_BUILDERS:
|
| + raise Exception(('unrecognized builder "%s"; ' +
|
| 'should be one of %s') % (
|
| - subdir, SUBDIR_MAPPING.keys()))
|
| - builder = SUBDIR_MAPPING[subdir]
|
| + builder, TEST_BUILDERS))
|
|
|
| - # We instantiate different Rebaseliner objects depending
|
| - # on whether we are rebaselining an expected-results.json file, or
|
| - # individual image files. Different expectations/gm subdirectories may move
|
| - # from individual image files to JSON-format expectations at different
|
| - # times, so we need to make this determination per subdirectory.
|
| - #
|
| - # See https://goto.google.com/ChecksumTransitionDetail
|
| - expectations_json_file = os.path.join(args.expectations_root, subdir,
|
| + expectations_json_file = os.path.join(args.expectations_root, builder,
|
| args.expectations_filename)
|
| if os.path.isfile(expectations_json_file):
|
| rebaseliner = JsonRebaseliner(
|
| @@ -362,7 +330,7 @@
|
| exception_handler=exception_handler,
|
| add_new=args.add_new)
|
| try:
|
| - rebaseliner.RebaselineSubdir(subdir=subdir, builder=builder)
|
| + rebaseliner.RebaselineSubdir(builder=builder)
|
| except BaseException as e:
|
| exception_handler.RaiseExceptionOrContinue(e)
|
| else:
|
|
|