xref: /optee_os/scripts/update_changelog.py (revision 0a4179ba63a61cf15609a4e3ffb7dc4a027f3f07)
1*0a4179baSJoakim Bech#!/usr/bin/env python3
2*0a4179baSJoakim Bech# SPDX-License-Identifier: BSD-2-Clause
3*0a4179baSJoakim Bech#
4*0a4179baSJoakim Bech# Copyright (c) 2019, Linaro Limited
5*0a4179baSJoakim Bech#
6*0a4179baSJoakim Bech
7*0a4179baSJoakim Bechfrom subprocess import Popen, PIPE
8*0a4179baSJoakim Bechimport argparse
9*0a4179baSJoakim Bech
10*0a4179baSJoakim Bech
11*0a4179baSJoakim Bechdef get_args():
12*0a4179baSJoakim Bech    parser = argparse.ArgumentParser(description='Helper script that updates '
13*0a4179baSJoakim Bech                                     'the CHANGELOG.md file.\n'
14*0a4179baSJoakim Bech                                     'Usage example:\n'
15*0a4179baSJoakim Bech                                     '  ./update_changelog.py '
16*0a4179baSJoakim Bech                                     ' --changelog-file CHANGELOG.md'
17*0a4179baSJoakim Bech                                     ' --release-version 3.7.0'
18*0a4179baSJoakim Bech                                     ' --previous-release-version 3.6.0'
19*0a4179baSJoakim Bech                                     ' --release-date 2019-10-11')
20*0a4179baSJoakim Bech
21*0a4179baSJoakim Bech    parser.add_argument('--changelog-file', action='store', required=False,
22*0a4179baSJoakim Bech                        default='CHANGELOG.md',
23*0a4179baSJoakim Bech                        help='Changelog file to be updated.')
24*0a4179baSJoakim Bech
25*0a4179baSJoakim Bech    parser.add_argument('--release-date', action='store', required=True,
26*0a4179baSJoakim Bech                        help='The release date (yyyy-mm-dd).')
27*0a4179baSJoakim Bech
28*0a4179baSJoakim Bech    parser.add_argument('--release-version', action='store', required=True,
29*0a4179baSJoakim Bech                        help='Release version (MAJOR.MINOR.PATCH).')
30*0a4179baSJoakim Bech
31*0a4179baSJoakim Bech    parser.add_argument('--previous-release-version', action='store',
32*0a4179baSJoakim Bech                        required=True,
33*0a4179baSJoakim Bech                        help='Previous release version (MAJOR.MINOR.PATCH).')
34*0a4179baSJoakim Bech
35*0a4179baSJoakim Bech    return parser.parse_args()
36*0a4179baSJoakim Bech
37*0a4179baSJoakim Bech
38*0a4179baSJoakim Bechdef prepend_write(filename, text):
39*0a4179baSJoakim Bech    with open(filename, 'r+') as f:
40*0a4179baSJoakim Bech        current_content = f.read()
41*0a4179baSJoakim Bech        f.seek(0, 0)
42*0a4179baSJoakim Bech        f.write(text + '\n' + current_content)
43*0a4179baSJoakim Bech        f.flush()
44*0a4179baSJoakim Bech
45*0a4179baSJoakim Bech
46*0a4179baSJoakim Bechdef get_previous_release_date(tag):
47*0a4179baSJoakim Bech    cmd = "git log -1 --date=format:%Y-%m-%d --format=format:%cd " \
48*0a4179baSJoakim Bech          "{}".format(tag)
49*0a4179baSJoakim Bech    process = Popen(cmd.split(), stdout=PIPE)
50*0a4179baSJoakim Bech    (output, err) = process.communicate()
51*0a4179baSJoakim Bech    return output.decode("utf-8")
52*0a4179baSJoakim Bech
53*0a4179baSJoakim Bech
54*0a4179baSJoakim Bechdef main():
55*0a4179baSJoakim Bech    global args
56*0a4179baSJoakim Bech
57*0a4179baSJoakim Bech    args = get_args()
58*0a4179baSJoakim Bech
59*0a4179baSJoakim Bech    gits = ["OP-TEE/optee_os", "OP-TEE/optee_client", "OP-TEE/optee_test",
60*0a4179baSJoakim Bech            "OP-TEE/build", "linaro-swg/optee_examples"]
61*0a4179baSJoakim Bech
62*0a4179baSJoakim Bech    # Shorten name
63*0a4179baSJoakim Bech    clf = args.changelog_file
64*0a4179baSJoakim Bech    rv = args.release_version
65*0a4179baSJoakim Bech    prv = args.previous_release_version
66*0a4179baSJoakim Bech    rd = args.release_date
67*0a4179baSJoakim Bech    prd = get_previous_release_date(prv)
68*0a4179baSJoakim Bech
69*0a4179baSJoakim Bech    # In some cases we need underscore in string
70*0a4179baSJoakim Bech    rvu = rv.replace('.', '_')
71*0a4179baSJoakim Bech
72*0a4179baSJoakim Bech    text = "# OP-TEE - version {} ({})\n".format(rv, rd)
73*0a4179baSJoakim Bech    text += "\n"
74*0a4179baSJoakim Bech    text += "- Links to the release pages, commits and pull requests merged " \
75*0a4179baSJoakim Bech            "into this release for:\n"
76*0a4179baSJoakim Bech
77*0a4179baSJoakim Bech    for g in gits:
78*0a4179baSJoakim Bech        gu = g.replace('/', '_')
79*0a4179baSJoakim Bech        gu = gu.replace('-', '_')
80*0a4179baSJoakim Bech        text += "  - {}: [release page][{}_release_{}], " \
81*0a4179baSJoakim Bech                "[commits][{}_commits_{}] and [pull requests]" \
82*0a4179baSJoakim Bech                "[{}_pr_{}]\n".format(g, gu, rvu, gu, rvu, gu, rvu)
83*0a4179baSJoakim Bech
84*0a4179baSJoakim Bech    text += "\n"
85*0a4179baSJoakim Bech
86*0a4179baSJoakim Bech    for g in gits:
87*0a4179baSJoakim Bech        gu = g.replace('/', '_')
88*0a4179baSJoakim Bech        gu = gu.replace('-', '_')
89*0a4179baSJoakim Bech        text += "\n[{}_release_{}]: https://github.com/{}/releases/tag/" \
90*0a4179baSJoakim Bech                "{}\n".format(gu, rvu, g, rv)
91*0a4179baSJoakim Bech        text += "[{}_commits_{}]: https://github.com/{}/compare/" \
92*0a4179baSJoakim Bech                "{}...{}\n".format(gu, rvu, g, prv, rv)
93*0a4179baSJoakim Bech        text += "[{}_pr_{}]: https://github.com/{}/pulls?q=is%3Apr+is%3A" \
94*0a4179baSJoakim Bech                "merged+base%3Amaster+merged%3A{}..{}\n".format(
95*0a4179baSJoakim Bech                        gu, rvu, g, prd, rd)
96*0a4179baSJoakim Bech
97*0a4179baSJoakim Bech    prepend_write(args.changelog_file, text)
98*0a4179baSJoakim Bech
99*0a4179baSJoakim Bech
100*0a4179baSJoakim Bechif __name__ == "__main__":
101*0a4179baSJoakim Bech    main()
102