OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 | 2 |
3 ''' | 3 ''' |
4 Copyright 2012 Google Inc. | 4 Copyright 2012 Google Inc. |
5 | 5 |
6 Use of this source code is governed by a BSD-style license that can be | 6 Use of this source code is governed by a BSD-style license that can be |
7 found in the LICENSE file. | 7 found in the LICENSE file. |
8 ''' | 8 ''' |
9 | 9 |
10 ''' | 10 ''' |
11 Rebaselines the given GM tests, on all bots and all configurations. | 11 Rebaselines the given GM tests, on all bots and all configurations. |
12 Must be run from the gm-expected directory. If run from a git or SVN | |
13 checkout, the files will be added to the staging area for commit. | |
14 | 12 |
15 TODO(epoger): Fix indentation in this file (2-space indents, not 4-space). | 13 TODO(epoger): Fix indentation in this file (2-space indents, not 4-space). |
16 ''' | 14 ''' |
17 | 15 |
18 # System-level imports | 16 # System-level imports |
19 import argparse | 17 import argparse |
20 import os | 18 import os |
21 import re | 19 import re |
22 import sys | 20 import sys |
23 import urllib2 | 21 import urllib2 |
(...skipping 11 matching lines...) Expand all Loading... |
35 # | 33 # |
36 # This assumes that the 'gm' directory has been checked out as a sibling of | 34 # This assumes that the 'gm' directory has been checked out as a sibling of |
37 # the 'tools' directory containing this script, which will be the case if | 35 # the 'tools' directory containing this script, which will be the case if |
38 # 'trunk' was checked out as a single unit. | 36 # 'trunk' was checked out as a single unit. |
39 GM_DIRECTORY = os.path.realpath( | 37 GM_DIRECTORY = os.path.realpath( |
40 os.path.join(os.path.dirname(os.path.dirname(__file__)), 'gm')) | 38 os.path.join(os.path.dirname(os.path.dirname(__file__)), 'gm')) |
41 if GM_DIRECTORY not in sys.path: | 39 if GM_DIRECTORY not in sys.path: |
42 sys.path.append(GM_DIRECTORY) | 40 sys.path.append(GM_DIRECTORY) |
43 import gm_json | 41 import gm_json |
44 | 42 |
45 # Mapping of gm-expectations subdir (under | 43 # Mapping of expectations/gm subdir (under |
46 # https://skia.googlecode.com/svn/gm-expected/ ) | 44 # https://skia.googlecode.com/svn/trunk/expectations/gm/ ) |
47 # to builder name (see list at http://108.170.217.252:10117/builders ) | 45 # to builder name (see list at http://108.170.217.252:10117/builders ) |
48 SUBDIR_MAPPING = { | 46 SUBDIR_MAPPING = { |
49 'base-shuttle-win7-intel-float': | 47 'base-shuttle-win7-intel-float': |
50 'Test-Win7-ShuttleA-HD2000-x86-Release', | 48 'Test-Win7-ShuttleA-HD2000-x86-Release', |
51 'base-shuttle-win7-intel-angle': | 49 'base-shuttle-win7-intel-angle': |
52 'Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE', | 50 'Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE', |
53 'base-shuttle-win7-intel-directwrite': | 51 'base-shuttle-win7-intel-directwrite': |
54 'Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite', | 52 'Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite', |
55 'base-shuttle_ubuntu12_ati5770': | 53 'base-shuttle_ubuntu12_ati5770': |
56 'Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release', | 54 'Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release', |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 actual_results = json_dict[gm_json.JSONKEY_ACTUALRESULTS] | 196 actual_results = json_dict[gm_json.JSONKEY_ACTUALRESULTS] |
199 if not sections: | 197 if not sections: |
200 sections = actual_results.keys() | 198 sections = actual_results.keys() |
201 for section in sections: | 199 for section in sections: |
202 section_results = actual_results[section] | 200 section_results = actual_results[section] |
203 if section_results: | 201 if section_results: |
204 results_to_return.update(section_results) | 202 results_to_return.update(section_results) |
205 return results_to_return | 203 return results_to_return |
206 | 204 |
207 # Rebaseline all tests/types we specified in the constructor, | 205 # Rebaseline all tests/types we specified in the constructor, |
208 # within this gm-expectations subdir. | 206 # within this expectations/gm subdir. |
209 # | 207 # |
210 # params: | 208 # params: |
211 # subdir : e.g. 'base-shuttle-win7-intel-float' | 209 # subdir : e.g. 'base-shuttle-win7-intel-float' |
212 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' | 210 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' |
213 def RebaselineSubdir(self, subdir, builder): | 211 def RebaselineSubdir(self, subdir, builder): |
214 # Read in the actual result summary, and extract all the tests whose | 212 # Read in the actual result summary, and extract all the tests whose |
215 # results we need to update. | 213 # results we need to update. |
216 actuals_url = '/'.join([self._actuals_base_url, | 214 actuals_url = '/'.join([self._actuals_base_url, |
217 subdir, builder, subdir, | 215 subdir, builder, subdir, |
218 self._actuals_filename]) | 216 self._actuals_filename]) |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 'we would normally perform') | 287 'we would normally perform') |
290 parser.add_argument('--expectations-filename', | 288 parser.add_argument('--expectations-filename', |
291 help='filename (under EXPECTATIONS_ROOT) to read ' + | 289 help='filename (under EXPECTATIONS_ROOT) to read ' + |
292 'current expectations from, and to write new ' + | 290 'current expectations from, and to write new ' + |
293 'expectations into; defaults to %(default)s', | 291 'expectations into; defaults to %(default)s', |
294 default='expected-results.json') | 292 default='expected-results.json') |
295 parser.add_argument('--expectations-root', | 293 parser.add_argument('--expectations-root', |
296 help='root of expectations directory to update-- should ' + | 294 help='root of expectations directory to update-- should ' + |
297 'contain one or more base-* subdirectories. Defaults to ' + | 295 'contain one or more base-* subdirectories. Defaults to ' + |
298 '%(default)s', | 296 '%(default)s', |
299 default='.') | 297 default=os.path.join('expectations', 'gm')) |
300 parser.add_argument('--keep-going-on-failure', action='store_true', | 298 parser.add_argument('--keep-going-on-failure', action='store_true', |
301 help='instead of halting at the first error encountered, ' + | 299 help='instead of halting at the first error encountered, ' + |
302 'keep going and rebaseline as many tests as possible, ' + | 300 'keep going and rebaseline as many tests as possible, ' + |
303 'and then report the full set of errors at the end') | 301 'and then report the full set of errors at the end') |
304 parser.add_argument('--subdirs', metavar='SUBDIR', nargs='+', | 302 parser.add_argument('--subdirs', metavar='SUBDIR', nargs='+', |
305 help='which platform subdirectories to rebaseline; ' + | 303 help='which platform subdirectories to rebaseline; ' + |
306 'if unspecified, rebaseline all subdirs, same as ' + | 304 'if unspecified, rebaseline all subdirs, same as ' + |
307 '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys()))) | 305 '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys()))) |
308 # TODO(epoger): Add test that exercises --tests argument. | 306 # TODO(epoger): Add test that exercises --tests argument. |
309 parser.add_argument('--tests', metavar='TEST', nargs='+', | 307 parser.add_argument('--tests', metavar='TEST', nargs='+', |
(...skipping 12 matching lines...) Expand all Loading... |
322 missing_json_is_fatal = False | 320 missing_json_is_fatal = False |
323 for subdir in subdirs: | 321 for subdir in subdirs: |
324 if not subdir in SUBDIR_MAPPING.keys(): | 322 if not subdir in SUBDIR_MAPPING.keys(): |
325 raise Exception(('unrecognized platform subdir "%s"; ' + | 323 raise Exception(('unrecognized platform subdir "%s"; ' + |
326 'should be one of %s') % ( | 324 'should be one of %s') % ( |
327 subdir, SUBDIR_MAPPING.keys())) | 325 subdir, SUBDIR_MAPPING.keys())) |
328 builder = SUBDIR_MAPPING[subdir] | 326 builder = SUBDIR_MAPPING[subdir] |
329 | 327 |
330 # We instantiate different Rebaseliner objects depending | 328 # We instantiate different Rebaseliner objects depending |
331 # on whether we are rebaselining an expected-results.json file, or | 329 # on whether we are rebaselining an expected-results.json file, or |
332 # individual image files. Different gm-expected subdirectories may move | 330 # individual image files. Different expectations/gm subdirectories may move |
333 # from individual image files to JSON-format expectations at different | 331 # from individual image files to JSON-format expectations at different |
334 # times, so we need to make this determination per subdirectory. | 332 # times, so we need to make this determination per subdirectory. |
335 # | 333 # |
336 # See https://goto.google.com/ChecksumTransitionDetail | 334 # See https://goto.google.com/ChecksumTransitionDetail |
337 expectations_json_file = os.path.join(args.expectations_root, subdir, | 335 expectations_json_file = os.path.join(args.expectations_root, subdir, |
338 args.expectations_filename) | 336 args.expectations_filename) |
339 if os.path.isfile(expectations_json_file): | 337 if os.path.isfile(expectations_json_file): |
340 rebaseliner = JsonRebaseliner( | 338 rebaseliner = JsonRebaseliner( |
341 expectations_root=args.expectations_root, | 339 expectations_root=args.expectations_root, |
342 expectations_filename=args.expectations_filename, | 340 expectations_filename=args.expectations_filename, |
(...skipping 18 matching lines...) Expand all Loading... |
361 exception_handler=exception_handler, | 359 exception_handler=exception_handler, |
362 add_new=args.add_new, | 360 add_new=args.add_new, |
363 missing_json_is_fatal=missing_json_is_fatal) | 361 missing_json_is_fatal=missing_json_is_fatal) |
364 | 362 |
365 try: | 363 try: |
366 rebaseliner.RebaselineSubdir(subdir=subdir, builder=builder) | 364 rebaseliner.RebaselineSubdir(subdir=subdir, builder=builder) |
367 except BaseException as e: | 365 except BaseException as e: |
368 exception_handler.RaiseExceptionOrContinue(e) | 366 exception_handler.RaiseExceptionOrContinue(e) |
369 | 367 |
370 exception_handler.ReportAllFailures() | 368 exception_handler.ReportAllFailures() |
OLD | NEW |