| 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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 # If dry_run is True, print the command we would have otherwise run. | 89 # If dry_run is True, print the command we would have otherwise run. |
| 90 # Raises a CommandFailedException if the command fails. | 90 # Raises a CommandFailedException if the command fails. |
| 91 def _Call(self, cmd): | 91 def _Call(self, cmd): |
| 92 if self._dry_run: | 92 if self._dry_run: |
| 93 print '%s' % ' '.join(cmd) | 93 print '%s' % ' '.join(cmd) |
| 94 return | 94 return |
| 95 if subprocess.call(cmd) != 0: | 95 if subprocess.call(cmd) != 0: |
| 96 raise CommandFailedException('error running command: ' + | 96 raise CommandFailedException('error running command: ' + |
| 97 ' '.join(cmd)) | 97 ' '.join(cmd)) |
| 98 | 98 |
| 99 # Download a single actual result from GoogleStorage, returning True if it | 99 # Download a single actual result from GoogleStorage. |
| 100 # succeeded. | 100 # Raises an exception if it fails. |
| 101 def _DownloadFromGoogleStorage(self, infilename, outfilename, all_results): | 101 def _DownloadFromGoogleStorage(self, infilename, outfilename, all_results): |
| 102 test_name = self._testname_pattern.match(infilename).group(1) | 102 test_name = self._testname_pattern.match(infilename).group(1) |
| 103 if not test_name: | 103 if not test_name: |
| 104 print '# unable to find test_name for infilename %s' % infilename | 104 raise Exception('unable to find test_name for infilename %s' % |
| 105 return False | 105 infilename) |
| 106 try: | 106 try: |
| 107 hash_type, hash_value = all_results[infilename] | 107 hash_type, hash_value = all_results[infilename] |
| 108 except KeyError: | 108 except KeyError: |
| 109 print ('# unable to find filename %s in all_results dict' % | 109 raise Exception('unable to find filename %s in all_results dict' % |
| 110 infilename) | 110 infilename) |
| 111 return False | |
| 112 except ValueError as e: | 111 except ValueError as e: |
| 113 print '# ValueError reading filename %s from all_results dict: %s'%( | 112 raise Exception( |
| 114 infilename, e) | 113 'ValueError reading filename %s from all_results dict: %s' % ( |
| 115 return False | 114 infilename, e)) |
| 116 url = '%s/%s/%s/%s.png' % (self._googlestorage_gm_actuals_root, | 115 url = '%s/%s/%s/%s.png' % (self._googlestorage_gm_actuals_root, |
| 117 hash_type, test_name, hash_value) | 116 hash_type, test_name, hash_value) |
| 118 try: | 117 try: |
| 119 self._DownloadFile(source_url=url, dest_filename=outfilename) | 118 self._DownloadFile(source_url=url, dest_filename=outfilename) |
| 120 return True | |
| 121 except CommandFailedException: | 119 except CommandFailedException: |
| 122 print '# Couldn\'t fetch gs_url %s' % url | 120 raise Exception('Couldn\'t fetch gs_url %s as outfile %s' % ( |
| 123 return False | 121 url, outfilename)) |
| 124 | 122 |
| 125 # Download a single file, raising a CommandFailedException if it fails. | 123 # Download a single file, raising a CommandFailedException if it fails. |
| 126 def _DownloadFile(self, source_url, dest_filename): | 124 def _DownloadFile(self, source_url, dest_filename): |
| 127 # Download into a temporary file and then rename it afterwards, | 125 # Download into a temporary file and then rename it afterwards, |
| 128 # so that we don't corrupt the existing file if it fails midway thru. | 126 # so that we don't corrupt the existing file if it fails midway thru. |
| 129 temp_filename = os.path.join(os.path.dirname(dest_filename), | 127 temp_filename = os.path.join(os.path.dirname(dest_filename), |
| 130 '.temp-' + os.path.basename(dest_filename)) | 128 '.temp-' + os.path.basename(dest_filename)) |
| 131 | 129 |
| 132 # TODO(epoger): Replace calls to "curl"/"mv" (which will only work on | 130 # TODO(epoger): Replace calls to "curl"/"mv" (which will only work on |
| 133 # Unix) with a Python HTTP library (which should work cross-platform) | 131 # Unix) with a Python HTTP library (which should work cross-platform) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 print '#' | 221 print '#' |
| 224 return files_to_rebaseline | 222 return files_to_rebaseline |
| 225 | 223 |
| 226 # Rebaseline a single file. | 224 # Rebaseline a single file. |
| 227 def _RebaselineOneFile(self, expectations_subdir, builder_name, | 225 def _RebaselineOneFile(self, expectations_subdir, builder_name, |
| 228 infilename, outfilename, all_results): | 226 infilename, outfilename, all_results): |
| 229 if self._dry_run: | 227 if self._dry_run: |
| 230 print '' | 228 print '' |
| 231 print '# ' + infilename | 229 print '# ' + infilename |
| 232 | 230 |
| 233 # Download this result image from Google Storage; if that fails, | 231 # Download this result image from Google Storage. |
| 234 # raise an exception (because if actual-results.json told us that | 232 # If it fails, an exception will be raised. |
| 235 # a particular image version is available for download, we should | 233 self._DownloadFromGoogleStorage(infilename=infilename, |
| 236 # always be able to get it!) | 234 outfilename=outfilename, |
| 237 if not self._DownloadFromGoogleStorage(infilename=infilename, | 235 all_results=all_results) |
| 238 outfilename=outfilename, | |
| 239 all_results=all_results): | |
| 240 raise Exception('# Couldn\'t fetch infilename ' + infilename) | |
| 241 | 236 |
| 242 # Add this file to version control (if appropriate). | 237 # Add this file to version control (if appropriate). |
| 243 if self._add_new: | 238 if self._add_new: |
| 244 if self._is_svn_checkout: | 239 if self._is_svn_checkout: |
| 245 cmd = [ 'svn', 'add', '--quiet', outfilename ] | 240 cmd = [ 'svn', 'add', '--quiet', outfilename ] |
| 246 self._Call(cmd) | 241 self._Call(cmd) |
| 247 cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', | 242 cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', |
| 248 'image/png', outfilename ]; | 243 'image/png', outfilename ]; |
| 249 self._Call(cmd) | 244 self._Call(cmd) |
| 250 elif self._is_git_checkout: | 245 elif self._is_git_checkout: |
| 251 cmd = [ 'git', 'add', outfilename ] | 246 cmd = [ 'git', 'add', outfilename ] |
| 252 self._Call(cmd) | 247 self._Call(cmd) |
| 253 | 248 |
| 254 # Rebaseline all tests/types we specified in the constructor, | 249 # Rebaseline all tests/types we specified in the constructor, |
| 255 # within this gm-expectations subdir. | 250 # within this gm-expectations subdir. |
| 256 # | 251 # |
| 257 # params: | 252 # params: |
| 258 # subdir : e.g. 'base-shuttle-win7-intel-float' | 253 # subdir : e.g. 'base-shuttle-win7-intel-float' |
| 259 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' | 254 # builder : e.g. 'Test-Win7-ShuttleA-HD2000-x86-Release' |
| 260 def RebaselineSubdir(self, subdir, builder): | 255 def RebaselineSubdir(self, subdir, builder): |
| 256 if not os.path.isdir(os.path.join(self._expectations_root, subdir)): |
| 257 raise Exception(( |
| 258 'Could not find "%s" subdir within expectations_root "%s". ' + |
| 259 'Are you sure --expectations-root is pointing at a valid ' + |
| 260 'gm-expected directory?') % (subdir, self._expectations_root)) |
| 261 |
| 261 json_url = '/'.join([self._json_base_url, | 262 json_url = '/'.join([self._json_base_url, |
| 262 subdir, builder, subdir, | 263 subdir, builder, subdir, |
| 263 self._json_filename]) | 264 self._json_filename]) |
| 264 all_results = self._GetActualResults(json_url=json_url) | 265 all_results = self._GetActualResults(json_url=json_url) |
| 265 filenames = self._GetFilesToRebaseline(json_url=json_url, | 266 filenames = self._GetFilesToRebaseline(json_url=json_url, |
| 266 add_new=self._add_new) | 267 add_new=self._add_new) |
| 267 skipped_files = [] | 268 skipped_files = [] |
| 268 for filename in filenames: | 269 for filename in filenames: |
| 269 (test, config) = self._testname_pattern.match(filename).groups() | 270 (test, config) = self._testname_pattern.match(filename).groups() |
| 270 if self._tests: | 271 if self._tests: |
| 271 if test not in self._tests: | 272 if test not in self._tests: |
| 272 skipped_files.append(filename) | 273 skipped_files.append(filename) |
| 273 continue | 274 continue |
| 274 if self._configs: | 275 if self._configs: |
| 275 if config not in self._configs: | 276 if config not in self._configs: |
| 276 skipped_files.append(filename) | 277 skipped_files.append(filename) |
| 277 continue | 278 continue |
| 278 outfilename = os.path.join(subdir, filename); | 279 outfilename = os.path.join(self._expectations_root, subdir, |
| 280 filename); |
| 279 self._RebaselineOneFile(expectations_subdir=subdir, | 281 self._RebaselineOneFile(expectations_subdir=subdir, |
| 280 builder_name=builder, | 282 builder_name=builder, |
| 281 infilename=filename, | 283 infilename=filename, |
| 282 outfilename=outfilename, | 284 outfilename=outfilename, |
| 283 all_results=all_results) | 285 all_results=all_results) |
| 284 | |
| 285 if skipped_files: | |
| 286 print ('Skipped these files due to test/config filters: %s' % | |
| 287 skipped_files) | |
| OLD | NEW |