]>
Commit | Line | Data |
---|---|---|
d98a21e6 PL |
1 | #!/usr/bin/env python3 |
2 | ||
3 | import requests | |
4 | import sys | |
5 | import argparse | |
6 | import re | |
99bd1729 | 7 | import getpass |
d98a21e6 PL |
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)') | |
99bd1729 | 12 | argp.add_argument('--username', |
eb6af1ad | 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') | |
d98a21e6 PL |
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 = '' | |
99bd1729 RG |
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 | ||
eb6af1ad | 28 | # https://github.com/settings/tokens |
29 | # A token with `repo` and `user` access will definitely work. | |
30 | access_token = arguments.access_token | |
31 | ||
d98a21e6 PL |
32 | for pr in arguments.pullrequest: |
33 | if pr[0] == '#': | |
34 | pr = pr[1:] | |
35 | try: | |
eb6af1ad | 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) | |
d98a21e6 PL |
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' + \ | |
8e7a1365 PL |
53 | ' :tags: XXXXXX\n' + \ |
54 | ' :pullreq: {}\n'.format(pr) | |
eb6af1ad | 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)) | |
11dbb976 | 64 | out += '\n {}'.format(pr_info['title'][0].capitalize() + pr_info['title'][1:]) |
d98a21e6 PL |
65 | |
66 | if pr_info['user']['login'].lower() not in ['ahupowerdns', 'habbie', | |
67 | 'pieterlexis', 'rgacogne', | |
1dcf6da7 RG |
68 | 'aerique', 'chbruyand', |
69 | 'omoerbeek']: | |
d98a21e6 | 70 | try: |
eb6af1ad | 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() | |
d98a21e6 PL |
75 | except (requests.exceptions.HTTPError, ValueError) as e: |
76 | print(e) | |
77 | sys.exit(1) | |
ef2ea4bf | 78 | if 'name' in user_info: |
5bc65c08 RG |
79 | out += ' ({})'.format(user_info['name']) |
80 | else: | |
81 | out += ' (@{})'.format(user_info['login']) | |
d98a21e6 PL |
82 | out += '\n' |
83 | ||
84 | if not arguments.oneline: | |
85 | out += '\n' | |
86 | ||
87 | print(out) |