diff --git a/github-contributors.py b/github-contributors.py new file mode 100644 index 00000000000..59a08898834 --- /dev/null +++ b/github-contributors.py @@ -0,0 +1,120 @@ +#!/usr/bin/python3 +# +# Get list of repo contributors from GitHub using v4 GraphQL API +# +# Copyright (C) 2018 - Brad Parker +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from urllib.request import urlopen, Request +import json + +### SETTINGS ### +# https://help.github.com/articles/creating-an-access-token-for-command-line-use/ +TOKEN = 'Your access token here' +orgName = 'libretro' +repoName = 'RetroArch' +### END SETTINGS ### + +###### + +lines = [] + +def get_contributors(after=None): + global lines + headers = {'Authorization': 'bearer ' + TOKEN} + url = 'https://api.github.com/graphql' + + dataStr = """{ + repository(owner: \"""" + orgName + """\", name: \"""" + repoName + """\") { +""" + + if after: + dataStr += """ + mentionableUsers(first: 100 after:\"""" + after + """\") { +""" + else: + dataStr += """ + mentionableUsers(first: 100) { +""" + + dataStr += """ + edges { + node { + name + login + } + cursor + } + } + } + } +""" + + d = {'query': dataStr} + + data = json.dumps(d).encode('utf-8') + + req = Request(url, data, headers) + + with urlopen(req) as resp: + d = resp.read() + + j = json.loads(d) + + if len(j['data']['repository']['mentionableUsers']['edges']) == 0: + return None + + cursor = None + + for key in j['data']['repository']['mentionableUsers']['edges']: + line = '' + name = None + login = None + node = key['node'] + + if 'name' in node and node['name'] and len(node['name']) > 0: + name = node['name'] + + if 'login' in node and node['login'] and len(node['login']) > 0: + login = node['login'] + + if 'cursor' in key and key['cursor'] and len(key['cursor']) > 0: + cursor = key['cursor'] + + if name: + line = name + + if login and login.lower() != name.lower(): + line += ' (' + login + ')' + elif login: + line = login + else: + continue + + if len(line) > 0: + lines.append(line) + + if cursor and len(cursor) > 0: + return cursor + +def doit(cont): + after = get_contributors(cont) + + if after: + doit(after) + +doit(None) + +print('\n'.join(sorted(lines, key=str.lower)))