mirror of
https://github.com/captn3m0/Scripts.git
synced 2024-09-27 22:22:53 +00:00
85 lines
3.1 KiB
Python
Executable File
85 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Exports issues from a list of repositories to individual CSV files.
|
|
Uses OAuth authentication (Github token) to retrieve issues
|
|
from a repository that username has access to. Supports Github API v3.
|
|
Forked from: unbracketed/export_repo_issues_to_csv.py
|
|
|
|
Original Source: https://gist.github.com/kassyuz/a5eddb0a9bec83768b8db16e6d6b4263
|
|
"""
|
|
import argparse
|
|
import csv
|
|
import requests
|
|
import json
|
|
|
|
# encoding=utf8
|
|
import sys
|
|
reload(sys)
|
|
sys.setdefaultencoding('utf8')
|
|
|
|
auth = None
|
|
state = 'open'
|
|
|
|
|
|
def write_issues(r, csvout):
|
|
"""Parses JSON response and writes to CSV."""
|
|
if r.status_code != 200:
|
|
raise Exception(r.status_code)
|
|
for issue in r.json():
|
|
if 'pull_request' not in issue:
|
|
labels = ', '.join([l['name'] for l in issue['labels']])
|
|
date = issue['created_at'].split('T')[0]
|
|
closed_date = ''
|
|
if issue['state'] != 'open':
|
|
closed_date = issue['created_at'].split('T')[0]
|
|
# Change the following line to write out additional fields
|
|
csvout.writerow([labels, issue['user']['login'], issue['number'], issue['title'], issue['state'], date, closed_date,
|
|
issue['html_url']])
|
|
|
|
|
|
def get_issues(name):
|
|
"""Requests issues from GitHub API and writes to CSV file."""
|
|
url = 'https://api.github.com/repos/{}/issues?state={}'.format(name, state)
|
|
print(url)
|
|
r = gh_session.get(url)
|
|
csvfilename = '{}-issues.csv'.format(name.replace('/', '-'))
|
|
with open(csvfilename, 'w') as csvfile:
|
|
csvout = csv.writer(csvfile)
|
|
csvout.writerow(['Labels', 'User-Git', 'Number', 'Title', 'State', 'Created Date', 'Closed Date', 'URL'])
|
|
write_issues(r, csvout)
|
|
|
|
# Multiple requests are required if response is paged
|
|
if 'link' in r.headers:
|
|
pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
|
|
(link.split(';') for link in
|
|
r.headers['link'].split(','))}
|
|
while 'last' in pages and 'next' in pages:
|
|
pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
|
|
(link.split(';') for link in
|
|
r.headers['link'].split(','))}
|
|
r = requests.get(pages['next'], auth=auth)
|
|
write_issues(r, csvout)
|
|
if pages['next'] == pages['last']:
|
|
break
|
|
|
|
|
|
parser = argparse.ArgumentParser(description="Write GitHub repository issues "
|
|
"to CSV file.")
|
|
parser.add_argument('repositories', nargs='+', help="Repository names, "
|
|
"formatted as 'username/repo'")
|
|
parser.add_argument('--all', action='store_true', help="Returns both open "
|
|
"and closed issues.")
|
|
args = parser.parse_args()
|
|
|
|
if args.all:
|
|
state = 'all'
|
|
|
|
# user = raw_input('Insert your Github user >> ')
|
|
token = raw_input('Insert your Github Token (read:org and repo permissions) >> ')
|
|
|
|
gh_session = requests.Session()
|
|
gh_session.auth = ('captn3m0', token)
|
|
|
|
for repository in args.repositories:
|
|
get_issues(repository)
|