| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #!/usr/bin/env python3
- #
- # Copyright (C) 2019 Intel Corporation. All rights reserved.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #
- import argparse
- import json
- import os
- import shlex
- import subprocess
- import sys
- from urllib.error import HTTPError, URLError
- import urllib.request
- def get_last_commit(target_path, cwd):
- last_commit_cmd = f"git log -n 1 --pretty=format:%H -- {target_path}"
- p = subprocess.run(
- shlex.split(last_commit_cmd), capture_output=True, check=True, cwd=cwd
- )
- return p.stdout.decode().strip()
- def fetch_git_tags():
- list_tag_cmd = (
- 'git tag --list WAMR-*.*.* --sort=committerdate --format="%(refname:short)"'
- )
- p = subprocess.run(shlex.split(list_tag_cmd), capture_output=True, check=True)
- all_tags = p.stdout.decode().strip()
- return all_tags.split("\n")
- def download_binaries(binary_name_stem, cwd):
- """
- 1. find the latest release name
- 2. form assets download url:
- """
- try:
- all_tags = fetch_git_tags()
- # *release_process.yml* will create a tag and release at first
- second_last_tag = all_tags[-2]
- latest_tag = all_tags[-1]
- latest_url = "https://api.github.com/repos/bytecodealliance/wasm-micro-runtime/releases/latest"
- print(f"::notice::query the latest release with {latest_url}...")
- with urllib.request.urlopen(latest_url) as response:
- body = response.read()
- release_name = json.loads(body)["name"]
- # WAMR-X.Y.Z -> X.Y.Z
- second_last_sem_ver = second_last_tag[5:]
- latest_sem_ver = latest_tag[5:]
- assert latest_sem_ver in binary_name_stem
- name_stem_in_release = binary_name_stem.replace(
- latest_sem_ver, second_last_sem_ver
- )
- # download and rename
- for file_ext in (".zip", ".tar.gz"):
- assets_url = f"https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/{release_name}/{name_stem_in_release}{file_ext}"
- local_path = f"{binary_name_stem}{file_ext}"
- print(f"::notice::download from {assets_url} and save as {local_path}...")
- urllib.request.urlretrieve(assets_url, local_path)
- return True
- except HTTPError as error:
- print(error.status, error.reason)
- except URLError as error:
- print(error.reason)
- except TimeoutError:
- print("Request timeout")
- return False
- def main():
- parser = argparse.ArgumentParser(
- description="Reuse binaries of the latest release if no more modification on the_path since last_commit"
- )
- parser.add_argument("working_directory", type=str)
- parser.add_argument("--binary_name_stem", type=str)
- parser.add_argument("--last_commit", type=str)
- parser.add_argument("--the_path", type=str)
- args = parser.parse_args()
- last_commit = get_last_commit(args.the_path, args.working_directory)
- if last_commit == args.last_commit:
- return download_binaries(args.binary_name_stem, args.working_directory)
- else:
- return False
- if __name__ == "__main__":
- # use output to indicate results
- # echo "result=${result}" >> "$GITHUB_OUTPUT"
- with open(os.environ.get("GITHUB_OUTPUT"), 'a') as output_file:
- output_file.write("result=hit\n" if main() else "result=not-hit\n")
- # always return 0
- sys.exit(0)
|