|  | #!/usr/bin/env python3 | 
|  |  | 
|  | # Copyright 2022 The IREE Authors | 
|  | # | 
|  | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | """Creates an HTML page for releases for `pip install --find-links` from GitHub releases.""" | 
|  | # TODO(#10479) since we're generating this we might as well create a PEP 503 | 
|  | # compliant index | 
|  | import argparse | 
|  | import html | 
|  | import json | 
|  | import subprocess | 
|  | import sys | 
|  | import textwrap | 
|  |  | 
|  | import requests | 
|  |  | 
|  |  | 
|  | def parse_arguments(): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument("--repo", | 
|  | "--repository", | 
|  | default="openxla/iree", | 
|  | help="The GitHub repository to fetch releases from.") | 
|  | parser.add_argument( | 
|  | "--output", | 
|  | default="-", | 
|  | help="The file to write the HTML to or '-' for stdout (the default)") | 
|  | return parser.parse_args() | 
|  |  | 
|  |  | 
|  | class ReleaseFetcher: | 
|  |  | 
|  | def __init__(self, repo, per_page=100): | 
|  | self._session = requests.Session() | 
|  | self._repo = repo | 
|  | self._per_page = per_page | 
|  |  | 
|  | def get_all(self): | 
|  | url = f"https://api.github.com/repos/{self._repo}/releases" | 
|  | page = 1 | 
|  |  | 
|  | while True: | 
|  | response = self._session.get(url, | 
|  | params={ | 
|  | "page": page, | 
|  | "per_page": self._per_page, | 
|  | }) | 
|  | for release in response.json(): | 
|  | yield release | 
|  | if "next" not in response.links: | 
|  | break | 
|  | page += 1 | 
|  |  | 
|  |  | 
|  | def main(args): | 
|  | fetcher = ReleaseFetcher(repo=args.repo) | 
|  | with (sys.stdout if args.output == "-" else open(args.output, "w")) as f: | 
|  | f.write( | 
|  | textwrap.dedent("""\ | 
|  | <!DOCTYPE html> | 
|  | <html> | 
|  | <body> | 
|  | """)) | 
|  | for release in fetcher.get_all(): | 
|  | if release["draft"]: | 
|  | continue | 
|  | for asset in release["assets"]: | 
|  | url = html.escape(asset['browser_download_url']) | 
|  | name = html.escape(asset['name']) | 
|  | f.write(f"    <a href={url}>{name}</a><br />\n") | 
|  | f.write(textwrap.dedent("""\ | 
|  | </body> | 
|  | </html> | 
|  | """)) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main(parse_arguments()) |