Changeset 84730 in webkit
- Timestamp:
- Apr 22, 2011 8:17:41 PM (13 years ago)
- Location:
- trunk/Tools
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r84727 r84730 1 2011-04-22 Dirk Pranke <dpranke@chromium.org> 2 3 Reviewed by Adam Barth. 4 5 rebaseline-chromium-webkit-tests: clean up output 6 https://bugs.webkit.org/show_bug.cgi?id=59240 7 8 This change dramatically changes the output the tool provides 9 by default. The previous output (more or less) is still there 10 in -v / verbose / debug mode, but the default output is 11 way terser and more readable. It mostly says which files are 12 updated, which are duplicates, and which are not found in an 13 archive. Feedback desired :). 14 15 This change also adds a scm.exists() method to the SCM object 16 so that we can cleanly figure out what we're doing while 17 rebaselining. 18 19 * Scripts/webkitpy/layout_tests/rebaseline_chromium_webkit_tests.py: 20 * Scripts/webkitpy/layout_tests/rebaseline_chromium_webkit_tests_unittest.py: 21 * Scripts/webkitpy/common/system/filesystem_mock.py: 22 * Scripts/webkitpy/common/checkout/scm.py: 23 * Scripts/webkitpy/common/checkout/scm_unittest.py: 24 1 25 2011-04-22 Ilya Sherman <isherman@chromium.org> 2 26 -
trunk/Tools/Scripts/webkitpy/common/checkout/scm.py
r84697 r84730 251 251 self._subclass_must_implement() 252 252 253 def exists(self, path): 254 self._subclass_must_implement() 255 253 256 def changed_files(self, git_commit=None): 254 257 self._subclass_must_implement() … … 451 454 return self.run(["svn", "delete", "--force", base], cwd=parent) 452 455 456 def exists(self, path): 457 return not self.run(["svn", "info", path], return_exit_code=True, decode_output=False) 458 453 459 def changed_files(self, git_commit=None): 454 460 status_command = ["svn", "status"] … … 612 618 # All git-specific logic should go here. 613 619 class Git(SCM, SVNRepository): 620 621 # Git doesn't appear to document error codes, but seems to return 622 # 1 or 128, mostly. 623 ERROR_FILE_IS_MISSING = 128 624 614 625 def __init__(self, cwd, executive=None): 615 626 SCM.__init__(self, cwd, executive) … … 712 723 def delete(self, path): 713 724 return self.run(["git", "rm", "-f", path]) 725 726 def exists(self, path): 727 return_code = self.run(["git", "show", "HEAD:%s" % path], return_exit_code=True, decode_output=False) 728 return return_code != self.ERROR_FILE_IS_MISSING 714 729 715 730 def merge_base(self, git_commit): -
trunk/Tools/Scripts/webkitpy/common/checkout/scm_unittest.py
r84697 r84730 177 177 # Now that we've deleted the checkout paths, cwddir may be invalid 178 178 # Change back to a valid directory so that later calls to os.getcwd() do not fail. 179 os.chdir(detect_scm_system(os.path.dirname(__file__)).checkout_root) 179 if os.path.isabs(__file__): 180 path = __file__ 181 else: 182 path = sys.path[0] 183 os.chdir(detect_scm_system(path).checkout_root) 180 184 181 185 … … 458 462 self.scm.add("added_dir/added_file") 459 463 self.assertTrue("added_dir/added_file" in self.scm.added_files()) 464 465 def _shared_test_exists(self, scm, commit_function): 466 os.chdir(scm.checkout_root) 467 self.assertFalse(scm.exists('foo.txt')) 468 write_into_file_at_path('foo.txt', 'some stuff') 469 self.assertFalse(scm.exists('foo.txt')) 470 scm.add('foo.txt') 471 commit_function('adding foo') 472 self.assertTrue(scm.exists('foo.txt')) 473 scm.delete('foo.txt') 474 commit_function('deleting foo') 475 self.assertFalse(scm.exists('foo.txt')) 460 476 461 477 … … 831 847 run_command(['svn', 'update']) # Should succeed and not raise. 832 848 849 def test_exists(self): 850 self._shared_test_exists(self.scm, self.scm.commit_with_message) 833 851 834 852 class GitTest(SCMTest): … … 878 896 patch = scm.create_patch() 879 897 self.assertFalse(re.search(r'Subversion Revision:', patch)) 898 899 def test_exists(self): 900 scm = self.untracking_scm 901 self._shared_test_exists(scm, scm.commit_locally_with_message) 880 902 881 903 … … 1399 1421 self.assertTrue("-more test content" in cached_diff) 1400 1422 1423 def test_exists(self): 1424 scm = detect_scm_system(self.git_checkout_path) 1425 self._shared_test_exists(scm, scm.commit_locally_with_message) 1426 1401 1427 1402 1428 # We need to split off more of these SCM tests to use mocks instead of the filesystem. -
trunk/Tools/Scripts/webkitpy/common/system/filesystem_mock.py
r84333 r84730 126 126 return files 127 127 128 def getcwd(self , path):128 def getcwd(self): 129 129 return self.cwd 130 130 -
trunk/Tools/Scripts/webkitpy/layout_tests/rebaseline_chromium_webkit_tests.py
r83824 r84730 81 81 82 82 83 def log_dashed_string(text, platform , logging_level=logging.INFO):83 def log_dashed_string(text, platform=None, logging_level=logging.DEBUG): 84 84 """Log text message with dashes on both sides.""" 85 86 85 msg = text 87 86 if platform: … … 90 89 dashes = '-' * ((78 - len(msg)) / 2) 91 90 msg = '%s %s %s' % (dashes, msg, dashes) 92 93 if logging_level == logging.ERROR: 94 _log.error(msg) 95 elif logging_level == logging.WARNING: 96 _log.warn(msg) 97 else: 98 _log.info(msg) 91 _log.log(logging_level, msg) 99 92 100 93 … … 112 105 113 106 html_directory = filesystem.join(parent_directory, 'rebaseline_html') 114 _log. info('Html directory: "%s"', html_directory)107 _log.debug('Html directory: "%s"', html_directory) 115 108 116 109 if filesystem.exists(html_directory): 117 110 filesystem.rmtree(html_directory) 118 _log. info('Deleted html directory: "%s"', html_directory)111 _log.debug('Deleted html directory: "%s"', html_directory) 119 112 120 113 filesystem.maybe_make_directory(html_directory) … … 149 142 REVISION_REGEX = r'<a href=\"(\d+)/\">' 150 143 151 def __init__(self, running_port, target_port, platform, options, url_fetcher, zip_factory, scm ):144 def __init__(self, running_port, target_port, platform, options, url_fetcher, zip_factory, scm, logged_before=False): 152 145 """ 153 146 Args: … … 161 154 zip_factory: optional object that can fetch zip files from URLs 162 155 scm: scm object for adding new baselines 156 logged_before: whether the previous running port logged anything. 163 157 """ 164 158 self._platform = platform … … 171 165 self._rebaselining_tests = set() 172 166 self._rebaselined_tests = [] 167 self._logged_before = logged_before 168 self.did_log = False 173 169 174 170 # Create tests and expectations helper which is used to: … … 186 182 """Run rebaseline process.""" 187 183 188 log_dashed_string('Compiling rebaselining tests', self._platform )184 log_dashed_string('Compiling rebaselining tests', self._platform, logging.DEBUG) 189 185 if not self._compile_rebaselining_tests(): 190 186 return False … … 192 188 return True 193 189 194 log_dashed_string('Downloading archive', self._platform) 190 self.did_log = True 191 log_dashed_string('Downloading archive', self._platform, logging.DEBUG) 195 192 archive_file = self._download_buildbot_archive() 196 _log. info('')193 _log.debug('') 197 194 if not archive_file: 198 195 _log.error('No archive found.') 199 196 return False 200 197 201 log_dashed_string('Extracting and adding new baselines', self._platform) 202 if not self._extract_and_add_new_baselines(archive_file): 203 archive_file.close() 198 log_dashed_string('Extracting and adding new baselines', self._platform, logging.DEBUG) 199 self._extract_and_add_new_baselines(archive_file) 200 archive_file.close() 201 202 log_dashed_string('Updating rebaselined tests in file', self._platform) 203 204 if len(self._rebaselining_tests) != len(self._rebaselined_tests): 205 _log.debug('') 206 _log.debug('NOT ALL TESTS WERE REBASELINED.') 207 _log.debug(' Number marked for rebaselining: %d', len(self._rebaselining_tests)) 208 _log.debug(' Number actually rebaselined: %d', len(self._rebaselined_tests)) 209 _log.info('') 204 210 return False 205 211 206 archive_file.close() 207 208 log_dashed_string('Updating rebaselined tests in file', self._platform) 209 210 if len(self._rebaselining_tests) != len(self._rebaselined_tests): 211 _log.warning('NOT ALL TESTS THAT NEED REBASELINING HAVE BEEN REBASELINED.') 212 _log.warning(' Total tests needing rebaselining: %d', len(self._rebaselining_tests)) 213 _log.warning(' Total tests rebaselined: %d', len(self._rebaselined_tests)) 214 return False 215 216 _log.warning('All tests needing rebaselining were successfully rebaselined.') 217 212 _log.debug(' All tests needing rebaselining were successfully rebaselined.') 213 _log.info('') 218 214 return True 219 215 … … 227 223 if self._filesystem.exists(backup_file): 228 224 self._filesystem.remove(backup_file) 229 _log. info('Saving original file to "%s"', backup_file)225 _log.debug('Saving original file to "%s"', backup_file) 230 226 self._filesystem.move(path, backup_file) 231 227 … … 245 241 self._rebaselining_tests = self._test_expectations.get_rebaselining_failures() 246 242 if not self._rebaselining_tests: 247 _log. warn('No tests found that need rebaselining.')243 _log.info('%s: No tests to rebaseline.', self._platform) 248 244 return True 249 245 … … 257 253 return False 258 254 259 _log.info('Total number of tests needing rebaselining for "%s": "%d"',260 self._platform, len(self._rebaselining_tests))261 255 if not self._logged_before: 256 _log.info('') 257 _log.info('%s: Rebaselining %d tests:', self._platform, len(self._rebaselining_tests)) 262 258 test_no = 1 263 259 for test in self._rebaselining_tests: 264 _log. info(' %d: %s', test_no, test)260 _log.debug(' %d: %s', test_no, test) 265 261 test_no += 1 266 262 … … 288 284 289 285 revisions.sort(key=int) 290 _log. info('Latest revision: "%s"', revisions[len(revisions) - 1])286 _log.debug(' Latest revision: %s', revisions[len(revisions) - 1]) 291 287 return revisions[len(revisions) - 1] 292 288 … … 328 324 return None 329 325 archive_url = '%s%s/layout-test-results.zip' % (url_base, latest_revision) 330 _log.info(' Archive url: "%s"', archive_url)326 _log.info(' Using %s', archive_url) 331 327 return archive_url 332 328 … … 339 335 archive_file = zipfileset.ZipFileSet(url, filesystem=self._filesystem, 340 336 zip_factory=self._zip_factory) 341 _log. info('Archive downloaded')337 _log.debug('Archive downloaded') 342 338 return archive_file 343 339 … … 357 353 self._rebaselined_tests = [] 358 354 for test_no, test in enumerate(self._rebaselining_tests): 359 _log. info('Test %d: %s', test_no + 1, test)355 _log.debug('Test %d: %s', test_no + 1, test) 360 356 self._extract_and_add_new_baseline(test, zip_file) 361 362 zip_file.close()363 364 return self._rebaselined_tests365 357 366 358 def _extract_and_add_new_baseline(self, test, zip_file): … … 372 364 _log.debug(' Archive test file name: "%s"', archive_test_name) 373 365 if not archive_test_name in zip_file.namelist(): 374 _log. info(' %s file not in archive.', suffix)366 _log.debug(' %s file not in archive.', suffix) 375 367 continue 376 368 377 369 found = True 378 _log. info(' %s file found in archive.', suffix)370 _log.debug(' %s file found in archive.', suffix) 379 371 380 372 temp_name = self._extract_from_zip_to_tempfile(zip_file, archive_test_name) … … 385 377 expected_fullpath = self._filesystem.normpath(expected_fullpath) 386 378 _log.debug(' Expected file full path: "%s"', expected_fullpath) 379 380 relpath = self._filesystem.relpath(expected_fullpath, self._target_port.layout_tests_dir()) 387 381 388 382 # TODO(victorw): for now, the rebaselining tool checks whether … … 392 386 if self._is_dup_baseline(temp_name, expected_fullpath, test, suffix, self._platform): 393 387 self._filesystem.remove(temp_name) 394 self._delete_baseline(expected_fullpath) 388 if self._filesystem.exists(expected_fullpath): 389 _log.info(' Removing %s' % relpath) 390 self._delete_baseline(expected_fullpath) 391 _log.debug(' %s is a duplicate' % relpath) 392 393 # FIXME: We consider a duplicate baseline a success in the normal case. 394 # FIXME: This may not be what you want sometimes; should this be 395 # FIXME: controllable? 396 self._rebaselined_tests.append(test) 395 397 continue 396 398 … … 404 406 self._filesystem.move(temp_name, expected_fullpath) 405 407 408 # FIXME: SCM module doesn't handle paths that aren't relative to the checkout_root consistently. 409 self._filesystem.chdir(self._scm.checkout_root) 410 path_from_base = self._filesystem.relpath(expected_fullpath, self._filesystem.getcwd()) 411 if self._scm.exists(path_from_base): 412 _log.info(' Updating %s' % relpath) 413 else: 414 _log.info(' Adding %s' % relpath) 415 406 416 if self._scm.add(expected_fullpath, return_exit_code=True): 407 417 # FIXME: print detailed diagnose messages … … 411 421 412 422 if not found: 413 _log.warn(' No new baselines found in archive.')423 _log.warn('No results in archive for %s' % test) 414 424 elif scm_error: 415 _log.warn(' 425 _log.warn('Failed to add baselines to your repository.') 416 426 else: 417 _log. info(' Rebaseline succeeded.')427 _log.debug(' Rebaseline succeeded.') 418 428 self._rebaselined_tests.append(test) 419 429 … … 474 484 all_baselines = self._rebaseline_port.expected_baselines( 475 485 test_filepath, suffix, True) 486 test_relpath = self._filesystem.relpath(test_filepath, self._target_port.layout_tests_dir()) 476 487 477 488 for fallback_dir, fallback_file in all_baselines: … … 483 494 if fallback_fullpath.lower() == baseline_path.lower(): 484 495 continue 496 fallback_dir_relpath = self._filesystem.relpath(fallback_dir, self._target_port.layout_tests_dir()) 497 if fallback_dir_relpath == '': 498 fallback_dir_relpath = '<generic>' 485 499 486 500 new_output = self._filesystem.read_binary_file(new_baseline) … … 488 502 is_image = baseline_path.lower().endswith('.png') 489 503 if not self._diff_baselines(new_output, fallback_output, is_image): 490 _log.info(' Found same baseline at %s', fallback_fullpath)504 _log.info(' Skipping %s (matches %s)', test_relpath, fallback_dir_relpath) 491 505 return True 492 506 return False … … 530 544 """ 531 545 532 if not baseline_fullpath or not self._filesystem.exists(baseline_fullpath): 546 if (not baseline_fullpath 547 or not self._filesystem.exists(baseline_fullpath)): 548 return 549 550 if not self._scm.exists(baseline_fullpath): 533 551 return 534 552 … … 538 556 baseline_filename, self._platform, 'new') 539 557 self._filesystem.copyfile(baseline_fullpath, new_file) 540 _log. info(' Html: copied new baseline file from "%s" to "%s".',558 _log.debug(' Html: copied new baseline file from "%s" to "%s".', 541 559 baseline_fullpath, new_file) 542 560 … … 545 563 output = self._scm.show_head(baseline_fullpath) 546 564 except ScriptError, e: 547 _log. info(e)565 _log.warning(e) 548 566 output = "" 549 567 550 568 if (not output) or (output.upper().rstrip().endswith('NO SUCH FILE OR DIRECTORY')): 551 _log. info(' No base file: "%s"', baseline_fullpath)569 _log.warning(' No base file: "%s"', baseline_fullpath) 552 570 return 553 571 base_file = get_result_file_fullpath(self._filesystem, self._options.html_directory, … … 557 575 else: 558 576 self._filesystem.write_text_file(base_file, output) 559 _log. info(' Html: created old baseline file: "%s".', base_file)577 _log.debug(' Html: created old baseline file: "%s".', base_file) 560 578 561 579 # Get the diff between old and new baselines and save to the html dir. … … 567 585 self._platform, 'diff') 568 586 self._filesystem.write_text_file(diff_file, output) 569 _log. info(' Html: created baseline diff file: "%s".', diff_file)587 _log.debug(' Html: created baseline diff file: "%s".', diff_file) 570 588 571 589 … … 634 652 """Generate html file for rebaselining result comparison.""" 635 653 636 _log. info('Generating html file')654 _log.debug('Generating html file') 637 655 638 656 html_body = '' … … 645 663 test_no = 1 646 664 for test in tests: 647 _log. info('Test %d: %s', test_no, test)665 _log.debug('Test %d: %s', test_no, test) 648 666 html_body += self._generate_html_for_one_test(test) 649 667 … … 653 671 654 672 self._filesystem.write_text_file(self._html_file, html) 655 _log. info('Baseline comparison html generated at "%s"', self._html_file)673 _log.debug('Baseline comparison html generated at "%s"', self._html_file) 656 674 657 675 def show_html(self): 658 676 """Launch the rebaselining html in brwoser.""" 659 677 660 _log. info('Launching html: "%s"', self._html_file)678 _log.debug('Launching html: "%s"', self._html_file) 661 679 self._port._user.open_url(self._html_file) 662 _log. info('Html launched.')680 _log.debug('Html launched.') 663 681 664 682 def _generate_baseline_links(self, test_basename, suffix, platform): … … 679 697 new_file = get_result_file_fullpath(self._filesystem, self._html_directory, 680 698 baseline_filename, platform, 'new') 681 _log. info(' New baseline file: "%s"', new_file)699 _log.debug(' New baseline file: "%s"', new_file) 682 700 if not self._filesystem.exists(new_file): 683 _log. info(' No new baseline file: "%s"', new_file)701 _log.debug(' No new baseline file: "%s"', new_file) 684 702 return '' 685 703 686 704 old_file = get_result_file_fullpath(self._filesystem, self._html_directory, 687 705 baseline_filename, platform, 'old') 688 _log. info(' Old baseline file: "%s"', old_file)706 _log.debug(' Old baseline file: "%s"', old_file) 689 707 if suffix == '.png': 690 708 html_td_link = self.HTML_TD_LINK_IMG … … 698 716 'name': baseline_filename} 699 717 else: 700 _log. info(' No old baseline file: "%s"', old_file)718 _log.debug(' No old baseline file: "%s"', old_file) 701 719 links += self.HTML_TD_NOLINK % '' 702 720 … … 706 724 diff_file = get_result_file_fullpath(self._filesystem, self._html_directory, 707 725 baseline_filename, platform, 'diff') 708 _log. info(' Baseline diff file: "%s"', diff_file)726 _log.debug(' Baseline diff file: "%s"', diff_file) 709 727 if self._filesystem.exists(diff_file): 710 728 links += html_td_link % {'uri': self.abspath_to_uri(diff_file), 711 729 'name': 'Diff'} 712 730 else: 713 _log. info(' No baseline diff file: "%s"', diff_file)731 _log.debug(' No baseline diff file: "%s"', diff_file) 714 732 links += self.HTML_TD_NOLINK % '' 715 733 … … 727 745 728 746 test_basename = self._filesystem.basename(self._filesystem.splitext(test)[0]) 729 _log. info(' basename: "%s"', test_basename)747 _log.debug(' basename: "%s"', test_basename) 730 748 rows = [] 731 749 for suffix in BASELINE_SUFFIXES: … … 733 751 continue 734 752 735 _log. info(' Checking %s files', suffix)753 _log.debug(' Checking %s files', suffix) 736 754 for platform in self._platforms: 737 755 links = self._generate_baseline_links(test_basename, suffix, platform) … … 854 872 855 873 874 class DebugLogHandler(logging.Handler): 875 num_failures = 0 876 877 def __init__(self): 878 logging.Handler.__init__(self) 879 self.formatter = logging.Formatter(fmt=('%(asctime)s %(filename)s:%(lineno)-3d ' 880 '%(levelname)s %(message)s')) 881 self.setFormatter(self.formatter) 882 883 def emit(self, record): 884 if record.levelno > logging.INFO: 885 self.num_failures += 1 886 print self.format(record) 887 888 889 class NormalLogHandler(logging.Handler): 890 last_levelno = None 891 num_failures = 0 892 893 def emit(self, record): 894 if record.levelno > logging.INFO: 895 self.num_failures += 1 896 if self.last_levelno != record.levelno: 897 print 898 self.last_levelno = record.levelno 899 prefix = '' 900 msg = record.getMessage() 901 if record.levelno > logging.INFO and msg: 902 prefix = '%s: ' % record.levelname 903 print '%s%s' % (prefix, msg) 904 905 856 906 def main(args): 857 907 """Bootstrap function that sets up the object references we need and calls real_main().""" 858 908 options, target_options = parse_options(args) 859 909 860 # Set up our logging format.861 log _level = logging.INFO910 logger = logging.getLogger() 911 logger.setLevel(logging.INFO) 862 912 if options.verbose: 863 913 log_level = logging.DEBUG 864 logging.basicConfig(level=log_level, 865 format=('%(asctime)s %(filename)s:%(lineno)-3d ' 866 '%(levelname)s %(message)s'), 867 datefmt='%y%m%d %H:%M:%S') 914 log_handler = DebugLogHandler() 915 else: 916 log_level = logging.INFO 917 log_handler = NormalLogHandler() 918 919 logger = logging.getLogger() 920 logger.setLevel(log_level) 921 logger.addHandler(log_handler) 868 922 869 923 target_port_obj = port.get(None, target_options) … … 878 932 zip_factory = None 879 933 880 return real_main(options, target_options, host_port_obj, target_port_obj, url_fetcher, 881 zip_factory, scm_obj) 934 ret_code = real_main(options, target_options, host_port_obj, target_port_obj, url_fetcher, 935 zip_factory, scm_obj) 936 if not ret_code and log_handler.num_failures: 937 ret_code = 1 938 print '' 939 if ret_code: 940 print 'Rebaselining failed.' 941 else: 942 print 'Rebaselining succeeded.' 943 return ret_code 882 944 883 945 … … 918 980 rebaseline_platforms = all_platforms 919 981 982 # FIXME: These log messages will be wrong if ports store baselines outside 983 # of layout_tests_dir(), but the code should work correctly. 984 layout_tests_dir = target_port_obj.layout_tests_dir() 985 expectations_path = target_port_obj.path_to_test_expectations_file() 986 _log.info('Using %s' % layout_tests_dir) 987 _log.info(' and %s' % expectations_path) 988 920 989 rebaselined_tests = set() 990 logged_before = False 921 991 for platform in rebaseline_platforms: 922 992 rebaseliner = Rebaseliner(host_port_obj, target_port_obj, 923 993 platform, options, url_fetcher, zip_factory, 924 scm_obj )925 926 _log. info('')994 scm_obj, logged_before) 995 996 _log.debug('') 927 997 log_dashed_string('Rebaseline started', platform) 928 998 if rebaseliner.run(): 929 999 log_dashed_string('Rebaseline done', platform) 930 1000 else: 931 log_dashed_string('Rebaseline failed', platform , logging.ERROR)1001 log_dashed_string('Rebaseline failed', platform) 932 1002 933 1003 rebaselined_tests |= set(rebaseliner.get_rebaselined_tests()) 1004 logged_before = rebaseliner.did_log 934 1005 935 1006 if rebaselined_tests: … … 937 1008 options.backup) 938 1009 939 _log. info('')940 log_dashed_string('Rebaselining result comparison started' , None)1010 _log.debug('') 1011 log_dashed_string('Rebaselining result comparison started') 941 1012 html_generator = HtmlGenerator(host_port_obj, 942 1013 target_port_obj, … … 947 1018 if not options.quiet: 948 1019 html_generator.show_html() 949 log_dashed_string('Rebaselining result comparison done' , None)1020 log_dashed_string('Rebaselining result comparison done') 950 1021 951 1022 return 0 -
trunk/Tools/Scripts/webkitpy/layout_tests/rebaseline_chromium_webkit_tests_unittest.py
r82892 r84730 203 203 zip_factory = test_zip_factory() 204 204 mock_scm = mocktool.MockSCM(filesystem) 205 filesystem.maybe_make_directory(mock_scm.checkout_root) 205 206 rebaseliner = rebaseline_chromium_webkit_tests.Rebaseliner(host_port_obj, 206 207 target_port_obj, platform, options, url_fetcher, zip_factory, mock_scm) … … 337 338 zip_factory = test_zip_factory() 338 339 mock_scm = mocktool.MockSCM() 340 filesystem.maybe_make_directory(mock_scm.checkout_root) 339 341 oc = outputcapture.OutputCapture() 340 342 oc.capture_output()
Note: See TracChangeset
for help on using the changeset viewer.