1e66f31c5Sopenharmony_ci#!/usr/bin/python3
2e66f31c5Sopenharmony_ci
3e66f31c5Sopenharmony_ciimport itertools
4e66f31c5Sopenharmony_ciimport os
5e66f31c5Sopenharmony_ciimport re
6e66f31c5Sopenharmony_ciimport subprocess
7e66f31c5Sopenharmony_ci
8e66f31c5Sopenharmony_ciHTML = r'''
9e66f31c5Sopenharmony_ci<!DOCTYPE html>
10e66f31c5Sopenharmony_ci<html>
11e66f31c5Sopenharmony_ci  <head>
12e66f31c5Sopenharmony_ci    <link rel="stylesheet" href="http://libuv.org/styles/vendor.css">
13e66f31c5Sopenharmony_ci    <link rel="stylesheet" href="http://libuv.org/styles/main.css">
14e66f31c5Sopenharmony_ci    <style>
15e66f31c5Sopenharmony_ci    table {{
16e66f31c5Sopenharmony_ci      border-spacing: 0;
17e66f31c5Sopenharmony_ci    }}
18e66f31c5Sopenharmony_ci    body table {{
19e66f31c5Sopenharmony_ci      margin: 0 0 0 12pt;
20e66f31c5Sopenharmony_ci    }}
21e66f31c5Sopenharmony_ci    th, td {{
22e66f31c5Sopenharmony_ci      padding: 2pt;
23e66f31c5Sopenharmony_ci      text-align: left;
24e66f31c5Sopenharmony_ci      vertical-align: top;
25e66f31c5Sopenharmony_ci    }}
26e66f31c5Sopenharmony_ci    table table {{
27e66f31c5Sopenharmony_ci      border-collapse: initial;
28e66f31c5Sopenharmony_ci      padding: 0 0 16pt 0;
29e66f31c5Sopenharmony_ci    }}
30e66f31c5Sopenharmony_ci    table table tr:nth-child(even) {{
31e66f31c5Sopenharmony_ci      background-color: #777;
32e66f31c5Sopenharmony_ci    }}
33e66f31c5Sopenharmony_ci    </style>
34e66f31c5Sopenharmony_ci  </head>
35e66f31c5Sopenharmony_ci  <body>
36e66f31c5Sopenharmony_ci    <table>{groups}</table>
37e66f31c5Sopenharmony_ci  </body>
38e66f31c5Sopenharmony_ci</html>
39e66f31c5Sopenharmony_ci'''
40e66f31c5Sopenharmony_ci
41e66f31c5Sopenharmony_ciGROUPS = r'''
42e66f31c5Sopenharmony_ci<tr>
43e66f31c5Sopenharmony_ci  <td>{groups[0]}</td>
44e66f31c5Sopenharmony_ci  <td>{groups[1]}</td>
45e66f31c5Sopenharmony_ci  <td>{groups[2]}</td>
46e66f31c5Sopenharmony_ci  <td>{groups[3]}</td>
47e66f31c5Sopenharmony_ci</tr>
48e66f31c5Sopenharmony_ci'''
49e66f31c5Sopenharmony_ci
50e66f31c5Sopenharmony_ciGROUP = r'''
51e66f31c5Sopenharmony_ci<table>
52e66f31c5Sopenharmony_ci  <tr>
53e66f31c5Sopenharmony_ci    <th>version</th>
54e66f31c5Sopenharmony_ci    <th>tarball</th>
55e66f31c5Sopenharmony_ci    <th>gpg</th>
56e66f31c5Sopenharmony_ci    <th>windows</th>
57e66f31c5Sopenharmony_ci  </tr>
58e66f31c5Sopenharmony_ci  {rows}
59e66f31c5Sopenharmony_ci</table>
60e66f31c5Sopenharmony_ci'''
61e66f31c5Sopenharmony_ci
62e66f31c5Sopenharmony_ciROW = r'''
63e66f31c5Sopenharmony_ci<tr>
64e66f31c5Sopenharmony_ci  <td>
65e66f31c5Sopenharmony_ci    <a href="http://dist.libuv.org/dist/{tag}/">{tag}</a>
66e66f31c5Sopenharmony_ci  </td>
67e66f31c5Sopenharmony_ci  <td>
68e66f31c5Sopenharmony_ci    <a href="http://dist.libuv.org/dist/{tag}/libuv-{tag}.tar.gz">tarball</a>
69e66f31c5Sopenharmony_ci  </td>
70e66f31c5Sopenharmony_ci  <td>{maybe_gpg}</td>
71e66f31c5Sopenharmony_ci  <td>{maybe_exe}</td>
72e66f31c5Sopenharmony_ci</tr>
73e66f31c5Sopenharmony_ci'''
74e66f31c5Sopenharmony_ci
75e66f31c5Sopenharmony_ciGPG = r'''
76e66f31c5Sopenharmony_ci<a href="http://dist.libuv.org/dist/{tag}/libuv-{tag}.tar.gz.sign">gpg</a>
77e66f31c5Sopenharmony_ci'''
78e66f31c5Sopenharmony_ci
79e66f31c5Sopenharmony_ci# The binaries don't have a predictable name, link to the directory instead.
80e66f31c5Sopenharmony_ciEXE = r'''
81e66f31c5Sopenharmony_ci<a href="http://dist.libuv.org/dist/{tag}/">exe</a>
82e66f31c5Sopenharmony_ci'''
83e66f31c5Sopenharmony_ci
84e66f31c5Sopenharmony_cidef version(tag):
85e66f31c5Sopenharmony_ci  return list(map(int, re.match('^v(\d+)\.(\d+)\.(\d+)', tag).groups()))
86e66f31c5Sopenharmony_ci
87e66f31c5Sopenharmony_cidef major_minor(tag):
88e66f31c5Sopenharmony_ci  return version(tag)[:2]
89e66f31c5Sopenharmony_ci
90e66f31c5Sopenharmony_cidef row_for(tag):
91e66f31c5Sopenharmony_ci  maybe_gpg = ''
92e66f31c5Sopenharmony_ci  maybe_exe = ''
93e66f31c5Sopenharmony_ci  # We didn't start signing releases and producing Windows installers
94e66f31c5Sopenharmony_ci  # until v1.7.0.
95e66f31c5Sopenharmony_ci  if version(tag) >= version('v1.7.0'):
96e66f31c5Sopenharmony_ci    maybe_gpg = GPG.format(**locals())
97e66f31c5Sopenharmony_ci    maybe_exe = EXE.format(**locals())
98e66f31c5Sopenharmony_ci  return ROW.format(**locals())
99e66f31c5Sopenharmony_ci
100e66f31c5Sopenharmony_cidef group_for(tags):
101e66f31c5Sopenharmony_ci  rows = ''.join(row_for(tag) for tag in tags)
102e66f31c5Sopenharmony_ci  return GROUP.format(rows=rows)
103e66f31c5Sopenharmony_ci
104e66f31c5Sopenharmony_ci# Partition in groups of |n|.
105e66f31c5Sopenharmony_cidef groups_for(groups, n=4):
106e66f31c5Sopenharmony_ci  html = ''
107e66f31c5Sopenharmony_ci  groups = groups[:] + [''] * (n - 1)
108e66f31c5Sopenharmony_ci  while len(groups) >= n:
109e66f31c5Sopenharmony_ci    html += GROUPS.format(groups=groups)
110e66f31c5Sopenharmony_ci    groups = groups[n:]
111e66f31c5Sopenharmony_ci  return html
112e66f31c5Sopenharmony_ci
113e66f31c5Sopenharmony_ciif __name__ == '__main__':
114e66f31c5Sopenharmony_ci  os.chdir(os.path.dirname(__file__))
115e66f31c5Sopenharmony_ci  tags = subprocess.check_output(['git', 'tag'], text=True)
116e66f31c5Sopenharmony_ci  tags = [tag for tag in tags.split('\n') if tag.startswith('v')]
117e66f31c5Sopenharmony_ci  tags.sort(key=version, reverse=True)
118e66f31c5Sopenharmony_ci  groups = [group_for(list(g)) for _, g in itertools.groupby(tags, major_minor)]
119e66f31c5Sopenharmony_ci  groups = groups_for(groups)
120e66f31c5Sopenharmony_ci  html = HTML.format(groups=groups).strip()
121e66f31c5Sopenharmony_ci  html = re.sub('>\\s+<', '><', html)
122e66f31c5Sopenharmony_ci  print(html)
123