forked from openedx/repo-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pull_orgs.py
executable file
·91 lines (74 loc) · 2.86 KB
/
pull_orgs.py
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
89
90
91
#!/usr/bin/env python
from __future__ import print_function, unicode_literals
import argparse
import collections
from datetime import datetime, timedelta
import sys
from helpers import date_arg, make_timezone_aware
from githubapi import get_pulls
from repos import Repo
def main(argv):
parser = argparse.ArgumentParser(description="Summarize pull requests by organization.")
parser.add_argument(
"--since", metavar="DAYS", type=int,
help="Only consider pull requests closed in the past DAYS days"
)
parser.add_argument(
"--start", type=date_arg,
help="Date to start collecting, format is flexible: "
"20141225, Dec/25/2014, 2014-12-25, etc"
)
parser.add_argument(
"--end", type=date_arg,
help="Date to end collecting, format is flexible: "
"25/Dec/2014, 12/25/2014, 2014-12-25, etc"
)
parser.add_argument(
"--short", action="store_true",
help="Only show the short summary"
)
args = parser.parse_args(argv[1:])
since = None
if args.since:
since = make_timezone_aware(datetime.today() - timedelta(days=args.since))
if args.start:
if since is not None:
raise Exception("Can't use --since and --start")
since = args.start
repos = [ r for r in Repo.from_yaml() if r.track_pulls ]
by_org = collections.defaultdict(list)
for repo in repos:
for pull in get_pulls(repo.name, state="closed", pull_details="list", org=True, since=since):
# We only want external pull requests.
if pull.intext != "external":
continue
# We only want merged pull requests.
if pull.combinedstate != "merged":
continue
# Pull requests can be recently modified even if they were merged
# long ago, so only take things merged since our since date.
merged = make_timezone_aware(pull.merged_at)
if merged < since:
continue
if args.end is not None:
# We don't want to count things merged after our end date.
if merged >= args.end:
continue
pull.repo = repo.nick
by_org[pull.org].append(pull)
keys = sorted(by_org, key=lambda k: len(by_org[k]), reverse=True)
for key in keys:
print("{}: {}".format(key, len(by_org[key])))
fmt = "{pull.repo:4s} {pull.number:5d} {pull.user_login:>17s} {pull.title}"
if args.short:
if 'unsigned' in keys:
print("\n-- {} -------".format('unsigned'))
for pull in by_org['unsigned']:
print(fmt.format(pull=pull))
else:
for key in keys:
print("\n-- {} -------".format(key))
for pull in by_org[key]:
print(fmt.format(pull=pull))
if __name__ == "__main__":
sys.exit(main(sys.argv))