#!/usr/bin/env python3 # This script will update emsdk/bazel/revisions.bzl to the latest version of # emscripten. It reads emsdk/emscripten-releases-tags.json to get the latest # version number. Then, it downloads the prebuilts for that version and computes # the sha256sum for the archive. It then puts all this information into the # emsdk/bazel/revisions.bzl file. import hashlib import json import os import requests import sys STORAGE_URL = 'https://storage.googleapis.com/webassembly/emscripten-releases-builds' EMSDK_ROOT = os.path.dirname(os.path.dirname(__file__)) RELEASES_TAGS_FILE = EMSDK_ROOT + '/emscripten-releases-tags.json' BAZEL_REVISIONS_FILE = EMSDK_ROOT + '/bazel/revisions.bzl' def get_latest_info(): with open(RELEASES_TAGS_FILE) as f: info = json.load(f) latest = info['aliases']['latest'] return latest, info['releases'][latest] def get_sha(platform, archive_fmt, latest_hash, arch_suffix=''): r = requests.get(f'{STORAGE_URL}/{platform}/{latest_hash}/wasm-binaries{arch_suffix}.{archive_fmt}') r.raise_for_status() print(f'Fetching {r.url}') h = hashlib.new('sha256') for chunk in r.iter_content(chunk_size=1024): h.update(chunk) return h.hexdigest() def revisions_item(version, latest_hash): return f'''\ "{version}": struct( hash = "{latest_hash}", sha_linux = "{get_sha('linux', 'tar.xz', latest_hash)}", sha_mac = "{get_sha('mac', 'tar.xz', latest_hash)}", sha_mac_arm64 = "{get_sha('mac', 'tar.xz', latest_hash, '-arm64')}", sha_win = "{get_sha('win', 'zip', latest_hash)}", ), ''' def insert_revision(item): with open(BAZEL_REVISIONS_FILE, 'r') as f: lines = f.readlines() lines.insert(lines.index('EMSCRIPTEN_TAGS = {\n') + 1, item) with open(BAZEL_REVISIONS_FILE, 'w') as f: f.write(''.join(lines)) def main(argv): version, latest_hash = get_latest_info() item = revisions_item(version, latest_hash) print('inserting item:') print(item) insert_revision(item) if __name__ == '__main__': sys.exit(main(sys.argv))