script/checkout.py (66 lines of code) (raw):

#! /usr/bin/env python3 import common, os, re, subprocess, sys, time def checkout_skia(commit): # Clone Skia if os.path.exists("skia"): print("> Fetching {}".format(commit)) os.chdir("skia") subprocess.check_call(["git", "reset", "--hard"]) subprocess.check_call(["git", "clean", "-d", "-f"]) subprocess.check_call(["git", "fetch", "origin"]) else: print("> Cloning") subprocess.check_call(["git", "clone", "--config", "core.autocrlf=input", "https://github.com/JetBrains/skia.git", "--quiet"]) os.chdir("skia") subprocess.check_call(["git", "fetch", "origin"]) # Checkout commit print("> Checking out", commit) subprocess.check_call(["git", "-c", "advice.detachedHead=false", "checkout", commit]) def git_sync_with_retries(max_retries=3, backoff_seconds=5): attempt = 0 while True: try: print("> Running tools/git-sync-deps (attempt {}/{})".format(attempt+1, max_retries+1)) # On Windows we need to disable HTTPS verify if common.host() == 'windows': env = os.environ.copy() env['PYTHONHTTPSVERIFY'] = '0' subprocess.check_call([sys.executable, "tools/git-sync-deps"], env=env) else: subprocess.check_call([sys.executable, "tools/git-sync-deps"]) print("Success") break except subprocess.CalledProcessError as e: attempt += 1 if attempt > max_retries: print("All {} retries failed. Giving up.".format(max_retries)) raise else: wait = backoff_seconds * attempt print(f"Failed (exit {e.returncode}), retrying in {wait}s…") time.sleep(wait) def main(): os.chdir(os.path.join(os.path.dirname(__file__), os.pardir)) parser = common.create_parser(True) args = parser.parse_args() # Clone depot_tools if not os.path.exists("depot_tools"): subprocess.check_call(["git", "clone", "--config", "core.autocrlf=input", "https://chromium.googlesource.com/chromium/tools/depot_tools.git", "depot_tools"]) match = re.match('(m\\d+)(?:-([0-9a-f]+)(?:-([1-9][0-9]*))?)?', args.version) if not match: raise Exception('Expected --version "m<ver>-<sha>", got "' + args.version + '"') commit = match.group(2) checkout_skia(commit) # git deps print("> Running tools/git-sync-deps") # Trying to avoid 429 HTTP Error from Google repos git_sync_with_retries() # fetch ninja print("> Fetching ninja") subprocess.check_call(["python3", "bin/fetch-ninja"]) # Patch an issue in Windows toolchain: # Enable delayed environment variable expansion for CMD to make GitHub Actions happy # https://issues.skia.org/issues/393402169 with open("gn/toolchain/BUILD.gn", "r") as toolchain_file: toolchain_file_contents = toolchain_file.read() toolchain_file_contents = toolchain_file_contents.replace( 'shell = "cmd.exe /c', 'shell = "cmd.exe /v:on /c', ).replace( r'env_setup = "$shell set \"PATH=%PATH%', r'env_setup = "$shell set \"PATH=!PATH!', ) with open("gn/toolchain/BUILD.gn", "w") as toolchain_file: toolchain_file.write(toolchain_file_contents) return 0 if __name__ == '__main__': sys.exit(main())