Paul Sokolovsky | 2e361a1 | 2023-10-31 21:38:32 +0300 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | import argparse |
| 3 | import sys |
| 4 | import os |
| 5 | import re |
| 6 | import subprocess |
| 7 | |
| 8 | |
| 9 | WORKDIR = "trusted-firmware-a" |
| 10 | |
| 11 | |
| 12 | def run(cmd): |
| 13 | return subprocess.check_call(cmd, shell=True) |
| 14 | |
| 15 | |
| 16 | def maybe_int(s): |
| 17 | if s.isdigit(): |
| 18 | return int(s) |
| 19 | return s |
| 20 | |
| 21 | |
| 22 | def 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 | |
| 95 | if __name__ == "__main__": |
| 96 | main() |