| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 ''' | 3 ''' |
| 4 Copyright 2013 Google Inc. | 4 Copyright 2013 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 ''' |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 class CommandFailedException(Exception): | 46 class CommandFailedException(Exception): |
| 47 pass | 47 pass |
| 48 | 48 |
| 49 class ImageRebaseliner(object): | 49 class ImageRebaseliner(object): |
| 50 | 50 |
| 51 # params: | 51 # params: |
| 52 # expectations_root: root directory of all expectations | 52 # expectations_root: root directory of all expectations |
| 53 # json_base_url: base URL from which to read json_filename | 53 # json_base_url: base URL from which to read json_filename |
| 54 # json_filename: filename (under json_base_url) from which to read a | 54 # json_filename: filename (under json_base_url) from which to read a |
| 55 # summary of results; typically "actual-results.json" | 55 # summary of results; typically "actual-results.json" |
| 56 # exception_handler: reference to rebaseline.ExceptionHandler object |
| 56 # tests: list of tests to rebaseline, or None if we should rebaseline | 57 # tests: list of tests to rebaseline, or None if we should rebaseline |
| 57 # whatever files the JSON results summary file tells us to | 58 # whatever files the JSON results summary file tells us to |
| 58 # configs: which configs to run for each test, or None if we should | 59 # configs: which configs to run for each test, or None if we should |
| 59 # rebaseline whatever configs the JSON results summary file tells | 60 # rebaseline whatever configs the JSON results summary file tells |
| 60 # us to | 61 # us to |
| 61 # dry_run: if True, instead of actually downloading files or adding | 62 # dry_run: if True, instead of actually downloading files or adding |
| 62 # files to checkout, display a list of operations that | 63 # files to checkout, display a list of operations that |
| 63 # we would normally perform | 64 # we would normally perform |
| 64 # add_new: if True, add expectations for tests which don't have any yet | 65 # add_new: if True, add expectations for tests which don't have any yet |
| 65 # missing_json_is_fatal: whether to halt execution if we cannot read a | 66 # missing_json_is_fatal: whether to halt execution if we cannot read a |
| 66 # JSON actual result summary file | 67 # JSON actual result summary file |
| 67 def __init__(self, expectations_root, json_base_url, json_filename, | 68 def __init__(self, expectations_root, json_base_url, json_filename, |
| 68 tests=None, configs=None, dry_run=False, | 69 exception_handler, tests=None, configs=None, dry_run=False, |
| 69 add_new=False, missing_json_is_fatal=False): | 70 add_new=False, missing_json_is_fatal=False): |
| 70 self._expectations_root = expectations_root | 71 self._expectations_root = expectations_root |
| 71 self._tests = tests | 72 self._tests = tests |
| 72 self._configs = configs | 73 self._configs = configs |
| 73 self._json_base_url = json_base_url | 74 self._json_base_url = json_base_url |
| 74 self._json_filename = json_filename | 75 self._json_filename = json_filename |
| 76 self._exception_handler = exception_handler |
| 75 self._dry_run = dry_run | 77 self._dry_run = dry_run |
| 76 self._add_new = add_new | 78 self._add_new = add_new |
| 77 self._missing_json_is_fatal = missing_json_is_fatal | 79 self._missing_json_is_fatal = missing_json_is_fatal |
| 78 self._googlestorage_gm_actuals_root = ( | 80 self._googlestorage_gm_actuals_root = ( |
| 79 'http://chromium-skia-gm.commondatastorage.googleapis.com/gm') | 81 'http://chromium-skia-gm.commondatastorage.googleapis.com/gm') |
| 80 self._testname_pattern = re.compile('(\S+)_(\S+).png') | 82 self._testname_pattern = re.compile('(\S+)_(\S+).png') |
| 81 self._is_svn_checkout = ( | 83 self._is_svn_checkout = ( |
| 82 os.path.exists(os.path.join(expectations_root, '.svn')) or | 84 os.path.exists(os.path.join(expectations_root, '.svn')) or |
| 83 os.path.exists(os.path.join(expectations_root, os.pardir, '.svn'))) | 85 os.path.exists(os.path.join(expectations_root, os.pardir, '.svn'))) |
| 84 self._is_git_checkout = ( | 86 self._is_git_checkout = ( |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 self._Call(cmd) | 249 self._Call(cmd) |
| 248 | 250 |
| 249 # Rebaseline all tests/types we specified in the constructor, | 251 # Rebaseline all tests/types we specified in the constructor, |
| 250 # within this gm-expectations subdir. | 252 # within this gm-expectations subdir. |
| 251 # | 253 # |
| 252 # params: | 254 # params: |
| 253 # subdir : e.g. 'base-shuttle-win7-intel-float' | 255 # subdir : e.g. 'base-shuttle-win7-intel-float' |
| 254 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' | 256 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' |
| 255 def RebaselineSubdir(self, subdir, builder): | 257 def RebaselineSubdir(self, subdir, builder): |
| 256 if not os.path.isdir(os.path.join(self._expectations_root, subdir)): | 258 if not os.path.isdir(os.path.join(self._expectations_root, subdir)): |
| 257 raise Exception(( | 259 self._exception_handler.RaiseExceptionOrContinue(Exception(( |
| 258 'Could not find "%s" subdir within expectations_root "%s". ' + | 260 'Could not find "%s" subdir within expectations_root "%s". ' + |
| 259 'Are you sure --expectations-root is pointing at a valid ' + | 261 'Are you sure --expectations-root is pointing at a valid ' + |
| 260 'gm-expected directory?') % (subdir, self._expectations_root)) | 262 'gm-expected directory?') % (subdir, self._expectations_root))) |
| 263 return |
| 261 | 264 |
| 262 json_url = '/'.join([self._json_base_url, | 265 json_url = '/'.join([self._json_base_url, |
| 263 subdir, builder, subdir, | 266 subdir, builder, subdir, |
| 264 self._json_filename]) | 267 self._json_filename]) |
| 265 all_results = self._GetActualResults(json_url=json_url) | 268 all_results = self._GetActualResults(json_url=json_url) |
| 266 filenames = self._GetFilesToRebaseline(json_url=json_url, | 269 filenames = self._GetFilesToRebaseline(json_url=json_url, |
| 267 add_new=self._add_new) | 270 add_new=self._add_new) |
| 268 skipped_files = [] | 271 skipped_files = [] |
| 269 for filename in filenames: | 272 for filename in filenames: |
| 270 (test, config) = self._testname_pattern.match(filename).groups() | 273 (test, config) = self._testname_pattern.match(filename).groups() |
| 271 if self._tests: | 274 if self._tests: |
| 272 if test not in self._tests: | 275 if test not in self._tests: |
| 273 skipped_files.append(filename) | 276 skipped_files.append(filename) |
| 274 continue | 277 continue |
| 275 if self._configs: | 278 if self._configs: |
| 276 if config not in self._configs: | 279 if config not in self._configs: |
| 277 skipped_files.append(filename) | 280 skipped_files.append(filename) |
| 278 continue | 281 continue |
| 279 outfilename = os.path.join(self._expectations_root, subdir, | 282 outfilename = os.path.join(self._expectations_root, subdir, |
| 280 filename); | 283 filename); |
| 281 # TODO(epoger): Until we resolve | |
| 282 # https://code.google.com/p/skia/issues/detail?id=1410 ('some GM | |
| 283 # result images not available for download from Google Storage'), | |
| 284 # keep going in the face of missing results for any one test. | |
| 285 try: | 284 try: |
| 286 self._RebaselineOneFile(expectations_subdir=subdir, | 285 self._RebaselineOneFile(expectations_subdir=subdir, |
| 287 builder_name=builder, | 286 builder_name=builder, |
| 288 infilename=filename, | 287 infilename=filename, |
| 289 outfilename=outfilename, | 288 outfilename=outfilename, |
| 290 all_results=all_results) | 289 all_results=all_results) |
| 291 except Exception as e: | 290 except BaseException as e: |
| 292 print 'WARNING: swallowing exception %s' % e | 291 self._exception_handler.RaiseExceptionOrContinue(e) |
| OLD | NEW |