-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.py
More file actions
executable file
·88 lines (69 loc) · 2.55 KB
/
main.py
File metadata and controls
executable file
·88 lines (69 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python
""" Export GitHub issues as CSV """
import csv
import sys
import click
import progressbar
from github import Github
EXCLUDE_FIELDS = (
'id',
)
def exclude_field(name):
return name.endswith('_url')
def get_csv_writer(issue):
fieldnames = sorted([
name for name in issue.raw_data.keys()
if name not in EXCLUDE_FIELDS and not exclude_field(name)
])
return csv.DictWriter(
sys.stdout,
fieldnames=fieldnames,
extrasaction='ignore',
)
@click.command(help='Export GitHub issues for a repo to CSV')
@click.option('--user', '-u', prompt='GitHub username', help='GitHub username')
@click.option('--password', '-p', prompt='GitHub password', help='GitHub password')
@click.option('--repo', '-r', prompt='GitHub repository', help='GitHub repository')
@click.option('--quick/--no-quick',
help="Quick mode uses only data gathered from issue list",
default=True)
def main(user, password, repo, quick):
if user == '':
print('No user given', file=sys.stderr)
sys.exit(1)
if password == '':
print('No password given', file=sys.stderr)
sys.exit(1)
if repo == '':
print('No repository given', file=sys.stderr)
sys.exit(1)
if '/' not in repo:
print('Repository must be of the format "<org>/<project>"', file=sys.stderr)
sys.exit(1)
print('Starting in %s mode' % ('quick' if quick else 'full'), file=sys.stderr)
api = Github(user, password)
repo = api.get_repo(repo)
issues = repo.get_issues(state='all')
bar = progressbar.ProgressBar(max_value=issues.totalCount)
csv_writer = None
for idx, issue in bar(enumerate(issues)):
if not csv_writer:
csv_writer = get_csv_writer(issue)
csv_writer.writeheader()
data = (issue._rawData if quick else issue.raw_data).copy()
data['labels'] = ';'.join([
raw_label['name']
for raw_label in (data.pop('labels', []) or [])
])
data['assignees'] = ';'.join([
raw_label['login']
for raw_label in (data.pop('assignees', []) or [])
])
data['milestone'] = (data.pop('milestone', {}) or {}).get('title', None)
data['closed_by'] = (data.pop('closed_by', {}) or {}).get('login', None)
data['user'] = (data.pop('user', {}) or {}).get('login', None)
data['assignee'] = (data.pop('assignee', {}) or {}).get('login', None)
csv_writer.writerow(data)
sys.stdout.flush()
if __name__ == '__main__':
main()