|
| 1 | +#!/usr/bin/env python3 |
| 2 | + |
| 3 | +import argparse |
| 4 | +import json |
| 5 | +import sys |
| 6 | +import textwrap |
| 7 | +from urllib import request |
| 8 | +import urllib.error |
| 9 | +from datetime import datetime |
| 10 | +from datetime import timezone |
| 11 | +import tempfile |
| 12 | + |
| 13 | +parser = argparse.ArgumentParser(description="Add a GitHub release to an RPM changelog", usage=argparse.SUPPRESS) |
| 14 | +parser.add_argument("repo", help="GitHub repository (owner/name)") |
| 15 | +parser.add_argument("-t", "--tag", help="A specific Git tag to get; if none, latest will be used") |
| 16 | +parser.add_argument("-a", "--author", help="The author of the RPM changelog entry") |
| 17 | +parser.add_argument("-f", "--file", help="Prepend the new changelog entry to file instead of printing in stdout") |
| 18 | + |
| 19 | +if len(sys.argv) == 1: |
| 20 | + parser.print_help(sys.stderr) |
| 21 | + sys.exit(1) |
| 22 | + |
| 23 | +args = parser.parse_args() |
| 24 | + |
| 25 | +releaseSegment = f"/tags/{args.tag}" if args.tag else "/latest" |
| 26 | +url = f'https://api.github.com/repos/{args.repo}/releases{releaseSegment}' |
| 27 | + |
| 28 | +try: |
| 29 | + response = request.urlopen(url) |
| 30 | +except urllib.error.HTTPError as error: |
| 31 | + print(f"GitHub API responded with a {error.code} error!", file=sys.stderr) |
| 32 | + print("Url:", url, file=sys.stderr) |
| 33 | + print("Response:", json.dumps(json.load(error), indent=4), file=sys.stderr, sep="\n") |
| 34 | + sys.exit(1) |
| 35 | + |
| 36 | +release = json.load(response) |
| 37 | + |
| 38 | +releaseDate = datetime.strptime(release['published_at'], "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc) |
| 39 | + |
| 40 | +with tempfile.TemporaryFile("r+") as temp: |
| 41 | + print("-------------------------------------------------------------------", file=temp) |
| 42 | + |
| 43 | + print(f"{releaseDate.strftime('%c')} {releaseDate.strftime('%Z')}", end="", file=temp) |
| 44 | + if args.author: |
| 45 | + print(f" - {args.author}", end="", file=temp) |
| 46 | + print("\n", file=temp) |
| 47 | + |
| 48 | + print(f"- Release {args.tag}", end="", file=temp) |
| 49 | + if release['name'] and release['name'] != args.tag: |
| 50 | + print(f" - {release['name']}", end="", file=temp) |
| 51 | + print("\n", file=temp) |
| 52 | + |
| 53 | + if release['body']: |
| 54 | + print(textwrap.indent(release['body'], " "), file=temp, end="\n\n") |
| 55 | + temp.seek(0) |
| 56 | + |
| 57 | + if args.file: |
| 58 | + with open(args.file, "r") as prev: |
| 59 | + old = prev.read() |
| 60 | + with open(args.file, "w") as new: |
| 61 | + for line in temp: |
| 62 | + new.write(line) |
| 63 | + new.write(old) |
| 64 | + sys.exit(0) |
| 65 | + |
| 66 | + print(temp.read()) |
0 commit comments