-
-
Save Jammizzle/ad2a94008b56a6f9d17cfdddf5a6dd4d to your computer and use it in GitHub Desktop.
| #!/usr/bin/python | |
| import csv | |
| import json | |
| import requests | |
| import configparser | |
| """ | |
| Usage: | |
| Add the following to config.ini with appropriate values: | |
| [DEFAULT] | |
| AUTH_TOKEN = | |
| ZEN_ACCESS = | |
| Exports Issues from a list of repositories to individual CSV files | |
| Uses basic authentication (Github API Token and Zenhub API Token) | |
| to retrieve Issues from a repository that token has access to. | |
| Supports Github API v3 and ZenHubs current working API. | |
| Derived from https://gist.github.com/Kebiled/7b035d7518fdfd50d07e2a285aff3977 | |
| @PinnaclePSM Author Jamie Belcher | |
| """ | |
| def write_issues(r, csvout, repo_name, repo_ID): | |
| if not r.status_code == 200: | |
| raise Exception("Request returned status of:"+str(r.status_code)) | |
| r_json = r.json() | |
| for issue in r_json: | |
| print(repo_name + ' issue Number: ' + str(issue['number'])) | |
| zenhub_issue_url = 'https://api.zenhub.io/p1/repositories/' + str(repo_ID) + '/issues/' + str(issue['number']) + '?access_token=' + ACCESS_TOKEN | |
| zen_r = requests.get(zenhub_issue_url).json() | |
| DateCreated = issue['created_at'][:-10] | |
| if 'pull_request' not in issue: | |
| global ISSUES | |
| ISSUES += 1 | |
| assignees, tag, category, priority = '', '', '', '' | |
| for i in issue['assignees'] if issue['assignees'] else []: | |
| assignees += i['login'] + ',' | |
| for x in issue['labels'] if issue['labels'] else []: | |
| if "Category" in x['name']: | |
| category = x['name'][11:11 + len(x['name'])] | |
| if "Tag" in x['name']: | |
| tag = x['name'][6:6 + len(x['name'])] | |
| if "Priority" in x['name']: | |
| priority = x['name'][11:11 + len(x['name'])] | |
| estimate = zen_r.get('estimate', dict()).get('value', "") | |
| if category != 'BUG': | |
| Pipeline = zen_r.get('pipeline', dict()).get('name', "") | |
| csvout.writerow([repo_name, issue['number'], issue['title'].encode('utf-8'), category, | |
| tag, assignees[:-1], | |
| priority, Pipeline, DateCreated, | |
| estimate]) | |
| def get_issues(repo_data): | |
| repo_name = repo_data[0] | |
| repo_ID = repo_data[1] | |
| issues_for_repo_url = 'https://api.github.com/repos/%s/issues?since=2017-05-01&state=closed' % repo_name | |
| r = requests.get(issues_for_repo_url, auth=AUTH) | |
| write_issues(r, FILEOUTPUT, repo_name, repo_ID) | |
| # more pages? examine the 'link' header returned | |
| if 'link' in r.headers: | |
| pages = dict( | |
| [(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 = dict( | |
| [(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, FILEOUTPUT, repo_name, repo_ID) | |
| if pages['next'] == pages['last']: | |
| break | |
| REPO_LIST = [("*GITHUB REPO*", "*ZENHUB REPOID*")] | |
| config = configparser.ConfigParser() | |
| config.read('config.ini') | |
| AUTH = ('token', config['DEFAULT']['AUTH_TOKEN']) | |
| ACCESS_TOKEN = config['DEFAULT']['ZEN_ACCESS'] | |
| ISSUES = 0 | |
| FILENAME = 'output.csv' | |
| OPENFILE = open(FILENAME, 'wb') | |
| FILEOUTPUT = csv.writer(OPENFILE) | |
| FILEOUTPUT.writerow(('Repository', 'Issue Number', 'Issue Title', 'Category', | |
| 'Tag', 'Assigned To', | |
| 'Priority', 'Pipeline', | |
| 'Issue Author', | |
| 'Created At', 'Estimate Value' | |
| )) | |
| for repo_data in REPO_LIST: | |
| get_issues(repo_data) | |
| OPENFILE.close() |
| [DEFAULT] | |
| AUTH_TOKEN = | |
| ZEN_ACCESS = |
@manu4387 The request perhaps couldn't find your repo, which could be either due to permissions or a potential typo
i have 2 factor authentication enabled , i tried to use the Personal authentication token but same issue.
i tried another code for connectivity to get the data which is working fine to test the connectivity with authentication token
Ahh I haven't tested this with 2FA but I don't know why that'd cause an issue, unless it's Zenhubs permissions? I also haven't used this in quite some time so I'll have a look into setting it up again for myself then I'll get back to you
@manu4387 Should be able to just delete all zenhub requests and everything's fine, remember to remove it from the CSV builder as well
Can you send me an email at [email protected] of your REPO_LIST variable?
Getting this issue any one else faced the same issue
Traceback (most recent call last):
File "C:/Users/Manu/Desktop/export repository1.py", line 95, in
get_issues(repo_data)
File "C:/Users/Manu/Desktop/export repository1.py", line 60, in get_issues
write_issues(r, FILEOUTPUT, repo_name, repo_ID)
File "C:/Users/Manu/Desktop/export repository1.py", line 18, in write_issues
raise Exception(r.status_code)
Exception: 404