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