@@ -26,99 +26,115 @@ def calculate_hash(url):
2626 return h .hexdigest ()
2727
2828
29- def get_chrome_milestone ():
30- parser = argparse .ArgumentParser ()
31- parser .add_argument ('--chrome_channel' , default = 'Stable' , help = 'Set the Chrome channel' )
32- args = parser .parse_args ()
33- channel = args .chrome_channel
34-
35- r = http .request (
36- "GET" , f"https://chromiumdash.appspot.com/fetch_releases?channel={ channel } &num=1&platform=Mac,Linux"
37- )
38- all_versions = json .loads (r .data )
39- # use the same milestone for all chrome releases, so pick the lowest
40- milestone = min ([version ["milestone" ] for version in all_versions if version ["milestone" ]])
41- r = http .request (
42- "GET" , "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"
43- )
44- versions = json .loads (r .data )["versions" ]
29+ #!/usr/bin/env python
30+
31+ import argparse
32+ import hashlib
33+ import json
34+ import os
35+ import sys
36+ from pathlib import Path
37+
38+ import urllib3
39+ from packaging .version import parse
40+
41+ http = urllib3 .PoolManager ()
4542
46- return sorted (
47- filter (lambda v : v ["version" ].split ("." )[0 ] == str (milestone ), versions ), key = lambda v : parse (v ["version" ])
48- )[- 1 ]
43+
44+ def calculate_hash (url ):
45+ print ("Calculate hash for %s" % url , file = sys .stderr )
46+ h = hashlib .sha256 ()
47+ r = http .request ("GET" , url , preload_content = False )
48+ for b in iter (lambda : r .read (4096 ), b"" ):
49+ h .update (b )
50+ return h .hexdigest ()
4951
5052
51- def chromedriver (selected_version ):
53+ def get_chrome_versions ():
54+ channels = ['Stable' , 'Beta' ]
55+ versions = {}
56+ for channel in channels :
57+ r = http .request (
58+ "GET" , f"https://chromiumdash.appspot.com/fetch_releases?channel={ channel } &num=1&platform=Mac,Linux"
59+ )
60+ all_versions = json .loads (r .data )
61+ milestone = min ([version ["milestone" ] for version in all_versions if version ["milestone" ]])
62+ r = http .request (
63+ "GET" , "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"
64+ )
65+ all_known_versions = json .loads (r .data )["versions" ]
66+ selected_version = sorted (
67+ filter (lambda v : v ["version" ].split ("." )[0 ] == str (milestone ), all_known_versions ),
68+ key = lambda v : parse (v ["version" ])
69+ )[- 1 ]
70+ versions [channel ] = selected_version
71+ return versions
72+
73+
74+ def chromedriver (selected_version , workspace_name = "" ):
5275 content = ""
5376
5477 drivers = selected_version ["downloads" ]["chromedriver" ]
5578
5679 linux = [d ["url" ] for d in drivers if d ["platform" ] == "linux64" ][0 ]
5780 sha = calculate_hash (linux )
5881
59- content = (
60- content
61- + """ http_archive(
62- name = "linux_chromedriver",
63- url = "%s",
64- sha256 = "%s",
65- strip_prefix = "chromedriver-linux64",
82+ content += f""" http_archive(
83+ name = \" linux_{ workspace_name } chromedriver\" ,
84+ url = \" { linux } \" ,
85+ sha256 = \" { sha } \" ,
86+ strip_prefix = \" chromedriver-linux64\" ,
6687 build_file_content = \" \" \"
67- load("@aspect_rules_js//js:defs.bzl", "js_library")
68- package(default_visibility = ["//visibility:public"])
88+ load(\ " @aspect_rules_js//js:defs.bzl\ " , \ " js_library\ " )
89+ package(default_visibility = [\ " //visibility:public\ " ])
6990
70- exports_files(["chromedriver"])
91+ exports_files([\ " chromedriver\ " ])
7192
7293js_library(
73- name = "chromedriver-js",
74- data = ["chromedriver"],
94+ name = \ " chromedriver-js\ " ,
95+ data = [\ " chromedriver\ " ],
7596)
7697\" \" \" ,
7798 )
7899"""
79- % (linux , sha )
80- )
81100
82101 mac = [d ["url" ] for d in drivers if d ["platform" ] == "mac-x64" ][0 ]
83102 sha = calculate_hash (mac )
84- content = (
85- content
86- + """
103+ content += f"""
87104 http_archive(
88- name = "mac_chromedriver ",
89- url = "%s ",
90- sha256 = "%s ",
91- strip_prefix = "chromedriver-mac-x64",
105+ name = \" mac_ { workspace_name } chromedriver \ " ,
106+ url = \" { mac } \ " ,
107+ sha256 = \" { sha } \ " ,
108+ strip_prefix = \ " chromedriver-mac-x64\ " ,
92109 build_file_content = \" \" \"
93- load("@aspect_rules_js//js:defs.bzl", "js_library")
94- package(default_visibility = ["//visibility:public"])
110+ load(\ " @aspect_rules_js//js:defs.bzl\ " , \ " js_library\ " )
111+ package(default_visibility = [\ " //visibility:public\ " ])
95112
96- exports_files(["chromedriver"])
113+ exports_files([\ " chromedriver\ " ])
97114
98115js_library(
99- name = "chromedriver-js",
100- data = ["chromedriver"],
116+ name = \ " chromedriver-js\ " ,
117+ data = [\ " chromedriver\ " ],
101118)
102119\" \" \" ,
103120 )
104121"""
105- % (mac , sha )
106- )
107122
108123 return content
109124
125+ def chrome (selected_version , workspace_name = "" ):
126+ print (f"Calculating hash for Chrome ({ workspace_name or 'stable' } ) version { selected_version ['version' ]} " , file = sys .stderr )
110127
111- def chrome (selected_version ):
112128 chrome_downloads = selected_version ["downloads" ]["chrome" ]
113129
114130 linux = [d ["url" ] for d in chrome_downloads if d ["platform" ] == "linux64" ][0 ]
115131 sha = calculate_hash (linux )
116132
117- content = """
133+ content = f """
118134 http_archive(
119- name = "linux_chrome ",
120- url = "%s ",
121- sha256 = "%s ",
135+ name = "linux_ { workspace_name } chrome ",
136+ url = "{ linux } ",
137+ sha256 = "{ sha } ",
122138 build_file_content = \" \" \"
123139load("@aspect_rules_js//js:defs.bzl", "js_library")
124140package(default_visibility = ["//visibility:public"])
@@ -136,19 +152,15 @@ def chrome(selected_version):
136152)
137153\" \" \" ,
138154 )
139-
140- """ % (
141- linux ,
142- sha ,
143- )
155+ """
144156
145157 mac = [d ["url" ] for d in chrome_downloads if d ["platform" ] == "mac-x64" ][0 ]
146158 sha = calculate_hash (mac )
147159
148- content += """ http_archive(
149- name = "mac_chrome ",
150- url = "%s ",
151- sha256 = "%s ",
160+ content += f """ http_archive(
161+ name = "mac_ { workspace_name } chrome ",
162+ url = "{ mac } ",
163+ sha256 = "{ sha } ",
152164 strip_prefix = "chrome-mac-x64",
153165 patch_cmds = [
154166 "mv 'Google Chrome for Testing.app' Chrome.app",
@@ -166,11 +178,7 @@ def chrome(selected_version):
166178)
167179\" \" \" ,
168180 )
169-
170- """ % (
171- mac ,
172- sha ,
173- )
181+ """
174182
175183 return content
176184
@@ -496,13 +504,21 @@ def pin_browsers():
496504 local_drivers(name = "local_drivers")
497505
498506"""
499- content = content + firefox ()
500- content = content + geckodriver ()
501- content = content + edge ()
502- content = content + edgedriver ()
503- chrome_milestone = get_chrome_milestone ()
504- content = content + chrome (chrome_milestone )
505- content = content + chromedriver (chrome_milestone )
507+ content += firefox ()
508+ content += geckodriver ()
509+ content += edge ()
510+ content += edgedriver ()
511+
512+ chrome_versions = get_chrome_versions ()
513+ chrome_stable = chrome_versions ['Stable' ]
514+ content += chrome (chrome_stable )
515+ content += chromedriver (chrome_stable )
516+
517+ chrome_beta = chrome_versions ['Beta' ]
518+ if chrome_stable ["version" ] != chrome_beta ["version" ]:
519+ content += chrome (chrome_beta , workspace_name = "beta_" )
520+ content += chromedriver (chrome_beta , workspace_name = "beta_" )
521+
506522 content += """
507523def _pin_browsers_extension_impl(_ctx):
508524 pin_browsers()
0 commit comments