blob: 1b7e048d0d1af939b6c1747db281cea3deda866b [file] [log] [blame]
Paul Sokolovsky2e361a12023-10-31 21:38:32 +03001#!/usr/bin/env python3
2import argparse
3import sys
4import os
5import re
6import subprocess
7
8
9WORKDIR = "trusted-firmware-a"
10
11
12def run(cmd):
13 return subprocess.check_call(cmd, shell=True)
14
15
16def maybe_int(s):
17 if s.isdigit():
18 return int(s)
19 return s
20
21
22def main():
23 argp = argparse.ArgumentParser(description="Prepare TF-A LTS release email content")
24 argp.add_argument("--latest", action="store_true", help="use latest release tag")
25 argp.add_argument("release_tag", nargs="?", help="release tag")
26 args = argp.parse_args()
27 if not args.release_tag and not args.latest:
28 argp.error("Either release_tag or --latest is required")
29
30 with open(os.path.dirname(__file__) + "/lts-release-mail.txt") as f:
31 mail_template = f.read()
32
33 if not os.path.exists(WORKDIR):
34 run("git clone https://review.trustedfirmware.org/TF-A/trusted-firmware-a %s" % WORKDIR)
35 os.chdir(WORKDIR)
36 else:
37 os.chdir(WORKDIR)
38 run("git pull --quiet")
39
40 if args.latest:
41 latest = []
42 for l in os.popen("git tag"):
43 if not re.match(r"lts-v\d+\.\d+\.\d+", l):
44 continue
45 l = l.rstrip()
46 comps = [maybe_int(x) for x in l.split(".")]
47 comps.append(l)
48 if comps > latest:
49 latest = comps
50 if not latest:
51 argp.error("Could not find latest LTS tag")
52 args.release_tag = latest[-1]
53
54 comps = args.release_tag.split(".")
55 prev_comps = comps[:-1] + [str(int(comps[-1]) - 1)]
56 prev_release = ".".join(prev_comps)
57
58 subjects = []
59 for l in os.popen("git log --oneline --reverse %s..%s" % (prev_release, args.release_tag)):
60 subjects.append(l.rstrip())
61 subjects = subjects[:-3]
62
63 urls = []
64 for s in subjects:
65 commit_id, _ = s.split(" ", 1)
66 for l in os.popen("git show %s" % commit_id):
67 if "Change-Id:" in l:
68 _, change_id = l.strip().split(None, 1)
69 urls.append("https://review.trustedfirmware.org/q/" + change_id)
70
71 assert len(subjects) == len(urls)
72
73 commits = ""
74 for i, s in enumerate(subjects, 1):
75 commits += "%s [%d]\n" % (s, i)
76
77 references = ""
78 for i, s in enumerate(urls, 1):
79 references += "[%d] %s\n" % (i, s)
80
81 # Strip trailing newline, as it's encoded in template.
82 commits = commits.rstrip()
83 references = references.rstrip()
84
85 version = args.release_tag[len("lts-v"):]
86 sys.stdout.write(
87 mail_template.format(
88 version=version,
89 commits=commits,
90 references=references,
91 )
92 )
93
94
95if __name__ == "__main__":
96 main()