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