OLD | NEW |
---|---|
1 # Copyright (c) 2010 Google Inc. All rights reserved. | 1 # Copyright (c) 2010 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 def _port_skips_test(port, test, generic_expectations, full_expectations): | 427 def _port_skips_test(port, test, generic_expectations, full_expectations): |
428 fs = port.host.filesystem | 428 fs = port.host.filesystem |
429 if port.default_smoke_test_only(): | 429 if port.default_smoke_test_only(): |
430 smoke_test_filename = fs.join(port.layout_tests_dir(), 'SmokeTests') | 430 smoke_test_filename = fs.join(port.layout_tests_dir(), 'SmokeTests') |
431 if fs.exists(smoke_test_filename) and test not in fs.read_text_file( smoke_test_filename): | 431 if fs.exists(smoke_test_filename) and test not in fs.read_text_file( smoke_test_filename): |
432 return True | 432 return True |
433 | 433 |
434 return (SKIP in full_expectations.get_expectations(test) and | 434 return (SKIP in full_expectations.get_expectations(test) and |
435 SKIP not in generic_expectations.get_expectations(test)) | 435 SKIP not in generic_expectations.get_expectations(test)) |
436 | 436 |
437 def _run_in_parallel_and_update_scm(self, commands): | 437 def _run_in_parallel(self, commands, update_scm=True): |
438 if not commands: | 438 if not commands: |
439 return {} | 439 return {} |
440 | 440 |
441 command_results = self._tool.executive.run_in_parallel(commands) | 441 command_results = self._tool.executive.run_in_parallel(commands) |
442 log_output = '\n'.join(result[2] for result in command_results).replace( '\n\n', '\n') | 442 log_output = '\n'.join(result[2] for result in command_results).replace( '\n\n', '\n') |
443 for line in log_output.split('\n'): | 443 for line in log_output.split('\n'): |
444 if line: | 444 if line: |
445 _log.error(line) | 445 _log.error(line) |
446 | 446 |
447 files_to_add, files_to_delete, lines_to_remove = self._serial_commands(c ommand_results) | 447 files_to_add, files_to_delete, lines_to_remove = self._serial_commands(c ommand_results) |
448 if files_to_delete: | 448 # TODO(qyearsley): Consider removing this if possible, |
449 self._tool.scm().delete_list(files_to_delete) | 449 # or making it work and produce reasonable results for rebaseline-cl. |
qyearsley
2016/08/19 22:45:46
Some thoughts: maybe if all file additions and del
wkorman
2016/08/19 22:54:07
Yeah, auto-rebaseline has to commit so that it can
| |
450 if files_to_add: | 450 if update_scm: |
wkorman
2016/08/19 22:54:07
How much of a pain to add unit test to make sure t
qyearsley
2016/08/19 23:32:27
Hmm, maybe not too much. Possible test methods cou
wkorman
2016/08/20 00:58:29
Am ok with waiting on test as we hope to turn auto
| |
451 self._tool.scm().add_list(files_to_add) | 451 if files_to_delete: |
452 self._tool.scm().delete_list(files_to_delete) | |
453 if files_to_add: | |
454 self._tool.scm().add_list(files_to_add) | |
452 return lines_to_remove | 455 return lines_to_remove |
453 | 456 |
454 def _rebaseline(self, options, test_prefix_list): | 457 def _rebaseline(self, options, test_prefix_list, update_scm=True): |
455 """Downloads new baselines in parallel, then updates expectations files | 458 """Downloads new baselines in parallel, then updates expectations files |
456 and optimizes baselines. | 459 and optimizes baselines. |
457 | 460 |
458 Args: | 461 Args: |
459 options: An object with the options passed to the current command. | 462 options: An object with the options passed to the current command. |
460 test_prefix_list: A map of test names to Build objects to file suffi xes | 463 test_prefix_list: A map of test names to Build objects to file suffi xes |
461 for new baselines. For example: | 464 for new baselines. For example: |
462 { | 465 { |
463 "some/test.html": {Build("builder-1", 412): ["txt"], Build(" builder-2", 100): ["txt"]}, | 466 "some/test.html": {Build("builder-1", 412): ["txt"], Build(" builder-2", 100): ["txt"]}, |
464 "some/other.html": {Build("builder-1", 412): ["txt"]} | 467 "some/other.html": {Build("builder-1", 412): ["txt"]} |
465 } | 468 } |
466 This would mean that new text baselines should be downloaded for | 469 This would mean that new text baselines should be downloaded for |
467 "some/test.html" on both builder-1 (build 412) and builder-2 | 470 "some/test.html" on both builder-1 (build 412) and builder-2 |
468 (build 100), and new text baselines should be downloaded for | 471 (build 100), and new text baselines should be downloaded for |
469 "some/other.html" but only from builder-1. | 472 "some/other.html" but only from builder-1. |
470 TODO(qyearsley): Replace test_prefix_list everywhere with some | 473 TODO(qyearsley): Replace test_prefix_list everywhere with some |
471 sort of class that contains the same data. | 474 sort of class that contains the same data. |
475 update_scm: If True, commands like `git add` and `git rm` will be ru n. | |
472 """ | 476 """ |
473 for test, builds_to_check in sorted(test_prefix_list.items()): | 477 for test, builds_to_check in sorted(test_prefix_list.items()): |
474 _log.info("Rebaselining %s", test) | 478 _log.info("Rebaselining %s", test) |
475 for build, suffixes in sorted(builds_to_check.items()): | 479 for build, suffixes in sorted(builds_to_check.items()): |
476 _log.debug(" %s: %s", build, ",".join(suffixes)) | 480 _log.debug(" %s: %s", build, ",".join(suffixes)) |
477 | 481 |
478 copy_baseline_commands, rebaseline_commands, extra_lines_to_remove = sel f._rebaseline_commands( | 482 copy_baseline_commands, rebaseline_commands, extra_lines_to_remove = sel f._rebaseline_commands( |
479 test_prefix_list, options) | 483 test_prefix_list, options) |
480 lines_to_remove = {} | 484 lines_to_remove = {} |
481 | 485 |
482 self._run_in_parallel_and_update_scm(copy_baseline_commands) | 486 self._run_in_parallel(copy_baseline_commands, update_scm=update_scm) |
483 lines_to_remove = self._run_in_parallel_and_update_scm(rebaseline_comman ds) | 487 lines_to_remove = self._run_in_parallel(rebaseline_commands, update_scm= update_scm) |
484 | 488 |
485 for test in extra_lines_to_remove: | 489 for test in extra_lines_to_remove: |
486 if test in lines_to_remove: | 490 if test in lines_to_remove: |
487 lines_to_remove[test] = lines_to_remove[test] + extra_lines_to_r emove[test] | 491 lines_to_remove[test] = lines_to_remove[test] + extra_lines_to_r emove[test] |
488 else: | 492 else: |
489 lines_to_remove[test] = extra_lines_to_remove[test] | 493 lines_to_remove[test] = extra_lines_to_remove[test] |
490 | 494 |
491 if lines_to_remove: | 495 if lines_to_remove: |
492 self._update_expectations_files(lines_to_remove) | 496 self._update_expectations_files(lines_to_remove) |
493 | 497 |
494 if options.optimize: | 498 if options.optimize: |
495 # TODO(wkorman): Consider changing temporary branch to base off of H EAD rather than | 499 # TODO(wkorman): Consider changing temporary branch to base off of H EAD rather than |
496 # origin/master to ensure we run baseline optimization processes wit h the same code as | 500 # origin/master to ensure we run baseline optimization processes wit h the same code as |
497 # auto-rebaseline itself. | 501 # auto-rebaseline itself. |
498 self._run_in_parallel_and_update_scm(self._optimize_baselines(test_p refix_list, options.verbose)) | 502 self._run_in_parallel(self._optimize_baselines(test_prefix_list, opt ions.verbose), update_scm=update_scm) |
499 | 503 |
500 def _suffixes_for_actual_failures(self, test, build, existing_suffixes): | 504 def _suffixes_for_actual_failures(self, test, build, existing_suffixes): |
501 """Gets the baseline suffixes for actual mismatch failures in some resul ts. | 505 """Gets the baseline suffixes for actual mismatch failures in some resul ts. |
502 | 506 |
503 Args: | 507 Args: |
504 test: A full test path string. | 508 test: A full test path string. |
505 build: A Build object. | 509 build: A Build object. |
506 existing_suffixes: A collection of all suffixes to consider. | 510 existing_suffixes: A collection of all suffixes to consider. |
507 | 511 |
508 Returns: | 512 Returns: |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
622 for test in args: | 626 for test in args: |
623 if test not in test_prefix_list: | 627 if test not in test_prefix_list: |
624 test_prefix_list[test] = {} | 628 test_prefix_list[test] = {} |
625 build = Build(builder) | 629 build = Build(builder) |
626 test_prefix_list[test][build] = suffixes_to_update | 630 test_prefix_list[test][build] = suffixes_to_update |
627 | 631 |
628 if options.verbose: | 632 if options.verbose: |
629 _log.debug("rebaseline-json: " + str(test_prefix_list)) | 633 _log.debug("rebaseline-json: " + str(test_prefix_list)) |
630 | 634 |
631 self._rebaseline(options, test_prefix_list) | 635 self._rebaseline(options, test_prefix_list) |
OLD | NEW |