| #!/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()) |