diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2021-11-02 10:28:54 -0500 |
|---|---|---|
| committer | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2021-12-06 13:44:57 -0600 |
| commit | 339bd66fdec3f5f6baadad2a74764cfd40705790 (patch) | |
| tree | 2896a755cd8fe00ed262f7e752471c26b6b5e3bb /tools/release_notes.py | |
| parent | 2e38d79e646a2e37af717ed5e3a3b5365501fbc8 (diff) | |
tools: add a script to generate draft release changelog
This utility script helps in generated formatted and consistent
change log including:
1- group logs per daemon
2- standarize daemon names (lowercase, end with d)
3- capitalize all log lines
4- no merge commits
caveat: comments are assumed to be in the form
daemon-name : message
Sample Output:
```
sharpd
Follow the practice on cli design for json output
Install route supports nexthop-seg6 (step3)
Install_routes_helper support zapi_route flags (step1)
snapcraft
Add missing dependency
Add pathd to frr snap daemons
Change base to ubuntu 18.04 and libyang 2.0.7
staticd
Convert typedef to enum
Fix distance processing
Fix late initialization of blackhole type
Output config using nb callbacks instead of operational data
```
Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
Diffstat (limited to 'tools/release_notes.py')
| -rwxr-xr-x | tools/release_notes.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/tools/release_notes.py b/tools/release_notes.py new file mode 100755 index 0000000000..7481cc18c3 --- /dev/null +++ b/tools/release_notes.py @@ -0,0 +1,93 @@ +#!/usr/bin/python3 +# +# 2021 Jafar Al-Gharaibeh, ATCorp +# +# Generate a draft FRR release notes +# + +import sys +import os +import getopt +import subprocess + +def run(cmd): + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + rv = proc.communicate("")[0].decode("UTF-8") + proc.wait() + return rv + + +def usage(n): + print(os.path.basename(__file__), " [-b <branch>] [-t <tag> ]") + print(" Generate one line logs for non merge commits") + print(" -branch: branch name to use, default to HEAD") + print(" -tag : generate logs up to this tag, default to latest tag") + sys.exit(n) + + +def main(argv): + branch = tag = None + try: + opts, args = getopt.getopt(argv, "hb:t:", ["branch=", "tag="]) + except getopt.GetoptError: + usage(2) + for opt, arg in opts: + if opt == "-h": + usage(0) + elif opt in ("-b", "--branch"): + branch = arg + elif opt in ("-t", "--tag"): + tag = arg + + if branch is None: + branch = "HEAD" + if tag is None: + tag = run(["git", "describe", "--abbrev=0"]).strip("\n") + + chnglog = run( + ["git", "log", "--no-merges", "--pretty=format:'%s%d'", tag + ".." + branch] + ) + chnglog = chnglog.split("\n") + + chnglist = [] + daemons = [ + "babel", + "bgp", + "eigrp", + "nhrp", + "ospf", + "ospf6", + "pbr", + "pim", + "rip", + "ripng", + "sharp", + "vrrp", + "zebra", + ] + + for line in chnglog: + line = line.strip("'") + colon = line.partition(":") + label = colon[0].strip().lower() + if label in daemons: + label = label + "d" + comment = colon[2].strip().capitalize() + chnglist.append(label + ":" + comment) + + chnglist.sort() + lastlabel = "" + for line in chnglist: + colon = line.partition(":") + label = colon[0] + comment = colon[2] + if label != lastlabel: + print("") + print(label) + lastlabel = label + + print(" ", comment) + + +if __name__ == "__main__": + main(sys.argv[1:]) |
