Files
2026-05-31 17:52:37 +02:00

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()