| #!/usr/bin/env python3 |
| |
| # Copyright (C) 2025 Igalia S.L. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # |
| # 1. Redistributions of source code must retain the above |
| # copyright notice, this list of conditions and the following |
| # disclaimer. |
| # 2. Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following |
| # disclaimer in the documentation and/or other materials |
| # provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY |
| # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE |
| # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR |
| # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF |
| # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| # SUCH DAMAGE. |
| |
| # Updates the source map spec tests in LayoutTests/tc39-tg4/source-map-tests |
| # with the latest upstream tests. |
| |
| import argparse |
| import os |
| import re |
| import shutil |
| import subprocess |
| import sys |
| import tempfile |
| |
| from pathlib import Path |
| |
| import webkitpy |
| from webkitcorepy import run |
| from webkitscmpy import local, remote |
| |
| layout_tests_directory = Path(__file__).parent / "../../LayoutTests" |
| source_map_repo_url = "https://github.com/tc39/source-map-tests.git" |
| source_map_repo_branch = "main" |
| |
| def generate_readme_contents(git_hash): |
| return """\ |
| This directory contains the imported TG4 source map tests |
| |
| - URL: {url} |
| - Commit: {git_hash} |
| |
| To update the tests, run the script at Tools/Scripts/import-source-map-tests |
| with no arguments. This will checkout out the repo above and copy the new |
| tests over. You can also specify a different repo and branch (see usage |
| info with the -h flag). |
| """.format(url=source_map_repo_url, git_hash=git_hash) |
| |
| def checkout_tests(continuation): |
| temporary_directory = tempfile.mkdtemp() |
| try: |
| checkout_folder = "source-map-tests" |
| checkout_directory = os.path.join(temporary_directory, checkout_folder) |
| print("Checking out tests from " + source_map_repo_url + " into " + checkout_directory) |
| result = run([local.Git.executable(), "clone", "-b", source_map_repo_branch, source_map_repo_url, checkout_directory], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
| result.check_returncode() |
| git = local.Scm.from_path(checkout_directory) |
| git_hash = git.commit().hash |
| print("Checked out git hash " + git_hash) |
| continuation(Path(checkout_directory), git_hash) |
| finally: |
| shutil.rmtree(temporary_directory) |
| |
| def copy_tests(tmp_path, git_hash): |
| tests_path = layout_tests_directory / "imported/tc39-tg4/source-map-tests" |
| result = run([local.Git.executable(), "status", "--porcelain=v2", "-z", tests_path], capture_output=True) |
| test_dir_clean = result.returncode == 0 and len(result.stdout) == 0 |
| if not test_dir_clean: |
| print("Uncommitted changes in source map tests, please commit or discard them") |
| sys.exit(1) |
| print("Deleting old test files at " + tests_path.as_posix()) |
| shutil.rmtree(tests_path) |
| print("Copying new tests from " + tmp_path.as_posix()) |
| shutil.copytree(tmp_path, tests_path, ignore=shutil.ignore_patterns(".git", "*.patch")) |
| print("Generating WebKit README") |
| Path.write_text(tests_path / "README.WebKit", generate_readme_contents(git_hash)) |
| |
| parser = argparse.ArgumentParser(description="Import source map tests from the TG4 or other git repo.", |
| epilog="Refer to LayoutTests/imported/tc39-tg4/README.webkit for more information.") |
| parser.add_argument('--repo', help='Git repo to check out') |
| parser.add_argument('--dir', help='Copy from local directory') |
| parser.add_argument('--branch', help='Git branch to check out') |
| options = parser.parse_args() |
| |
| if options.repo and options.dir: |
| print("Only one of --repo or --dir should be provided") |
| sys.exit(1) |
| |
| if options.dir and options.branch: |
| print("Option --branch must be paired with --repo") |
| sys.exit(1) |
| |
| if options.repo: |
| source_map_repo_url = options.repo |
| if options.branch: |
| source_map_repo_branch = options.branch |
| |
| response = input("This script will check out and replace the contents of the TG4 tests, continue? [y/N] ") |
| if response.lower() == "y": |
| checkout_tests(copy_tests) |
| elif options.dir: |
| response = input("This script will replace the contents of the TG4 tests, continue? [y/N] ") |
| if response.lower() == "y": |
| copy_tests(Path(options.dir), "local copy, no hash") |
| else: |
| sys.exit(1) |