diff options
Diffstat (limited to 'scripts/gen-release-readme.py.in')
-rw-r--r-- | scripts/gen-release-readme.py.in | 131 |
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 | |||
4 | import os | ||
5 | import re | ||
6 | import argparse | ||
7 | import textwrap | ||
8 | from datetime import datetime | ||
9 | from collections import defaultdict | ||
10 | from distutils.version import StrictVersion | ||
11 | |||
12 | import yaml | ||
13 | |||
14 | |||
15 | def 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 | |||
27 | class 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 | |||
121 | def 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 | |||
130 | if __name__ == "__main__": | ||
131 | main() | ||