aboutsummaryrefslogtreecommitdiff
path: root/scripts/gen-release-readme.py.in
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gen-release-readme.py.in')
-rw-r--r--scripts/gen-release-readme.py.in131
1 files changed, 0 insertions, 131 deletions
diff --git a/scripts/gen-release-readme.py.in b/scripts/gen-release-readme.py.in
deleted file mode 100644
index c2af953..0000000
--- a/scripts/gen-release-readme.py.in
+++ /dev/null
@@ -1,131 +0,0 @@
1@PYTHON@
2# vim: ts=4 et:
3
4import os
5import re
6import argparse
7import textwrap
8from datetime import datetime
9from collections import defaultdict
10from distutils.version import StrictVersion
11
12import yaml
13
14
15def find_repo_root():
16 path = os.getcwd()
17
18 while ".git" not in set(os.listdir(path)) and path != "/":
19 path = os.path.dirname(path)
20
21 if path == "/":
22 raise Exception("No repo found, stopping at /")
23
24 return path
25
26
27class ReleaseReadmeUpdater:
28
29 SECTION_TPL = textwrap.dedent("""
30 ### Alpine Linux {release} ({date})
31 <details><summary><i>click to show/hide</i></summary><p>
32
33 {rows}
34
35 </p></details>
36 """)
37
38 AMI_TPL = (
39 " [{id}](https://{r}.console.aws.amazon.com/ec2/home"
40 "#Images:visibility=public-images;imageId={id}) "
41 "([launch](https://{r}.console.aws.amazon.com/ec2/home"
42 "#launchAmi={id})) |"
43 )
44
45 def __init__(self, profile, archs=None):
46 self.profile = profile
47 self.archs = archs or ["x86_64", "aarch64"]
48
49 def get_sorted_releases(self, release_data):
50 sections = defaultdict(lambda: {
51 "release": "",
52 "built": {},
53 "name": {},
54 "ami": defaultdict(dict)
55 })
56
57 for build, releases in release_data.items():
58 for release, amis in releases.items():
59 for name, info in amis.items():
60 arch = info["arch"]
61 built = info["build_time"]
62 ver = sections[info["version"]]
63
64 if arch not in ver["built"] or ver["built"][arch] < built:
65 ver["release"] = release
66 ver["name"][arch] = name
67 ver["built"][arch] = built
68
69 for region, ami in info["artifacts"].items():
70 ver["ami"][region][arch] = ami
71
72 extract_ver = lambda x: StrictVersion(
73 "0.0" if x["release"] == "edge" else x["release"])
74
75 return sorted(sections.values(), key=extract_ver, reverse=True)
76
77 def make_ami_list(self, sorted_releases):
78 ami_list = "## AMIs\n"
79
80 for info in sorted_releases:
81 rows = ["| Region |", "| ------ |"]
82
83 for arch in self.archs:
84 if arch in info["name"]:
85 rows[0] += f" {info['name'][arch]} |"
86 rows[1] += " --- |"
87
88 for region, amis in info["ami"].items():
89 row = f"| {region} |"
90 for arch in self.archs:
91 if arch in amis:
92 row += self.AMI_TPL.format(r=region, id=amis[arch])
93 rows.append(row)
94
95 ami_list += self.SECTION_TPL.format(
96 release=info["release"].capitalize(),
97 date=datetime.utcfromtimestamp(
98 max(info["built"].values())).date(),
99 rows="\n".join(rows))
100
101 return ami_list
102
103 def update_markdown(self):
104 release_dir = os.path.join(find_repo_root(), "releases")
105 profile_file = os.path.join(release_dir, f"{self.profile}.yaml")
106
107 with open(profile_file, "r") as data:
108 sorted_releases = self.get_sorted_releases(yaml.safe_load(data))
109
110 readme_md = os.path.join(release_dir, "README.md")
111
112 with open(readme_md, "r") as file:
113 readme = file.read()
114
115 with open(readme_md, "w") as file:
116 file.write(
117 re.sub("## AMIs.*\Z", self.make_ami_list(sorted_releases),
118 readme, flags=re.S))
119
120
121def main():
122 parser = argparse.ArgumentParser(description="Update release README")
123 parser.add_argument("profile", help="name of profile to update")
124 args = parser.parse_args()
125
126 ReleaseReadmeUpdater(args.profile).update_markdown()
127
128
129
130if __name__ == "__main__":
131 main()