From e5fd5e058c53623a1b6a13955bcaca9c006fd2cb Mon Sep 17 00:00:00 2001 From: Sam Sneddon Date: Fri, 15 Dec 2023 04:41:33 -0800 Subject: [PATCH] [import-w3c-tests] Explicitly list all directories we're not importing as skip https://bugs.webkit.org/show_bug.cgi?id=214006 Reviewed by Jonathan Bedard. Add a new value to import-expectations.json: "skip-new-directories". "skip-new-directories" is mostly treated the same as "skip" (i.e., everything under it is skipped, unless marked as "import"). However, unlike "skip", child files are imported, and child directories are added to import-expectations.json as "skip" (thus the name). We apply this to both "web-platform-tests" and "web-platform-tests/css", to avoid importing new test suites for (presumably new) specifications. By doing this, as opposed to applying "skip" directly to those directories, we gain visibility to new test suites being added, as these now cause a "skip" line to be added when doing a full import. * LayoutTests/imported/w3c/resources/import-expectations.json: * Tools/Scripts/webkitpy/style/checkers/jsonchecker.py: (JSONImportExpectationsChecker.check): * Tools/Scripts/webkitpy/w3c/test_downloader.py: (TestDownloader.__init__): (TestDownloader._init_paths_from_expectations): (TestDownloader.update_import_expectations): * Tools/Scripts/webkitpy/w3c/test_importer.py: (TestImporter.__init__): (TestImporter.do_import): (TestImporter.should_skip_path): Canonical link: https://commits.webkit.org/272109@main --- .../w3c/resources/import-expectations.json | 141 +++++++++++++++++- .../webkitpy/style/checkers/jsonchecker.py | 35 ++--- .../style/checkers/jsonchecker_unittest.py | 40 ++++- Tools/Scripts/webkitpy/w3c/test_downloader.py | 11 +- Tools/Scripts/webkitpy/w3c/test_importer.py | 17 ++- 5 files changed, 215 insertions(+), 29 deletions(-) diff --git a/LayoutTests/imported/w3c/resources/import-expectations.json b/LayoutTests/imported/w3c/resources/import-expectations.json index 17549b65e18c..381ca20d15a4 100644 --- a/LayoutTests/imported/w3c/resources/import-expectations.json +++ b/LayoutTests/imported/w3c/resources/import-expectations.json @@ -1,4 +1,7 @@ { + "web-platform-tests": "skip-new-directories", + "web-platform-tests/.github": "skip", + "web-platform-tests/.well-known": "skip", "web-platform-tests/FileAPI": "import", "web-platform-tests/IndexedDB": "import", "web-platform-tests/WebCryptoAPI": "import", @@ -6,33 +9,57 @@ "web-platform-tests/accelerometer": "skip", "web-platform-tests/accessibility": "import", "web-platform-tests/accname": "import", + "web-platform-tests/acid": "skip", "web-platform-tests/ambient-light": "skip", + "web-platform-tests/animation-worklet": "skip", "web-platform-tests/annotation-model": "skip", "web-platform-tests/annotation-protocol": "skip", "web-platform-tests/annotation-vocab": "skip", "web-platform-tests/apng": "import", + "web-platform-tests/appmanifest": "skip", + "web-platform-tests/attribution-reporting": "skip", "web-platform-tests/audio-output": "import", + "web-platform-tests/autoplay-policy-detection": "skip", + "web-platform-tests/avif": "skip", "web-platform-tests/background-fetch": "import", + "web-platform-tests/background-sync": "skip", + "web-platform-tests/badging": "import", "web-platform-tests/battery-status": "skip", "web-platform-tests/beacon": "import", "web-platform-tests/bluetooth": "skip", + "web-platform-tests/browsing-topics": "skip", + "web-platform-tests/captured-mouse-events": "skip", "web-platform-tests/clear-site-data": "import", + "web-platform-tests/client-hints": "skip", "web-platform-tests/clipboard-apis": "import", + "web-platform-tests/close-watcher": "skip", "web-platform-tests/common": "import", "web-platform-tests/compat": "import", + "web-platform-tests/compression": "import", + "web-platform-tests/compute-pressure": "skip", "web-platform-tests/console": "import", + "web-platform-tests/contacts": "skip", + "web-platform-tests/content-dpr": "skip", + "web-platform-tests/content-index": "skip", "web-platform-tests/content-security-policy": "import", + "web-platform-tests/contenteditable": "skip", + "web-platform-tests/cookie-deprecation-label": "skip", "web-platform-tests/cookie-store": "import", "web-platform-tests/cookies": "import", "web-platform-tests/core-aam": "skip", "web-platform-tests/cors": "import", "web-platform-tests/credential-management": "import", - "web-platform-tests/css": "skip", + "web-platform-tests/css": "skip-new-directories", + "web-platform-tests/css/CSS1": "skip", + "web-platform-tests/css/CSS2": "skip", "web-platform-tests/css/WOFF2": "import", "web-platform-tests/css/compositing": "import", "web-platform-tests/css/css-align": "import", + "web-platform-tests/css/css-anchor-position": "skip", "web-platform-tests/css/css-animations": "import", "web-platform-tests/css/css-backgrounds": "import", + "web-platform-tests/css/css-borders": "skip", + "web-platform-tests/css/css-box": "import", "web-platform-tests/css/css-break": "import", "web-platform-tests/css/css-cascade": "import", "web-platform-tests/css/css-color": "import", @@ -41,35 +68,58 @@ "web-platform-tests/css/css-contain": "import", "web-platform-tests/css/css-content": "import", "web-platform-tests/css/css-counter-styles": "import", + "web-platform-tests/css/css-device-adapt": "skip", "web-platform-tests/css/css-display": "import", "web-platform-tests/css/css-easing": "import", + "web-platform-tests/css/css-env": "skip", + "web-platform-tests/css/css-exclusions": "skip", + "web-platform-tests/css/css-fill-stroke": "skip", "web-platform-tests/css/css-flexbox": "import", "web-platform-tests/css/css-font-loading": "import", "web-platform-tests/css/css-fonts": "import", + "web-platform-tests/css/css-forced-color-adjust": "skip", + "web-platform-tests/css/css-gcpm": "skip", "web-platform-tests/css/css-grid": "import", "web-platform-tests/css/css-highlight-api": "import", "web-platform-tests/css/css-images": "import", "web-platform-tests/css/css-inline": "import", + "web-platform-tests/css/css-layout-api": "skip", "web-platform-tests/css/css-lists": "import", "web-platform-tests/css/css-logical": "import", "web-platform-tests/css/css-masking": "import", "web-platform-tests/css/css-multicol": "import", + "web-platform-tests/css/css-namespaces": "skip", "web-platform-tests/css/css-nesting": "import", + "web-platform-tests/css/css-outline": "skip", "web-platform-tests/css/css-overflow": "import", "web-platform-tests/css/css-overscroll-behavior": "import", + "web-platform-tests/css/css-page": "skip", + "web-platform-tests/css/css-paint-api": "skip", + "web-platform-tests/css/css-parser-api": "skip", "web-platform-tests/css/css-position": "import", "web-platform-tests/css/css-properties-values-api": "import", "web-platform-tests/css/css-pseudo": "import", + "web-platform-tests/css/css-rhythm": "import", + "web-platform-tests/css/css-round-display": "skip", "web-platform-tests/css/css-ruby": "import", "web-platform-tests/css/css-scoping": "import", + "web-platform-tests/css/css-scroll-anchoring": "import", "web-platform-tests/css/css-scroll-snap": "import", + "web-platform-tests/css/css-scroll-snap-2": "skip", "web-platform-tests/css/css-scrollbars": "import", "web-platform-tests/css/css-shadow-parts": "import", "web-platform-tests/css/css-shapes": "import", + "web-platform-tests/css/css-size-adjust": "import", + "web-platform-tests/css/css-sizing": "skip", "web-platform-tests/css/css-sizing/aspect-ratio": "import", "web-platform-tests/css/css-sizing/contain-intrinsic-size": "import", + "web-platform-tests/css/css-speech": "skip", + "web-platform-tests/css/css-style-attr": "skip", + "web-platform-tests/css/css-syntax": "import", "web-platform-tests/css/css-tables": "import", "web-platform-tests/css/css-text": "import", + "web-platform-tests/css/css-text-decor": "import", + "web-platform-tests/css/css-toggle": "skip", "web-platform-tests/css/css-transforms": "import", "web-platform-tests/css/css-transitions": "import", "web-platform-tests/css/css-typed-om": "import", @@ -81,17 +131,26 @@ "web-platform-tests/css/css-writing-modes": "import", "web-platform-tests/css/cssom": "import", "web-platform-tests/css/cssom-view": "import", + "web-platform-tests/css/fetching": "skip", "web-platform-tests/css/filter-effects": "import", "web-platform-tests/css/geometry": "import", "web-platform-tests/css/mediaqueries": "import", "web-platform-tests/css/motion": "import", + "web-platform-tests/css/printing": "skip", "web-platform-tests/css/reference": "import", "web-platform-tests/css/selectors": "import", "web-platform-tests/css/support": "import", + "web-platform-tests/css/zoom": "skip", "web-platform-tests/custom-elements": "import", "web-platform-tests/custom-state-pseudo-class": "import", + "web-platform-tests/delegated-ink": "skip", + "web-platform-tests/density-size-correction": "import", "web-platform-tests/deprecation-reporting": "import", + "web-platform-tests/device-memory": "skip", + "web-platform-tests/direct-sockets": "skip", "web-platform-tests/docs": "import", + "web-platform-tests/document-picture-in-picture": "skip", + "web-platform-tests/document-policy": "skip", "web-platform-tests/dom": "import", "web-platform-tests/domparsing": "import", "web-platform-tests/domxpath": "import", @@ -99,20 +158,32 @@ "web-platform-tests/domxpath/xml_xpath_tests.xml": "skip", "web-platform-tests/dpub-aam": "skip", "web-platform-tests/dpub-aria": "skip", + "web-platform-tests/ecmascript": "skip", "web-platform-tests/editing": "import", + "web-platform-tests/element-timing": "skip", "web-platform-tests/encoding": "import", + "web-platform-tests/encoding-detection": "skip", "web-platform-tests/encrypted-media": "import", "web-platform-tests/entries-api": "import", + "web-platform-tests/event-timing": "skip", "web-platform-tests/eventsource": "import", + "web-platform-tests/eyedropper": "skip", "web-platform-tests/feature-policy": "import", + "web-platform-tests/fenced-frame": "skip", "web-platform-tests/fetch": "import", "web-platform-tests/file-system-access": "import", + "web-platform-tests/fledge": "skip", + "web-platform-tests/focus": "skip", + "web-platform-tests/font-access": "skip", "web-platform-tests/fonts": "import", + "web-platform-tests/forced-colors-mode": "skip", "web-platform-tests/fs": "import", "web-platform-tests/fullscreen": "import", "web-platform-tests/gamepad": "import", "web-platform-tests/generic-sensor": "skip", "web-platform-tests/geolocation-API": "import", + "web-platform-tests/geolocation-sensor": "skip", + "web-platform-tests/graphics-aam": "skip", "web-platform-tests/graphics-aria": "import", "web-platform-tests/gyroscope": "skip", "web-platform-tests/hr-time": "import", @@ -123,52 +194,87 @@ "web-platform-tests/html/browsers/offline/application-cache-api": "skip", "web-platform-tests/html/semantics/scripting-1/the-script-element/css-module-assertions": "skip", "web-platform-tests/html/semantics/scripting-1/the-script-element/json-module-assertions": "skip", + "web-platform-tests/https-upgrades": "skip", + "web-platform-tests/idle-detection": "skip", "web-platform-tests/imagebitmap-renderingcontext": "import", "web-platform-tests/images": "import", "web-platform-tests/import-maps": "import", "web-platform-tests/inert": "import", "web-platform-tests/infrastructure": "import", "web-platform-tests/innerText": "import", + "web-platform-tests/input-device-capabilities": "skip", "web-platform-tests/input-events": "skip", + "web-platform-tests/installedapp": "skip", "web-platform-tests/interfaces": "import", "web-platform-tests/intersection-observer": "import", + "web-platform-tests/intervention-reporting": "skip", + "web-platform-tests/is-input-pending": "skip", + "web-platform-tests/jpegxl": "skip", "web-platform-tests/js": "skip", + "web-platform-tests/js-self-profiling": "skip", "web-platform-tests/keyboard-lock": "skip", + "web-platform-tests/keyboard-map": "skip", + "web-platform-tests/largest-contentful-paint": "skip", + "web-platform-tests/layout-instability": "skip", + "web-platform-tests/lifecycle": "skip", + "web-platform-tests/loading": "import", + "web-platform-tests/long-animation-frame": "skip", "web-platform-tests/longtask-timing": "skip", "web-platform-tests/magnetometer": "skip", + "web-platform-tests/managed": "skip", "web-platform-tests/mathml": "import", + "web-platform-tests/measure-memory": "skip", "web-platform-tests/media": "import", "web-platform-tests/media-capabilities": "import", "web-platform-tests/media-playback-quality": "import", "web-platform-tests/media-source": "import", + "web-platform-tests/mediacapture-extensions": "skip", + "web-platform-tests/mediacapture-fromelement": "import", + "web-platform-tests/mediacapture-handle": "skip", "web-platform-tests/mediacapture-image": "skip", + "web-platform-tests/mediacapture-insertable-streams": "skip", "web-platform-tests/mediacapture-record": "import", + "web-platform-tests/mediacapture-region": "skip", "web-platform-tests/mediacapture-streams": "import", "web-platform-tests/mediasession": "import", + "web-platform-tests/merchant-validation": "skip", "web-platform-tests/mimesniff": "import", "web-platform-tests/mixed-content": "import", "web-platform-tests/mst-content-hint": "import", "web-platform-tests/navigation-api": "import", "web-platform-tests/navigation-timing": "import", "web-platform-tests/netinfo": "skip", + "web-platform-tests/network-error-logging": "skip", "web-platform-tests/notifications": "import", "web-platform-tests/old-tests": "skip", "web-platform-tests/orientation-event": "skip", "web-platform-tests/orientation-sensor": "skip", + "web-platform-tests/page-lifecycle": "skip", "web-platform-tests/page-visibility": "import", "web-platform-tests/paint-timing": "import", + "web-platform-tests/parakeet": "skip", "web-platform-tests/payment-handler": "skip", "web-platform-tests/payment-method-basic-card": "skip", "web-platform-tests/payment-method-id": "skip", "web-platform-tests/payment-request": "import", + "web-platform-tests/pending-beacon": "skip", "web-platform-tests/performance-timeline": "import", + "web-platform-tests/periodic-background-sync": "skip", "web-platform-tests/permissions": "import", + "web-platform-tests/permissions-policy": "import", + "web-platform-tests/permissions-request": "skip", + "web-platform-tests/permissions-revoke": "skip", "web-platform-tests/picture-in-picture": "import", + "web-platform-tests/png": "skip", "web-platform-tests/pointerevents": "import", "web-platform-tests/pointerlock": "import", + "web-platform-tests/portals": "skip", "web-platform-tests/preload": "import", "web-platform-tests/presentation-api": "skip", + "web-platform-tests/print": "skip", "web-platform-tests/priority-hints": "import", + "web-platform-tests/private-aggregation": "skip", + "web-platform-tests/private-click-measurement": "skip", "web-platform-tests/proximity": "skip", "web-platform-tests/push-api": "import", "web-platform-tests/quirks": "import", @@ -180,56 +286,89 @@ "web-platform-tests/resource-timing": "import", "web-platform-tests/resources": "import", "web-platform-tests/resources/chromium": "skip", + "web-platform-tests/sanitizer-api": "skip", + "web-platform-tests/savedata": "skip", + "web-platform-tests/scheduler": "skip", + "web-platform-tests/screen-capture": "skip", + "web-platform-tests/screen-details": "skip", "web-platform-tests/screen-orientation": "import", "web-platform-tests/screen-wake-lock": "import", "web-platform-tests/scroll-animations": "import", "web-platform-tests/scroll-to-text-fragment": "import", "web-platform-tests/secure-contexts": "import", + "web-platform-tests/secure-payment-confirmation": "skip", "web-platform-tests/selection": "import", + "web-platform-tests/serial": "skip", "web-platform-tests/server-timing": "import", "web-platform-tests/service-workers": "import", "web-platform-tests/shadow-dom": "import", + "web-platform-tests/shape-detection": "skip", + "web-platform-tests/shared-storage": "skip", + "web-platform-tests/shared-storage-selecturl-limit": "skip", + "web-platform-tests/signed-exchange": "skip", + "web-platform-tests/soft-navigation-heuristics": "skip", + "web-platform-tests/speculation-rules": "skip", "web-platform-tests/speech-api": "import", "web-platform-tests/storage": "import", + "web-platform-tests/storage-access-api": "skip", "web-platform-tests/streams": "import", + "web-platform-tests/subapps": "skip", "web-platform-tests/subresource-integrity": "import", "web-platform-tests/svg": "import", "web-platform-tests/svg-aam": "skip", + "web-platform-tests/timing-entrytypes-registry": "skip", "web-platform-tests/tools": "import", + "web-platform-tests/top-level-storage-access-api": "skip", "web-platform-tests/touch-events": "import", + "web-platform-tests/trust-tokens": "skip", "web-platform-tests/trusted-types": "skip", + "web-platform-tests/ua-client-hints": "skip", "web-platform-tests/uievents": "import", "web-platform-tests/upgrade-insecure-requests": "import", "web-platform-tests/url": "import", "web-platform-tests/url/tools": "skip", + "web-platform-tests/urlpattern": "skip", "web-platform-tests/user-timing": "import", "web-platform-tests/vibration": "skip", "web-platform-tests/video-rvfc": "import", + "web-platform-tests/virtual-keyboard": "skip", "web-platform-tests/visual-viewport": "import", "web-platform-tests/wai-aria": "import", "web-platform-tests/wasm": "import", "web-platform-tests/web-animations": "import", + "web-platform-tests/web-bundle": "skip", "web-platform-tests/web-locks": "import", "web-platform-tests/web-nfc": "skip", + "web-platform-tests/web-otp": "skip", "web-platform-tests/web-share": "import", "web-platform-tests/webaudio": "import", "web-platform-tests/webauthn": "skip", "web-platform-tests/webcodecs": "import", "web-platform-tests/webdriver": "skip", "web-platform-tests/webgl": "skip", + "web-platform-tests/webgpu": "skip", + "web-platform-tests/webhid": "skip", "web-platform-tests/webmessaging": "import", + "web-platform-tests/webmidi": "skip", + "web-platform-tests/webnn": "skip", "web-platform-tests/webrtc": "import", + "web-platform-tests/webrtc-encoded-transform": "import", "web-platform-tests/webrtc-extensions": "import", + "web-platform-tests/webrtc-ice": "skip", + "web-platform-tests/webrtc-identity": "skip", "web-platform-tests/webrtc-priority": "import", "web-platform-tests/webrtc-stats": "import", + "web-platform-tests/webrtc-svc": "skip", "web-platform-tests/webrtc/legacy": "skip", "web-platform-tests/websockets": "import", "web-platform-tests/websockets/stream": "skip", "web-platform-tests/webstorage": "import", + "web-platform-tests/webtransport": "import", "web-platform-tests/webusb": "skip", "web-platform-tests/webvr": "skip", "web-platform-tests/webvtt": "import", "web-platform-tests/webxr": "import", + "web-platform-tests/window-management": "skip", "web-platform-tests/workers": "import", "web-platform-tests/worklets": "import", "web-platform-tests/x-frame-options": "import", diff --git a/Tools/Scripts/webkitpy/style/checkers/jsonchecker.py b/Tools/Scripts/webkitpy/style/checkers/jsonchecker.py index 13ee87521999..c9f4c1424b74 100644 --- a/Tools/Scripts/webkitpy/style/checkers/jsonchecker.py +++ b/Tools/Scripts/webkitpy/style/checkers/jsonchecker.py @@ -490,12 +490,12 @@ def check(self, lines): ) valid = False - if value not in ("import", "skip"): + if value not in ("import", "skip", "skip-new-directories"): self._handle_style_error( line_no, "json/syntax", 5, - 'Each value must be either "import" or "skip"', + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) valid = False @@ -518,21 +518,22 @@ def check(self, lines): "'{}' has trailing slash".format(key), ) - for i in range(len(parsed_key) - 1, 0, -1): - parent_key = parsed_key[:i] - if parent_key in parsed_expectations: - if value == parsed_expectations[parent_key]: - self._handle_style_error( - line_no, - "json/syntax", - 5, - "'{}' is redundant, '{}' already defines '{}'".format( - key, "/".join(parent_key), value - ), - ) - break - - is_skipped = value == "skip" + if value != "skip-new-directories": + for i in range(len(parsed_key) - 1, 0, -1): + parent_key = parsed_key[:i] + if parent_key in parsed_expectations: + if value == parsed_expectations[parent_key]: + self._handle_style_error( + line_no, + "json/syntax", + 5, + "'{}' is redundant, '{}' already defines '{}'".format( + key, "/".join(parent_key), value + ), + ) + break + + is_skipped = value in ("skip", "skip-new-directories") is_prefix = any( parsed_key == k[: len(parsed_key)] and len(k) > len(parsed_key) diff --git a/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py b/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py index 3cbe28de1b25..df2ca3f4d79a 100644 --- a/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py +++ b/Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py @@ -221,7 +221,10 @@ def test_valid_values(self): ) checker.check(['{"web-platform-tests/exists": "nonsense"}']) error_handler.assert_called_once_with( - 1, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 1, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) def test_skip_existence(self): @@ -363,7 +366,10 @@ def test_line_no_attribution(self): ) checker.check(["{", '"web-platform-tests/exists": "nonsense"', "}"]) error_handler.assert_called_once_with( - 2, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 2, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) error_handler = Mock() @@ -372,7 +378,10 @@ def test_line_no_attribution(self): ) checker.check(["{", r'"web-pl\u0061tform-tests/exists": "nonsense"', "}"]) error_handler.assert_called_once_with( - 2, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 2, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) error_handler = Mock() @@ -389,12 +398,18 @@ def test_line_no_attribution(self): ) self.assertEqual(error_handler.call_count, 2) error_handler.assert_any_call( - 2, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 2, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) # We can't uniquely determine what line "web-platform-tests/exists" is on, so we # return line 0. error_handler.assert_any_call( - 0, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 0, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) error_handler = Mock() @@ -410,7 +425,10 @@ def test_line_no_attribution(self): ] ) error_handler.assert_called_once_with( - 2, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 2, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) error_handler = Mock() @@ -426,7 +444,10 @@ def test_line_no_attribution(self): ] ) error_handler.assert_called_once_with( - 3, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 3, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) error_handler = Mock() @@ -441,5 +462,8 @@ def test_line_no_attribution(self): ] ) error_handler.assert_called_once_with( - 2, "json/syntax", 5, 'Each value must be either "import" or "skip"' + 2, + "json/syntax", + 5, + 'Each value must be one of "import", "skip", or "skip-new-directories"', ) diff --git a/Tools/Scripts/webkitpy/w3c/test_downloader.py b/Tools/Scripts/webkitpy/w3c/test_downloader.py index e25057bf2c96..917257e6e281 100644 --- a/Tools/Scripts/webkitpy/w3c/test_downloader.py +++ b/Tools/Scripts/webkitpy/w3c/test_downloader.py @@ -85,6 +85,7 @@ def __init__(self, repository_directory, port, options): self.test_repositories = self.load_test_repositories(self._filesystem) + self.paths_to_skip_new_directories = [] self.paths_to_skip = [] self.paths_to_import = [] for test_repository in self.test_repositories: @@ -120,14 +121,17 @@ def checkout_test_repository(self, revision, url, directory): def _init_paths_from_expectations(self): import_lines = json.loads(self._filesystem.read_text_file(self.import_expectations_path)) for path, policy in import_lines.items(): - if policy == 'skip': + if policy == 'skip-new-directories': + self.paths_to_skip_new_directories.append(path) + elif policy == 'skip': self.paths_to_skip.append(path) elif policy == 'import': self.paths_to_import.append(path) else: _log.warning('Problem reading import lines ' + path) - def update_import_expectations(self, test_paths): + def update_import_expectations(self, test_paths, to_skip_new_directories=None): + to_skip_new_directories = set() if to_skip_new_directories is None else to_skip_new_directories import_lines = json.loads(self._filesystem.read_text_file(self.import_expectations_path)) for path in test_paths: stripped_path = path.rstrip(self._filesystem.sep) @@ -144,6 +148,9 @@ def update_import_expectations(self, test_paths): if not already_imported: import_lines[stripped_path] = "import" + for path in to_skip_new_directories: + import_lines[path] = "skip" + self._filesystem.write_text_file(self.import_expectations_path, json.dumps(import_lines, sort_keys=True, indent=4, separators=(',', ': ')) + "\n") def clone_tests(self, use_tip_of_tree=False): diff --git a/Tools/Scripts/webkitpy/w3c/test_importer.py b/Tools/Scripts/webkitpy/w3c/test_importer.py index e1913ec99526..9873f74232b8 100644 --- a/Tools/Scripts/webkitpy/w3c/test_importer.py +++ b/Tools/Scripts/webkitpy/w3c/test_importer.py @@ -193,6 +193,8 @@ def __init__(self, port, test_paths, options): self._tests_options = json.loads(self.filesystem.read_text_file(self._tests_options_json_path)) if self.filesystem.exists(self._tests_options_json_path) else None self._slow_tests = [] + self._to_skip_new_directories = set() + self.globalToSuffixes = { 'window': ('html',), 'worker': ('worker.html', 'serviceworker.html', 'sharedworker.html'), @@ -248,7 +250,9 @@ def do_import(self): self.generate_git_submodules_description_for_all_repositories() - self.test_downloader().update_import_expectations(self.test_paths) + self.test_downloader().update_import_expectations( + self.test_paths, self._to_skip_new_directories + ) def generate_git_submodules_description_for_all_repositories(self): for test_repository in self._test_downloader.test_repositories: @@ -276,10 +280,21 @@ def should_skip_path(self, path): return True downloader = self.test_downloader() + paths_to_skip_new_directories = {Path(p) for p in downloader.paths_to_skip_new_directories} paths_to_skip = {Path(p) for p in downloader.paths_to_skip} paths_to_import = {Path(p) for p in downloader.paths_to_import} for parent in itertools.chain([rel_path], rel_path.parents): + if parent in paths_to_skip_new_directories: + if parent != rel_path: + to_skip = parent / rel_path.relative_to(parent).parts[0] + if not to_skip.is_dir(): + # Files directly under skip-new-directories _are_ imported. + assert rel_path == to_skip + return False + self._to_skip_new_directories.add(str(to_skip)) + return True + if parent in paths_to_skip: return True