blob: 6723a9168a0f90d85f0d1be7875ca74cd89ef05f [file] [log] [blame]
#!/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
# GitHub limits API responses to the first 1000 results.
while page * self._per_page < 1000:
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())