mirror of
https://github.com/status-im/infra-utils.git
synced 2026-08-27 16:51:34 +00:00
83 lines
3.0 KiB
Python
Executable File
83 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import os
|
|
import sys
|
|
import csv
|
|
import json
|
|
import logging
|
|
from datetime import datetime, timedelta
|
|
from optparse import OptionParser
|
|
from github import Auth, Github, GithubException
|
|
|
|
HELP_DESCRIPTION='Utility getting assigned issues and pull requests for user.'
|
|
HELP_EXAMPLE='Example: ./get_assigned.py -o status-im -o logos-co -u jakubgs'
|
|
|
|
# Setup logging.
|
|
log_format = '[%(levelname)s] %(message)s'
|
|
logging.basicConfig(level=logging.INFO, format=log_format)
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
DEFAULT_GH_ORGS = ['Develp-GmbH', 'status-im', 'vacp2p', 'waku-org', 'logos-co', 'acid-info', 'keycard-tech']
|
|
|
|
def parse_opts():
|
|
parser = OptionParser(description=HELP_DESCRIPTION, epilog=HELP_EXAMPLE)
|
|
parser.add_option('-o', '--github-orgs', type='string', action='append', default=DEFAULT_GH_ORGS,
|
|
help='Names of organizations to scan.')
|
|
parser.add_option('-s', '--state', type='string', default='open',
|
|
help='Issue state to query for.')
|
|
parser.add_option('-t', '--type', type='string', default='issue',
|
|
help='Names of user to query for.')
|
|
parser.add_option('-U', '--updated', type='string', default=(datetime.now() - timedelta(days=30)).date(),
|
|
help='Time since which issue has been updated.')
|
|
parser.add_option('-a', '--assignee', type='string',
|
|
help='Name assigned user to query for.')
|
|
parser.add_option('-A', '--author', type='string',
|
|
help='Name author to query for.')
|
|
parser.add_option('-T', '--github-token', default=os.environ.get('GH_TOKEN', None),
|
|
help='GitHub API token.')
|
|
parser.add_option('-l', '--log-level', default='info',
|
|
help='Change default logging level.')
|
|
|
|
(opts, args) = parser.parse_args()
|
|
|
|
assert opts.github_orgs, parser.error('No GH orgs provided!')
|
|
assert opts.github_token, parser.error('No GH token provided!')
|
|
|
|
return opts, args
|
|
|
|
def main():
|
|
(opts, args) = parse_opts()
|
|
|
|
LOG.setLevel(opts.log_level.upper())
|
|
|
|
gh = Github(auth=Auth.Token(opts.github_token))
|
|
|
|
query = f'is:{opts.type} state:{opts.state} updated:>={opts.updated}'
|
|
|
|
if opts.assignee:
|
|
query += f' assignee:{opts.assignee}'
|
|
if opts.author:
|
|
query += f' author:{opts.author}'
|
|
|
|
issues = []
|
|
for org in opts.github_orgs:
|
|
LOG.debug(f'Query: org:{org} {query}')
|
|
issues.extend(
|
|
{
|
|
'url': issue.html_url,
|
|
'number': issue.number,
|
|
'title': issue.title,
|
|
'author': issue.author.login if getattr(issue, 'author', None) else None,
|
|
'assignee': issue.assignee.login if getattr(issue, 'assignee', None) else None,
|
|
'state': issue.state,
|
|
'updated': str(issue.updated_at.date()),
|
|
}
|
|
for issue
|
|
in gh.search_issues(f'org:{org} {query}', sort='updated', order='desc')
|
|
)
|
|
|
|
print(json.dumps(issues, indent=2))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|