| #!/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="iree-org/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()) |