|
| 1 | +#!/usr/bin/env python |
| 2 | + |
| 3 | +import argparse |
| 4 | +import hashlib |
| 5 | +import json |
| 6 | +import os |
| 7 | +import re |
| 8 | +import shutil |
| 9 | +import subprocess |
| 10 | +import sys |
| 11 | +from pathlib import Path |
| 12 | + |
| 13 | +import urllib3 |
| 14 | +from packaging.version import parse |
| 15 | + |
| 16 | +http = urllib3.PoolManager() |
| 17 | +root_dir = Path(os.path.realpath(__file__)).parent.parent |
| 18 | + |
| 19 | + |
| 20 | +def get_chrome_milestone(): |
| 21 | + """This is the same method from pinned_browser. Use --chrome_channel=Beta if |
| 22 | + using early stable release.""" |
| 23 | + parser = argparse.ArgumentParser() |
| 24 | + parser.add_argument("--chrome_channel", default="Stable", help="Set the Chrome channel") |
| 25 | + args = parser.parse_args() |
| 26 | + channel = args.chrome_channel |
| 27 | + |
| 28 | + r = http.request( |
| 29 | + "GET", f"https://chromiumdash.appspot.com/fetch_releases?channel={channel}&num=1&platform=Mac,Linux" |
| 30 | + ) |
| 31 | + all_versions = json.loads(r.data) |
| 32 | + # use the same milestone for all Chrome releases, so pick the lowest |
| 33 | + milestone = min([version["milestone"] for version in all_versions if version["milestone"]]) |
| 34 | + r = http.request( |
| 35 | + "GET", "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json" |
| 36 | + ) |
| 37 | + versions = json.loads(r.data)["versions"] |
| 38 | + |
| 39 | + return sorted( |
| 40 | + filter(lambda v: v["version"].split(".")[0] == str(milestone), versions), key=lambda v: parse(v["version"]) |
| 41 | + )[-1] |
| 42 | + |
| 43 | + |
| 44 | +def fetch_and_save(url, file_path): |
| 45 | + response = http.request("GET", url) |
| 46 | + with open(file_path, "wb") as file: |
| 47 | + file.write(response.data) |
| 48 | + |
| 49 | + |
| 50 | +def new_chrome(chrome_milestone): |
| 51 | + return chrome_milestone["version"].split(".")[0] |
| 52 | + |
| 53 | + |
| 54 | +def previous_chrome(chrome_milestone): |
| 55 | + return str(int(new_chrome(chrome_milestone)) - 1) |
| 56 | + |
| 57 | + |
| 58 | +def old_chrome(chrome_milestone): |
| 59 | + return str(int(new_chrome(chrome_milestone)) - 3) |
| 60 | + |
| 61 | + |
| 62 | +def add_pdls(chrome_milestone): |
| 63 | + source_dir = root_dir / f"common/devtools/chromium/v{previous_chrome(chrome_milestone)}" |
| 64 | + target_dir = root_dir / f"common/devtools/chromium/v{new_chrome(chrome_milestone)}" |
| 65 | + old_dir = root_dir / f"common/devtools/chromium/v{old_chrome(chrome_milestone)}" |
| 66 | + |
| 67 | + if os.path.isdir(old_dir): |
| 68 | + shutil.rmtree(old_dir) |
| 69 | + |
| 70 | + if not os.path.isdir(target_dir): |
| 71 | + os.makedirs(target_dir, exist_ok=True) |
| 72 | + if os.path.isdir(source_dir): |
| 73 | + shutil.copytree(source_dir, target_dir, dirs_exist_ok=True) |
| 74 | + |
| 75 | + fetch_and_save( |
| 76 | + f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/third_party/blink/public/devtools_protocol/browser_protocol.pdl", |
| 77 | + f"{target_dir}/browser_protocol.pdl", |
| 78 | + ) |
| 79 | + |
| 80 | + deps_content = http.request( |
| 81 | + "GET", f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/DEPS" |
| 82 | + ).data.decode("utf-8") |
| 83 | + v8_revision = [line for line in deps_content.split("\n") if "v8_revision" in line][0].split(": ")[1].strip("',") |
| 84 | + fetch_and_save( |
| 85 | + f"https://raw.githubusercontent.com/v8/v8/{v8_revision}/include/js_protocol.pdl", |
| 86 | + f"{target_dir}/js_protocol.pdl", |
| 87 | + ) |
| 88 | + |
| 89 | + # javadocs does not like script tags |
| 90 | + with open(f"{target_dir}/browser_protocol.pdl", "r+") as file: |
| 91 | + script_replace = file.read().replace("`<script>`", "`script`") |
| 92 | + file.seek(0) |
| 93 | + file.write(script_replace) |
| 94 | + file.truncate() |
| 95 | + |
| 96 | + subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir) |
| 97 | + |
| 98 | + |
| 99 | +def create_new_chrome_files(src_base, chrome_milestone): |
| 100 | + """Java and .NET need to copy previous version directory into new version |
| 101 | + directory.""" |
| 102 | + source_dir = root_dir / f"{src_base}/v{previous_chrome(chrome_milestone)}" |
| 103 | + target_dir = root_dir / f"{src_base}/v{new_chrome(chrome_milestone)}" |
| 104 | + old_dir = root_dir / f"{src_base}/v{old_chrome(chrome_milestone)}" |
| 105 | + |
| 106 | + # New target must not be already present |
| 107 | + if not target_dir.is_dir(): |
| 108 | + if old_dir.is_dir(): |
| 109 | + shutil.rmtree(old_dir) |
| 110 | + |
| 111 | + if source_dir.is_dir() and any(source_dir.iterdir()): |
| 112 | + os.makedirs(target_dir, exist_ok=True) |
| 113 | + for item in source_dir.iterdir(): |
| 114 | + shutil.copy(item, target_dir) |
| 115 | + |
| 116 | + for file in target_dir.iterdir(): |
| 117 | + replace_in_file(file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 118 | + new_filename = file.name.replace(previous_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 119 | + file.rename(target_dir / new_filename) |
| 120 | + |
| 121 | + subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir) |
| 122 | + |
| 123 | + |
| 124 | +def replace_in_file(file_path, old_string, new_string, is_regex=False): |
| 125 | + with open(file_path, "r+") as file: |
| 126 | + if not is_regex: |
| 127 | + old_string = re.escape(old_string) |
| 128 | + data = re.sub(old_string, new_string, file.read()) |
| 129 | + file.seek(0) |
| 130 | + file.write(data) |
| 131 | + file.truncate() |
| 132 | + |
| 133 | + |
| 134 | +def update_java(chrome_milestone): |
| 135 | + create_new_chrome_files("java/src/org/openqa/selenium/devtools", chrome_milestone) |
| 136 | + |
| 137 | + files = [ |
| 138 | + root_dir / "java/src/org/openqa/selenium/devtools/versions.bzl", |
| 139 | + root_dir / "Rakefile", |
| 140 | + ] |
| 141 | + for file in files: |
| 142 | + replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 143 | + |
| 144 | + |
| 145 | +def update_dotnet(chrome_milestone): |
| 146 | + create_new_chrome_files("dotnet/src/webdriver/DevTools", chrome_milestone) |
| 147 | + |
| 148 | + files = [ |
| 149 | + root_dir / "dotnet/selenium-dotnet-version.bzl", |
| 150 | + root_dir / "dotnet/src/webdriver/WebDriver.csproj.prebuild.cmd", |
| 151 | + root_dir / "dotnet/src/webdriver/WebDriver.csproj.prebuild.sh", |
| 152 | + root_dir / "dotnet/src/webdriver/DevTools/DevToolsDomains.cs", |
| 153 | + ] |
| 154 | + for file in files: |
| 155 | + replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 156 | + |
| 157 | + files = [root_dir / "dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs"] |
| 158 | + dir_path = root_dir / "dotnet/test/common/DevTools" |
| 159 | + files.extend(str(file) for file in dir_path.glob("*") if file.is_file()) |
| 160 | + for file in files: |
| 161 | + replace_in_file(file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 162 | + |
| 163 | + |
| 164 | +def update_ruby(chrome_milestone): |
| 165 | + file = root_dir / "rb/lib/selenium/devtools/BUILD.bazel" |
| 166 | + replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 167 | + |
| 168 | + file = root_dir / "rb/lib/selenium/devtools/version.rb" |
| 169 | + replace_in_file(file, rf"{previous_chrome(chrome_milestone)}\.[0-9]*", f"{new_chrome(chrome_milestone)}.0", True) |
| 170 | + |
| 171 | + |
| 172 | +def update_python(chrome_milestone): |
| 173 | + file = root_dir / "py/BUILD.bazel" |
| 174 | + replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 175 | + |
| 176 | + |
| 177 | +def update_js(chrome_milestone): |
| 178 | + file = root_dir / "javascript/node/selenium-webdriver/BUILD.bazel" |
| 179 | + replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone)) |
| 180 | + |
| 181 | + |
| 182 | +if __name__ == "__main__": |
| 183 | + chrome_milestone = get_chrome_milestone() |
| 184 | + add_pdls(chrome_milestone) |
| 185 | + update_java(chrome_milestone) |
| 186 | + update_dotnet(chrome_milestone) |
| 187 | + update_ruby(chrome_milestone) |
| 188 | + update_python(chrome_milestone) |
| 189 | + update_js(chrome_milestone) |
0 commit comments