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