]> git.ipfire.org Git - thirdparty/pdns.git/blob - build-scripts/changelog-from-pr.py
Merge pull request #8505 from rgacogne/dnsdist-lua-ffi
[thirdparty/pdns.git] / build-scripts / changelog-from-pr.py
1 #!/usr/bin/env python3
2
3 import requests
4 import sys
5 import argparse
6 import re
7 import getpass
8
9 argp = argparse.ArgumentParser()
10 argp.add_argument('--oneline', action='store_true',
11 help='Make one-lined changelog entries (for 4.0 and older)')
12 argp.add_argument('--username',
13 help='Use the specified username for Basic Authentication to the GitHub API, allowing a higher rate limit')
14 argp.add_argument('--access_token',
15 help='Use API access token instead of username & password combination')
16 argp.add_argument('pullrequest', metavar='PULL_REQUEST', nargs='+',
17 help='Make changelogs for these Pull Request #\'s')
18 arguments = argp.parse_args()
19
20 ticket_regex = re.compile(r'(?:[Cc]loses|[Ff]ixes)? #(\d+)')
21
22 out = ''
23 httpAuth = None
24 if arguments.username:
25 password = getpass.getpass("GitHub password for '" + arguments.username + "': ")
26 httpAuth = requests.auth.HTTPBasicAuth(arguments.username, password)
27
28 # https://github.com/settings/tokens
29 # A token with `repo` and `user` access will definitely work.
30 access_token = arguments.access_token
31
32 for pr in arguments.pullrequest:
33 if pr[0] == '#':
34 pr = pr[1:]
35 try:
36 if access_token:
37 res = requests.get('https://api.github.com/repos/PowerDNS/pdns/pulls/'
38 '{}?access_token={}'.format(pr, access_token))
39 else:
40 res = requests.get('https://api.github.com/repos/PowerDNS/pdns/pulls/'
41 '{}'.format(pr), auth=httpAuth)
42 pr_info = res.json()
43 except (requests.exceptions.HTTPError, ValueError) as e:
44 print(e)
45 sys.exit(1)
46
47 if arguments.oneline:
48 out += '- `#{pr} <{url}>`__: {title}'.format(
49 pr=pr, url=pr_info['html_url'], title=pr_info['title']
50 )
51 else:
52 out += ' .. change::\n' + \
53 ' :tags: XXXXXX\n' + \
54 ' :pullreq: {}\n'.format(pr)
55 body = pr_info.get('body', None)
56 if pr_info.get('message', None) and not body:
57 # A bit blunt but better than we had.
58 print('{}'.format(pr_info['message']))
59 sys.exit(1)
60 elif body:
61 tickets = re.findall(ticket_regex, body)
62 if len(tickets):
63 out += ' :tickets: {}\n'.format(', '.join(tickets))
64 out += '\n {}'.format(pr_info['title'][0].capitalize() + pr_info['title'][1:])
65
66 if pr_info['user']['login'].lower() not in ['ahupowerdns', 'habbie',
67 'pieterlexis', 'rgacogne',
68 'aerique', 'chbruyand',
69 'omoerbeek']:
70 try:
71 if access_token:
72 user_info = requests.get(pr_info['user']['url'] + '?access_token=' + access_token, auth=httpAuth).json()
73 else:
74 user_info = requests.get(pr_info['user']['url'], auth=httpAuth).json()
75 except (requests.exceptions.HTTPError, ValueError) as e:
76 print(e)
77 sys.exit(1)
78 if 'name'in user_info:
79 out += ' ({})'.format(user_info['name'])
80 else:
81 out += ' (@{})'.format(user_info['login'])
82 out += '\n'
83
84 if not arguments.oneline:
85 out += '\n'
86
87 print(out)