blob: 6723a9168a0f90d85f0d1be7875ca74cd89ef05f [file] [log] [blame]
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -07001#!/usr/bin/env python3
2
3# Copyright 2022 The IREE Authors
4#
5# Licensed under the Apache License v2.0 with LLVM Exceptions.
6# See https://llvm.org/LICENSE.txt for license information.
7# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8"""Creates an HTML page for releases for `pip install --find-links` from GitHub releases."""
9# TODO(#10479) since we're generating this we might as well create a PEP 503
10# compliant index
11import argparse
12import html
13import json
14import subprocess
15import sys
16import textwrap
17
18import requests
19
20
21def parse_arguments():
Jakub Kuderskibe24f022023-06-21 14:44:18 -040022 parser = argparse.ArgumentParser()
23 parser.add_argument(
24 "--repo",
25 "--repository",
Scott Todd3f51a552024-04-19 11:00:27 -070026 default="iree-org/iree",
Jakub Kuderskibe24f022023-06-21 14:44:18 -040027 help="The GitHub repository to fetch releases from.",
28 )
29 parser.add_argument(
30 "--output",
31 default="-",
32 help="The file to write the HTML to or '-' for stdout (the default)",
33 )
34 return parser.parse_args()
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070035
36
37class ReleaseFetcher:
Jakub Kuderskibe24f022023-06-21 14:44:18 -040038 def __init__(self, repo, per_page=100):
39 self._session = requests.Session()
40 self._repo = repo
41 self._per_page = per_page
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070042
Jakub Kuderskibe24f022023-06-21 14:44:18 -040043 def get_all(self):
44 url = f"https://api.github.com/repos/{self._repo}/releases"
45 page = 1
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070046
Scott Todd5cdd6ec2024-02-20 20:02:30 -080047 # GitHub limits API responses to the first 1000 results.
48 while page * self._per_page < 1000:
Jakub Kuderskibe24f022023-06-21 14:44:18 -040049 response = self._session.get(
50 url,
51 params={
52 "page": page,
53 "per_page": self._per_page,
54 },
55 )
56 for release in response.json():
57 yield release
58 if "next" not in response.links:
59 break
60 page += 1
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070061
62
63def main(args):
Jakub Kuderskibe24f022023-06-21 14:44:18 -040064 fetcher = ReleaseFetcher(repo=args.repo)
65 with sys.stdout if args.output == "-" else open(args.output, "w") as f:
66 f.write(
67 textwrap.dedent(
68 """\
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070069 <!DOCTYPE html>
70 <html>
71 <body>
Jakub Kuderskibe24f022023-06-21 14:44:18 -040072 """
73 )
74 )
75 for release in fetcher.get_all():
76 if release["draft"]:
77 continue
78 for asset in release["assets"]:
79 url = html.escape(asset["browser_download_url"])
80 name = html.escape(asset["name"])
81 f.write(f" <a href={url}>{name}</a><br />\n")
82 f.write(
83 textwrap.dedent(
84 """\
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070085 </body>
86 </html>
Jakub Kuderskibe24f022023-06-21 14:44:18 -040087 """
88 )
89 )
Geoffrey Martin-Noble7d53e562022-09-28 15:43:04 -070090
91
92if __name__ == "__main__":
Jakub Kuderskibe24f022023-06-21 14:44:18 -040093 main(parse_arguments())