##// END OF EJS Templates
add ability to check what PRs should be backported in backport_pr...
MinRK -
Show More
@@ -2,24 +2,37 b''
2 2 """
3 3 Backport pull requests to a particular branch.
4 4
5 Usage: backport_pr.py branch PR
5 Usage: backport_pr.py branch [PR]
6 6
7 7 e.g.:
8 8
9 backport_pr.py 0.13.1 123
9 python tools/backport_pr.py 0.13.1 123
10 10
11 11 to backport PR #123 onto branch 0.13.1
12 12
13 or
14
15 python tools/backport_pr.py 1.x
16
17 to see what PRs are marked for backport that have yet to be applied.
18
13 19 """
14 20
15 21 from __future__ import print_function
16 22
17 23 import os
24 import re
18 25 import sys
26
19 27 from subprocess import Popen, PIPE, check_call, check_output
20 28 from urllib import urlopen
21 29
22 from gh_api import get_pull_request, get_pull_request_files
30 from gh_api import (
31 get_issues_list,
32 get_pull_request,
33 get_pull_request_files,
34 is_pull_request,
35 )
23 36
24 37 def find_rejects(root='.'):
25 38 for dirname, dirs, files in os.walk(root):
@@ -84,9 +97,47 b" def backport_pr(branch, num, project='ipython/ipython'):"
84 97
85 98 return 0
86 99
100 backport_re = re.compile(r"[Bb]ackport.*?(\d+)")
101
102 def already_backported(branch, since_tag=None):
103 """return set of PRs that have been backported already"""
104 if since_tag is None:
105 since_tag = check_output(['git','describe', branch, '--abbrev=0']).decode('utf8').strip()
106 cmd = ['git', 'log', '%s..%s' % (since_tag, branch), '--oneline']
107 lines = check_output(cmd).decode('utf8')
108 return set(int(num) for num in backport_re.findall(lines))
109
110 def should_backport(labels):
111 """return set of PRs marked for backport"""
112 issues = get_issues_list("ipython/ipython",
113 labels=labels,
114 state='closed',
115 auth=True,
116 )
117 should_backport = set()
118 for issue in issues:
119 if not is_pull_request(issue):
120 continue
121 pr = get_pull_request("ipython/ipython", issue['number'], auth=True)
122 if not pr['merged']:
123 print ("Marked PR closed without merge: %i" % pr['number'])
124 continue
125 should_backport.add(pr['number'])
126 return should_backport
127
87 128 if __name__ == '__main__':
88 if len(sys.argv) < 3:
129
130 if len(sys.argv) < 2:
89 131 print(__doc__)
90 132 sys.exit(1)
91 133
134 if len(sys.argv) < 3:
135 branch = sys.argv[1]
136 already = already_backported(branch)
137 should = should_backport("backport-1.1")
138 print ("The following PRs should be backported:")
139 for pr in should.difference(already):
140 print (pr)
141 sys.exit(0)
142
92 143 sys.exit(backport_pr(sys.argv[1], int(sys.argv[2])))
General Comments 0
You need to be logged in to leave comments. Login now