##// END OF EJS Templates
Pickle PR test logs so they can be posted without rerunning tests.
Thomas Kluyver -
Show More
@@ -0,0 +1,10 b''
1 from test_pr import load_results, post_logs, post_results_comment, print_results
2
3 num, results, pr = load_results()
4 results_urls = post_logs(results)
5 print_results(pr, results_urls)
6 post_results_comment(pr, results_urls, num)
7
8 print()
9 print("Posted test results to pull request")
10 print(" " + pr['html_url'])
@@ -13,6 +13,7 b' from glob import glob'
13 13 import io
14 14 import json
15 15 import os
16 import pickle
16 17 import re
17 18 import requests
18 19 import shutil
@@ -106,7 +107,7 b' def run_tests(venv):'
106 107 except CalledProcessError as e:
107 108 return False, e.output.decode('utf-8')
108 109
109 def markdown_format(pr, results):
110 def markdown_format(pr, results_urls):
110 111 def format_result(py, passed, gist_url, missing_libraries):
111 112 s = "* %s: " % py
112 113 if passed:
@@ -124,7 +125,7 b' def markdown_format(pr, results):'
124 125 lines = ["**Test results for commit %s**" % com,
125 126 "Platform: " + sys.platform,
126 127 ""] + \
127 [format_result(*r) for r in results] + \
128 [format_result(*r) for r in results_urls] + \
128 129 ["",
129 130 "Not available for testing: " + ", ".join(unavailable_pythons)]
130 131 return "\n".join(lines)
@@ -133,14 +134,14 b' def post_results_comment(pr, results, num):'
133 134 body = markdown_format(pr, results)
134 135 gh_api.post_issue_comment(gh_project, num, body)
135 136
136 def print_results(pr, results):
137 def print_results(pr, results_urls):
137 138 print("\n")
138 139 if pr['mergeable']:
139 140 print("**Test results for commit %s merged into master**" % pr['head']['sha'][:7])
140 141 else:
141 142 print("**Test results for commit %s (can't merge cleanly)**" % pr['head']['sha'][:7])
142 143 print("Platform:", sys.platform)
143 for py, passed, gist_url, missing_libraries in results:
144 for py, passed, gist_url, missing_libraries in results_urls:
144 145 if passed:
145 146 print(py, ":", "OK")
146 147 else:
@@ -150,6 +151,42 b' def print_results(pr, results):'
150 151 print(" Libraries not available:", missing_libraries)
151 152 print("Not available for testing:", ", ".join(unavailable_pythons))
152 153
154 def dump_results(num, results, pr):
155 with open(os.path.join(basedir, 'lastresults.pkl'), 'wb') as f:
156 pickle.dump((num, results, pr), f)
157
158 def load_results():
159 with open(os.path.join(basedir, 'lastresults.pkl'), 'rb') as f:
160 return pickle.load(f)
161
162 def save_logs(results, pr):
163 results_paths = []
164 for py, passed, log, missing_libraries in results:
165 if passed:
166 results_paths.append((py, passed, None, missing_libraries))
167 else:
168
169 result_locn = os.path.abspath(os.path.join('venv-%s' % py,
170 pr['head']['sha'][:7]+".log"))
171 with io.open(result_locn, 'w', encoding='utf-8') as f:
172 f.write(log)
173
174 results_paths.append((py, False, result_locn, missing_libraries))
175
176 return results_paths
177
178 def post_logs(results):
179 results_urls = []
180 for py, passed, log, missing_libraries in results:
181 if passed:
182 results_urls.append((py, passed, None, missing_libraries))
183 else:
184 result_locn = gh_api.post_gist(log, description='IPython test log',
185 filename="results.log", auth=True)
186 results_urls.append((py, False, result_locn, missing_libraries))
187
188 return results_urls
189
153 190 def test_pr(num, post_results=True):
154 191 # Get Github authorisation first, so that the user is prompted straight away
155 192 # if their login is needed.
@@ -171,28 +208,28 b' def test_pr(num, post_results=True):'
171 208 if passed:
172 209 results.append((py, True, None, missing_libraries))
173 210 else:
174 if post_results:
175 result_locn = gh_api.post_gist(log, description='IPython test log',
176 filename="results.log", auth=True)
177 else:
178 result_locn = os.path.abspath(os.path.join(venv,
179 pr['head']['sha'][:7]+".log"))
180 with io.open(result_locn, 'w', encoding='utf-8') as f:
181 f.write(log)
182 results.append((py, False, result_locn, missing_libraries))
211 results.append((py, False, log, missing_libraries))
212
213 dump_results(num, results, pr)
214
215 results_paths = save_logs(results, pr)
216 print_results(pr, results_paths)
183 217
184 print_results(pr, results)
185 218 if post_results:
186 post_results_comment(pr, results, num)
219 results_urls = post_logs(results)
220 post_results_comment(pr, results_urls, num)
187 221 print("(Posted to Github)")
222 else:
223 post_script = os.path.join(os.path.dirname(sys.argv[0]), "post_pr_test.py")
224 print("To post the results to Github, run", post_script)
188 225
189 226
190 227 if __name__ == '__main__':
191 228 import argparse
192 229 parser = argparse.ArgumentParser(description="Test an IPython pull request")
193 parser.add_argument('-l', '--local', action='store_true',
194 help="Don't publish the results to Github")
230 parser.add_argument('-p', '--publish', action='store_true',
231 help="Publish the results to Github")
195 232 parser.add_argument('number', type=int, help="The pull request number")
196 233
197 234 args = parser.parse_args()
198 test_pr(args.number, post_results=(not args.local))
235 test_pr(args.number, post_results=args.publish)
General Comments 0
You need to be logged in to leave comments. Login now