| OLD | NEW |
| 1 # Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 1 # Copyright (C) 2013 Adobe Systems Incorporated. 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 | 4 # modification, are permitted provided that the following conditions |
| 5 # are met: | 5 # are met: |
| 6 # | 6 # |
| 7 # 1. Redistributions of source code must retain the above | 7 # 1. Redistributions of source code must retain the above |
| 8 # copyright notice, this list of conditions and the following | 8 # copyright notice, this list of conditions and the following |
| 9 # disclaimer. | 9 # disclaimer. |
| 10 # 2. Redistributions in binary form must reproduce the above | 10 # 2. Redistributions in binary form must reproduce the above |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 import sys | 81 import sys |
| 82 | 82 |
| 83 from webkitpy.common.host import Host | 83 from webkitpy.common.host import Host |
| 84 from webkitpy.common.webkit_finder import WebKitFinder | 84 from webkitpy.common.webkit_finder import WebKitFinder |
| 85 from webkitpy.common.system.executive import ScriptError | 85 from webkitpy.common.system.executive import ScriptError |
| 86 from webkitpy.layout_tests.models.test_expectations import TestExpectationParser | 86 from webkitpy.layout_tests.models.test_expectations import TestExpectationParser |
| 87 from webkitpy.w3c.test_parser import TestParser | 87 from webkitpy.w3c.test_parser import TestParser |
| 88 from webkitpy.w3c.test_converter import convert_for_webkit | 88 from webkitpy.w3c.test_converter import convert_for_webkit |
| 89 | 89 |
| 90 | 90 |
| 91 TEST_STATUS_UNKNOWN = 'unknown' | |
| 92 TEST_STATUS_APPROVED = 'approved' | |
| 93 TEST_STATUS_SUBMITTED = 'submitted' | |
| 94 VALID_TEST_STATUSES = [TEST_STATUS_APPROVED, TEST_STATUS_SUBMITTED] | |
| 95 | |
| 96 CONTRIBUTOR_DIR_NAME = 'contributors' | |
| 97 | |
| 98 CHANGESET_NOT_AVAILABLE = 'Not Available' | 91 CHANGESET_NOT_AVAILABLE = 'Not Available' |
| 99 | 92 |
| 100 | 93 |
| 101 _log = logging.getLogger(__name__) | 94 _log = logging.getLogger(__name__) |
| 102 | 95 |
| 103 | 96 |
| 104 def main(_argv, _stdout, _stderr): | 97 def main(_argv, _stdout, _stderr): |
| 105 options, args = parse_args() | 98 options, args = parse_args() |
| 106 dir_to_import = os.path.normpath(os.path.abspath(args[0])) | 99 dir_to_import = os.path.normpath(os.path.abspath(args[0])) |
| 107 if len(args) == 1: | 100 if len(args) == 1: |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 161 |
| 169 self.filesystem = self.host.filesystem | 162 self.filesystem = self.host.filesystem |
| 170 self.webkit_finder = WebKitFinder(self.filesystem) | 163 self.webkit_finder = WebKitFinder(self.filesystem) |
| 171 self._webkit_root = self.webkit_finder.webkit_base() | 164 self._webkit_root = self.webkit_finder.webkit_base() |
| 172 self.layout_tests_dir = self.webkit_finder.path_from_webkit_base('Layout
Tests') | 165 self.layout_tests_dir = self.webkit_finder.path_from_webkit_base('Layout
Tests') |
| 173 self.destination_directory = self.filesystem.normpath(self.filesystem.jo
in(self.layout_tests_dir, options.destination, | 166 self.destination_directory = self.filesystem.normpath(self.filesystem.jo
in(self.layout_tests_dir, options.destination, |
| 174
self.filesystem.basename(self.top_of_repo))) | 167
self.filesystem.basename(self.top_of_repo))) |
| 175 self.import_in_place = (self.dir_to_import == self.destination_directory
) | 168 self.import_in_place = (self.dir_to_import == self.destination_directory
) |
| 176 | 169 |
| 177 self.changeset = CHANGESET_NOT_AVAILABLE | 170 self.changeset = CHANGESET_NOT_AVAILABLE |
| 178 self.test_status = TEST_STATUS_UNKNOWN | |
| 179 | 171 |
| 180 self.import_list = [] | 172 self.import_list = [] |
| 181 | 173 |
| 182 def do_import(self): | 174 def do_import(self): |
| 183 _log.info("Importing %s into %s", self.dir_to_import, self.destination_d
irectory) | 175 _log.info("Importing %s into %s", self.dir_to_import, self.destination_d
irectory) |
| 184 self.find_importable_tests(self.dir_to_import) | 176 self.find_importable_tests(self.dir_to_import) |
| 185 self.load_changeset() | 177 self.load_changeset() |
| 186 self.import_tests() | 178 self.import_tests() |
| 187 | 179 |
| 188 def load_changeset(self): | 180 def load_changeset(self): |
| 189 """Returns the current changeset from mercurial or "Not Available".""" | 181 """Returns the current changeset from mercurial or "Not Available".""" |
| 190 try: | 182 try: |
| 191 self.changeset = self.host.executive.run_command(['hg', 'tip']).spli
t('changeset:')[1] | 183 self.changeset = self.host.executive.run_command(['hg', 'tip']).spli
t('changeset:')[1] |
| 192 except (OSError, ScriptError): | 184 except (OSError, ScriptError): |
| 193 self.changeset = CHANGESET_NOT_AVAILABLE | 185 self.changeset = CHANGESET_NOT_AVAILABLE |
| 194 | 186 |
| 195 def find_importable_tests(self, directory): | 187 def find_importable_tests(self, directory): |
| 196 # FIXME: use filesystem | 188 # FIXME: use filesystem |
| 197 paths_to_skip = self.find_paths_to_skip() | 189 paths_to_skip = self.find_paths_to_skip() |
| 198 | 190 |
| 199 for root, dirs, files in os.walk(directory): | 191 for root, dirs, files in os.walk(directory): |
| 200 cur_dir = root.replace(self.layout_tests_dir + '/', '') + '/' | 192 cur_dir = root.replace(self.layout_tests_dir + '/', '') + '/' |
| 201 _log.info(' scanning ' + cur_dir + '...') | 193 _log.info(' scanning ' + cur_dir + '...') |
| 202 total_tests = 0 | 194 total_tests = 0 |
| 203 reftests = 0 | 195 reftests = 0 |
| 204 jstests = 0 | 196 jstests = 0 |
| 205 | 197 |
| 206 # "archive" and "data" dirs are internal csswg things that live in e
very approved directory. | 198 DIRS_TO_SKIP = ('.git', '.hg') |
| 207 # FIXME: skip 'incoming' tests for now, but we should rework the 'te
st_status' concept and | |
| 208 # support reading them as well. | |
| 209 DIRS_TO_SKIP = ('.git', '.hg', 'data', 'archive', 'incoming') | |
| 210 if dirs: | 199 if dirs: |
| 211 for d in DIRS_TO_SKIP: | 200 for d in DIRS_TO_SKIP: |
| 212 if d in dirs: | 201 if d in dirs: |
| 213 dirs.remove(d) | 202 dirs.remove(d) |
| 214 | 203 |
| 215 for path in paths_to_skip: | 204 for path in paths_to_skip: |
| 216 path_base = path.replace(cur_dir, '') | 205 path_base = path.replace(cur_dir, '') |
| 217 path_full = self.filesystem.join(root, path_base) | 206 path_full = self.filesystem.join(root, path_base) |
| 218 if path_base in dirs: | 207 if path_base in dirs: |
| 219 dirs.remove(path_base) | 208 dirs.remove(path_base) |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 _log.info('IMPORTED %d TOTAL TESTS', total_imported_tests) | 393 _log.info('IMPORTED %d TOTAL TESTS', total_imported_tests) |
| 405 _log.info('Imported %d reftests', total_imported_reftests) | 394 _log.info('Imported %d reftests', total_imported_reftests) |
| 406 _log.info('Imported %d JS tests', total_imported_jstests) | 395 _log.info('Imported %d JS tests', total_imported_jstests) |
| 407 _log.info('Imported %d pixel/manual tests', total_imported_tests - total
_imported_jstests - total_imported_reftests) | 396 _log.info('Imported %d pixel/manual tests', total_imported_tests - total
_imported_jstests - total_imported_reftests) |
| 408 _log.info('') | 397 _log.info('') |
| 409 _log.info('Properties needing prefixes (by count):') | 398 _log.info('Properties needing prefixes (by count):') |
| 410 for prefixed_property in sorted(total_prefixed_properties, key=lambda p:
total_prefixed_properties[p]): | 399 for prefixed_property in sorted(total_prefixed_properties, key=lambda p:
total_prefixed_properties[p]): |
| 411 _log.info(' %s: %s', prefixed_property, total_prefixed_properties[p
refixed_property]) | 400 _log.info(' %s: %s', prefixed_property, total_prefixed_properties[p
refixed_property]) |
| 412 | 401 |
| 413 def setup_destination_directory(self): | 402 def setup_destination_directory(self): |
| 414 """ Creates a destination directory that mirrors that of the source appr
oved or submitted directory """ | 403 """ Creates a destination directory that mirrors that of the source dire
ctory """ |
| 415 | 404 |
| 416 self.update_test_status() | |
| 417 | |
| 418 start = self.dir_to_import.find(self.test_status) | |
| 419 new_subpath = self.dir_to_import[len(self.top_of_repo):] | 405 new_subpath = self.dir_to_import[len(self.top_of_repo):] |
| 420 | 406 |
| 421 destination_directory = os.path.join(self.destination_directory, new_sub
path) | 407 destination_directory = os.path.join(self.destination_directory, new_sub
path) |
| 422 | 408 |
| 423 if not os.path.exists(destination_directory): | 409 if not os.path.exists(destination_directory): |
| 424 os.makedirs(destination_directory) | 410 os.makedirs(destination_directory) |
| 425 | 411 |
| 426 _log.info('Tests will be imported into: %s', destination_directory) | 412 _log.info('Tests will be imported into: %s', destination_directory) |
| 427 | 413 |
| 428 def update_test_status(self): | |
| 429 """ Sets the test status to either 'approved' or 'submitted' """ | |
| 430 | |
| 431 status = TEST_STATUS_UNKNOWN | |
| 432 | |
| 433 directory_parts = self.dir_to_import.split(os.path.sep) | |
| 434 for test_status in VALID_TEST_STATUSES: | |
| 435 if test_status in directory_parts: | |
| 436 status = test_status | |
| 437 | |
| 438 self.test_status = status | |
| 439 | |
| 440 def remove_deleted_files(self, dir_to_import, new_file_list): | 414 def remove_deleted_files(self, dir_to_import, new_file_list): |
| 441 previous_file_list = [] | 415 previous_file_list = [] |
| 442 | 416 |
| 443 import_log_file = os.path.join(dir_to_import, 'w3c-import.log') | 417 import_log_file = os.path.join(dir_to_import, 'w3c-import.log') |
| 444 if not os.path.exists(import_log_file): | 418 if not os.path.exists(import_log_file): |
| 445 return | 419 return |
| 446 | 420 |
| 447 import_log = open(import_log_file, 'r') | 421 import_log = open(import_log_file, 'r') |
| 448 contents = import_log.readlines() | 422 contents = import_log.readlines() |
| 449 | 423 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 464 | 438 |
| 465 import_log = open(os.path.join(dir_to_import, 'w3c-import.log'), 'w') | 439 import_log = open(os.path.join(dir_to_import, 'w3c-import.log'), 'w') |
| 466 import_log.write('The tests in this directory were imported from the W3C
repository.\n') | 440 import_log.write('The tests in this directory were imported from the W3C
repository.\n') |
| 467 import_log.write('Do NOT modify these tests directly in Webkit. Instead,
push changes to the W3C CSS repo:\n\n') | 441 import_log.write('Do NOT modify these tests directly in Webkit. Instead,
push changes to the W3C CSS repo:\n\n') |
| 468 import_log.write('http://hg.csswg.org/test\n\n') | 442 import_log.write('http://hg.csswg.org/test\n\n') |
| 469 import_log.write('Then run the Tools/Scripts/import-w3c-tests in Webkit
to reimport\n\n') | 443 import_log.write('Then run the Tools/Scripts/import-w3c-tests in Webkit
to reimport\n\n') |
| 470 import_log.write('Do NOT modify or remove this file\n\n') | 444 import_log.write('Do NOT modify or remove this file\n\n') |
| 471 import_log.write('------------------------------------------------------
------------------\n') | 445 import_log.write('------------------------------------------------------
------------------\n') |
| 472 import_log.write('Last Import: ' + now.strftime('%Y-%m-%d %H:%M') + '\n'
) | 446 import_log.write('Last Import: ' + now.strftime('%Y-%m-%d %H:%M') + '\n'
) |
| 473 import_log.write('W3C Mercurial changeset: ' + self.changeset + '\n') | 447 import_log.write('W3C Mercurial changeset: ' + self.changeset + '\n') |
| 474 import_log.write('Test status at time of import: ' + self.test_status +
'\n') | |
| 475 import_log.write('------------------------------------------------------
------------------\n') | 448 import_log.write('------------------------------------------------------
------------------\n') |
| 476 import_log.write('Properties requiring vendor prefixes:\n') | 449 import_log.write('Properties requiring vendor prefixes:\n') |
| 477 if prop_list: | 450 if prop_list: |
| 478 for prop in prop_list: | 451 for prop in prop_list: |
| 479 import_log.write(prop + '\n') | 452 import_log.write(prop + '\n') |
| 480 else: | 453 else: |
| 481 import_log.write('None\n') | 454 import_log.write('None\n') |
| 482 import_log.write('------------------------------------------------------
------------------\n') | 455 import_log.write('------------------------------------------------------
------------------\n') |
| 483 import_log.write('List of files:\n') | 456 import_log.write('List of files:\n') |
| 484 for item in file_list: | 457 for item in file_list: |
| 485 import_log.write(item + '\n') | 458 import_log.write(item + '\n') |
| 486 | 459 |
| 487 import_log.close() | 460 import_log.close() |
| OLD | NEW |