Skip to content

Instantly share code, notes, and snippets.

@patrickfuller
Forked from unbracketed/export_repo_issues_to_csv.py
Last active November 30, 2022 10:03
Show Gist options
  • Star 26 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save patrickfuller/e2ea8a94badc5b6967ef3ca0a9452a43 to your computer and use it in GitHub Desktop.
Save patrickfuller/e2ea8a94badc5b6967ef3ca0a9452a43 to your computer and use it in GitHub Desktop.
Export Issues from Github repo to CSV (API v3)
"""
Exports issues from a list of repositories to individual csv files.
Uses basic authentication (Github username + password) to retrieve issues
from a repository that username has access to. Supports Github API v3.
Forked from: unbracketed/export_repo_issues_to_csv.py
"""
import argparse
import csv
from getpass import getpass
import requests
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]
# Change the following line to write out additional fields
csvout.writerow([labels, issue['title'], issue['state'], 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)
r = requests.get(url, auth=auth)
csvfilename = '{}-issues.csv'.format(name.replace('/', '-'))
with open(csvfilename, 'w', newline='') as csvfile:
csvout = csv.writer(csvfile)
csvout.writerow(['Labels', 'Title', 'State', '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'
username = input("Username for 'https://github.com': ")
password = getpass("Password for 'https://{}@github.com': ".format(username))
auth = (username, password)
for repository in args.repositories:
get_issues(repository)
@patrickfuller
Copy link
Author

patrickfuller commented Nov 8, 2016

Edits:

  • Prompt for username/pass
  • Repositories passed as arguments
  • Python3 / PEP8
  • Option to get both open and closed issues

Help: python github_to_csv.py --help
One repo: python github_to_csv.py username/repository
Multiple repos, get open and closed: python github_to_csv.py --all username/repository username/other-repository

@ves-krd
Copy link

ves-krd commented Dec 27, 2016

Removed newline='' and it works fine.

Another thing to note, the username format is "username" with quotes.

@jschristie
Copy link

jschristie commented Sep 3, 2017

For some reason, i am not able to run the script, i get errors as below
D:\Gluu>python github_issues_to_csv.py jschristie/docs-ce-prod
Username for 'https://github.com': jschristie
Password for 'https://username@github.com':
Traceback (most recent call last):
File "github_issues_to_csv.py", line 70, in
get_issues(repository)
File "github_issues_to_csv.py", line 38, in get_issues
write_issues(r, csvout)
File "github_issues_to_csv.py", line 19, in write_issues
raise Exception(r.status_code)
Exception: 404

Can anyone throw some light on this, FYI: i am not a developer

i am using python 3.5 and have installed requests module.

@dario-javier-rick
Copy link

Thanks! Very usefull script

@angelleye
Copy link

Not having any luck with this. I'm getting...

Traceback (most recent call last):
  File "github_issues_to_csv.py", line 10, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

Any tips to fix this would be greatly appreciated. I'm rather shocked it's so difficult to get GitHub issues into Jira.

@raymondjplante
Copy link

@angelleye run pip install requests

@jrc
Copy link

jrc commented Nov 15, 2018

usage: python ./github_issues_to_csv.py <org-name>/<repo-name>

You may need to use a personal access token instead of your password: https://github.com/settings/tokens

@andydempster
Copy link

Just used this script and made some amendments here to handle UTF-8 and issue number: https://gist.github.com/BrizzleRocker/87780652b4ec37794dc6992935556062

@manu4387
Copy link

Getting this error:

Traceback (most recent call last):
File "export repository.py", line 72, in
get_issues(repository)
File "export repository.py", line 38, in get_issues
write_issues(r, csvout)
File "export repository.py", line 19, in write_issues
raise Exception(r.status_code)
Exception: 401

Has anyone able to resolve this

@kwright15
Copy link

kwright15 commented Mar 12, 2020

I was getting the same errors as @manu4387, and updating the url on line 31 to my company's enterprise url fixed the problem:

url = 'https://api.github.*enterprise*.com/repos/{}/issues?state={}'.format(name, state)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment