| 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 HTTP server for our HTML rebaseline viewer. | 9 HTTP server for our HTML rebaseline viewer. |
| 10 """ | 10 """ |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 209 |
| 210 | 210 |
| 211 class Server(object): | 211 class Server(object): |
| 212 """ HTTP server for our HTML rebaseline viewer. """ | 212 """ HTTP server for our HTML rebaseline viewer. """ |
| 213 | 213 |
| 214 def __init__(self, | 214 def __init__(self, |
| 215 actuals_dir=DEFAULT_ACTUALS_DIR, | 215 actuals_dir=DEFAULT_ACTUALS_DIR, |
| 216 actuals_repo_revision=DEFAULT_ACTUALS_REPO_REVISION, | 216 actuals_repo_revision=DEFAULT_ACTUALS_REPO_REVISION, |
| 217 actuals_repo_url=DEFAULT_ACTUALS_REPO_URL, | 217 actuals_repo_url=DEFAULT_ACTUALS_REPO_URL, |
| 218 port=DEFAULT_PORT, export=False, editable=True, | 218 port=DEFAULT_PORT, export=False, editable=True, |
| 219 reload_seconds=0, config_pairs=None): | 219 reload_seconds=0, config_pairs=None, builder_regex_list=None): |
| 220 """ | 220 """ |
| 221 Args: | 221 Args: |
| 222 actuals_dir: directory under which we will check out the latest actual | 222 actuals_dir: directory under which we will check out the latest actual |
| 223 GM results | 223 GM results |
| 224 actuals_repo_revision: revision of actual-results.json files to process | 224 actuals_repo_revision: revision of actual-results.json files to process |
| 225 actuals_repo_url: SVN repo to download actual-results.json files from; | 225 actuals_repo_url: SVN repo to download actual-results.json files from; |
| 226 if None or '', don't fetch new actual-results files at all, | 226 if None or '', don't fetch new actual-results files at all, |
| 227 just compare to whatever files are already in actuals_dir | 227 just compare to whatever files are already in actuals_dir |
| 228 port: which TCP port to listen on for HTTP requests | 228 port: which TCP port to listen on for HTTP requests |
| 229 export: whether to allow HTTP clients on other hosts to access this server | 229 export: whether to allow HTTP clients on other hosts to access this server |
| 230 editable: whether HTTP clients are allowed to submit new baselines | 230 editable: whether HTTP clients are allowed to submit new baselines |
| 231 reload_seconds: polling interval with which to check for new results; | 231 reload_seconds: polling interval with which to check for new results; |
| 232 if 0, don't check for new results at all | 232 if 0, don't check for new results at all |
| 233 config_pairs: List of (string, string) tuples; for each tuple, compare | 233 config_pairs: List of (string, string) tuples; for each tuple, compare |
| 234 actual results of these two configs. If None or empty, | 234 actual results of these two configs. If None or empty, |
| 235 don't compare configs at all. | 235 don't compare configs at all. |
| 236 builder_regex_list: List of regular expressions specifying which builders |
| 237 we will process. If None, process all builders. |
| 236 """ | 238 """ |
| 237 self._actuals_dir = actuals_dir | 239 self._actuals_dir = actuals_dir |
| 238 self._actuals_repo_revision = actuals_repo_revision | 240 self._actuals_repo_revision = actuals_repo_revision |
| 239 self._actuals_repo_url = actuals_repo_url | 241 self._actuals_repo_url = actuals_repo_url |
| 240 self._port = port | 242 self._port = port |
| 241 self._export = export | 243 self._export = export |
| 242 self._editable = editable | 244 self._editable = editable |
| 243 self._reload_seconds = reload_seconds | 245 self._reload_seconds = reload_seconds |
| 244 self._config_pairs = config_pairs or [] | 246 self._config_pairs = config_pairs or [] |
| 247 self._builder_regex_list = builder_regex_list |
| 245 _create_index( | 248 _create_index( |
| 246 file_path=os.path.join( | 249 file_path=os.path.join( |
| 247 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, GENERATED_HTML_SUBDIR, | 250 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, GENERATED_HTML_SUBDIR, |
| 248 "index.html"), | 251 "index.html"), |
| 249 config_pairs=config_pairs) | 252 config_pairs=config_pairs) |
| 250 if actuals_repo_url: | 253 if actuals_repo_url: |
| 251 self._actuals_repo = _create_svn_checkout( | 254 self._actuals_repo = _create_svn_checkout( |
| 252 dir_path=actuals_dir, repo_url=actuals_repo_url) | 255 dir_path=actuals_dir, repo_url=actuals_repo_url) |
| 253 | 256 |
| 254 # Reentrant lock that must be held whenever updating EITHER of: | 257 # Reentrant lock that must be held whenever updating EITHER of: |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 'Updating expected GM results in %s by syncing Skia repo ...' % | 325 'Updating expected GM results in %s by syncing Skia repo ...' % |
| 323 compare_to_expectations.DEFAULT_EXPECTATIONS_DIR) | 326 compare_to_expectations.DEFAULT_EXPECTATIONS_DIR) |
| 324 _run_command(['gclient', 'sync'], TRUNK_DIRECTORY) | 327 _run_command(['gclient', 'sync'], TRUNK_DIRECTORY) |
| 325 | 328 |
| 326 self._results = compare_to_expectations.ExpectationComparisons( | 329 self._results = compare_to_expectations.ExpectationComparisons( |
| 327 actuals_root=self._actuals_dir, | 330 actuals_root=self._actuals_dir, |
| 328 generated_images_root=os.path.join( | 331 generated_images_root=os.path.join( |
| 329 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, | 332 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, |
| 330 GENERATED_IMAGES_SUBDIR), | 333 GENERATED_IMAGES_SUBDIR), |
| 331 diff_base_url=posixpath.join( | 334 diff_base_url=posixpath.join( |
| 332 os.pardir, STATIC_CONTENTS_SUBDIR, GENERATED_IMAGES_SUBDIR)) | 335 os.pardir, STATIC_CONTENTS_SUBDIR, GENERATED_IMAGES_SUBDIR), |
| 336 builder_regex_list=self._builder_regex_list) |
| 333 | 337 |
| 334 json_dir = os.path.join( | 338 json_dir = os.path.join( |
| 335 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, GENERATED_JSON_SUBDIR) | 339 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, GENERATED_JSON_SUBDIR) |
| 336 if not os.path.isdir(json_dir): | 340 if not os.path.isdir(json_dir): |
| 337 os.makedirs(json_dir) | 341 os.makedirs(json_dir) |
| 338 | 342 |
| 339 for config_pair in self._config_pairs: | 343 for config_pair in self._config_pairs: |
| 340 config_comparisons = compare_configs.ConfigComparisons( | 344 config_comparisons = compare_configs.ConfigComparisons( |
| 341 configs=config_pair, | 345 configs=config_pair, |
| 342 actuals_root=self._actuals_dir, | 346 actuals_root=self._actuals_dir, |
| 343 generated_images_root=os.path.join( | 347 generated_images_root=os.path.join( |
| 344 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, | 348 PARENT_DIRECTORY, STATIC_CONTENTS_SUBDIR, |
| 345 GENERATED_IMAGES_SUBDIR), | 349 GENERATED_IMAGES_SUBDIR), |
| 346 diff_base_url=posixpath.join( | 350 diff_base_url=posixpath.join( |
| 347 os.pardir, GENERATED_IMAGES_SUBDIR)) | 351 os.pardir, GENERATED_IMAGES_SUBDIR), |
| 352 builder_regex_list=self._builder_regex_list) |
| 348 for summary_type in SUMMARY_TYPES: | 353 for summary_type in SUMMARY_TYPES: |
| 349 gm_json.WriteToFile( | 354 gm_json.WriteToFile( |
| 350 config_comparisons.get_packaged_results_of_type( | 355 config_comparisons.get_packaged_results_of_type( |
| 351 results_type=summary_type), | 356 results_type=summary_type), |
| 352 os.path.join( | 357 os.path.join( |
| 353 json_dir, '%s-vs-%s_%s.json' % ( | 358 json_dir, '%s-vs-%s_%s.json' % ( |
| 354 config_pair[0], config_pair[1], summary_type))) | 359 config_pair[0], config_pair[1], summary_type))) |
| 355 | 360 |
| 356 def _result_loader(self, reload_seconds=0): | 361 def _result_loader(self, reload_seconds=0): |
| 357 """ Call self.update_results(), either once or periodically. | 362 """ Call self.update_results(), either once or periodically. |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 'files from. Defaults to %(default)s ; if set to ' | 625 'files from. Defaults to %(default)s ; if set to ' |
| 621 'empty string, just compare to actual-results ' | 626 'empty string, just compare to actual-results ' |
| 622 'already found in ACTUALS_DIR.'), | 627 'already found in ACTUALS_DIR.'), |
| 623 default=DEFAULT_ACTUALS_REPO_URL) | 628 default=DEFAULT_ACTUALS_REPO_URL) |
| 624 parser.add_argument('--actuals-revision', | 629 parser.add_argument('--actuals-revision', |
| 625 help=('revision of actual-results.json files to process. ' | 630 help=('revision of actual-results.json files to process. ' |
| 626 'Defaults to %(default)s . Beware of setting this ' | 631 'Defaults to %(default)s . Beware of setting this ' |
| 627 'argument in conjunction with --editable; you ' | 632 'argument in conjunction with --editable; you ' |
| 628 'probably only want to edit results at HEAD.'), | 633 'probably only want to edit results at HEAD.'), |
| 629 default=DEFAULT_ACTUALS_REPO_REVISION) | 634 default=DEFAULT_ACTUALS_REPO_REVISION) |
| 635 parser.add_argument('--builders', metavar='BUILDER_REGEX', nargs='+', |
| 636 help=('Only process builders matching these regular ' |
| 637 'expressions. If unspecified, process all ' |
| 638 'builders.')) |
| 630 parser.add_argument('--compare-configs', action='store_true', | 639 parser.add_argument('--compare-configs', action='store_true', |
| 631 help=('In addition to generating differences between ' | 640 help=('In addition to generating differences between ' |
| 632 'expectations and actuals, also generate ' | 641 'expectations and actuals, also generate ' |
| 633 'differences between these config pairs: ' | 642 'differences between these config pairs: ' |
| 634 + str(CONFIG_PAIRS_TO_COMPARE))) | 643 + str(CONFIG_PAIRS_TO_COMPARE))) |
| 635 parser.add_argument('--editable', action='store_true', | 644 parser.add_argument('--editable', action='store_true', |
| 636 help=('Allow HTTP clients to submit new baselines.')) | 645 help=('Allow HTTP clients to submit new baselines.')) |
| 637 parser.add_argument('--export', action='store_true', | 646 parser.add_argument('--export', action='store_true', |
| 638 help=('Instead of only allowing access from HTTP clients ' | 647 help=('Instead of only allowing access from HTTP clients ' |
| 639 'on localhost, allow HTTP clients on other hosts ' | 648 'on localhost, allow HTTP clients on other hosts ' |
| (...skipping 16 matching lines...) Expand all Loading... |
| 656 if args.compare_configs: | 665 if args.compare_configs: |
| 657 config_pairs = CONFIG_PAIRS_TO_COMPARE | 666 config_pairs = CONFIG_PAIRS_TO_COMPARE |
| 658 else: | 667 else: |
| 659 config_pairs = None | 668 config_pairs = None |
| 660 | 669 |
| 661 global _SERVER | 670 global _SERVER |
| 662 _SERVER = Server(actuals_dir=args.actuals_dir, | 671 _SERVER = Server(actuals_dir=args.actuals_dir, |
| 663 actuals_repo_revision=args.actuals_revision, | 672 actuals_repo_revision=args.actuals_revision, |
| 664 actuals_repo_url=args.actuals_repo, | 673 actuals_repo_url=args.actuals_repo, |
| 665 port=args.port, export=args.export, editable=args.editable, | 674 port=args.port, export=args.export, editable=args.editable, |
| 666 reload_seconds=args.reload, config_pairs=config_pairs) | 675 reload_seconds=args.reload, config_pairs=config_pairs, |
| 676 builder_regex_list=args.builders) |
| 667 _SERVER.run() | 677 _SERVER.run() |
| 668 | 678 |
| 669 | 679 |
| 670 if __name__ == '__main__': | 680 if __name__ == '__main__': |
| 671 main() | 681 main() |
| OLD | NEW |