56
56
# Prefix added to temporary branches
57
57
BRANCH_PREFIX = "PR_TOOL"
58
58
59
- os .chdir (SPARK_HOME )
60
-
61
59
62
60
def get_json (url ):
63
61
try :
@@ -86,10 +84,6 @@ def continue_maybe(prompt):
86
84
if result .lower () != "y" :
87
85
fail ("Okay, exiting" )
88
86
89
-
90
- original_head = run_cmd ("git rev-parse HEAD" )[:8 ]
91
-
92
-
93
87
def clean_up ():
94
88
print "Restoring head pointer to %s" % original_head
95
89
run_cmd ("git checkout %s" % original_head )
@@ -275,7 +269,7 @@ def get_version_json(version_str):
275
269
asf_jira .transition_issue (
276
270
jira_id , resolve ["id" ], fixVersions = jira_fix_versions , comment = comment )
277
271
278
- print "Succesfully resolved %s with fixVersions=%s!" % (jira_id , fix_versions )
272
+ print "Successfully resolved %s with fixVersions=%s!" % (jira_id , fix_versions )
279
273
280
274
281
275
def resolve_jira_issues (title , merge_branches , comment ):
@@ -286,10 +280,19 @@ def resolve_jira_issues(title, merge_branches, comment):
286
280
for jira_id in jira_ids :
287
281
resolve_jira_issue (merge_branches , comment , jira_id )
288
282
283
+
289
284
def standardize_jira_ref (text ):
290
- # Standardize the [MODULE] SPARK-XXXXX prefix
291
- # Converts "[SPARK-XXX][mllib] Issue", "[MLLib] SPARK-XXX. Issue" or "SPARK XXX [MLLIB]: Issue" to "[MLLIB] SPARK-XXX: Issue"
285
+ """
286
+ Standardize the [MODULE] SPARK-XXXXX prefix
287
+ Converts "[SPARK-XXX][mllib] Issue", "[MLLib] SPARK-XXX. Issue" or "SPARK XXX [MLLIB]: Issue" to "[MLLIB] SPARK-XXX: Issue"
292
288
289
+ >>> standardize_jira_ref("[SPARK-5821] [SQL] ParquetRelation2 CTAS should check if delete is successful")
290
+ '[SQL] SPARK-5821: ParquetRelation2 CTAS should check if delete is successful'
291
+ >>> standardize_jira_ref("[SPARK-4123][Project Infra][WIP]: Show new dependencies added in pull requests")
292
+ '[PROJECT INFRA] [WIP] SPARK-4123: Show new dependencies added in pull requests'
293
+ >>> standardize_jira_ref("[MLlib] Spark 5954: Top by key")
294
+ '[MLLIB] SPARK-5954: Top by key'
295
+ """
293
296
#If the string is compliant, no need to process any further
294
297
if (re .search (r'\[[A-Z0-9_]+\] SPARK-[0-9]{3,5}: \S+' , text )):
295
298
return text
@@ -300,7 +303,7 @@ def standardize_jira_ref(text):
300
303
while (pattern .search (text ) is not None ):
301
304
ref = pattern .search (text ).groups ()[0 ]
302
305
# Replace any whitespace with a dash & convert to uppercase
303
- jira_refs .append (re .sub (r'\s' , '-' , ref .upper ()))
306
+ jira_refs .append (re .sub (r'\s+ ' , '-' , ref .upper ()))
304
307
text = text .replace (ref , '' )
305
308
306
309
# Extract spark component(s):
@@ -337,68 +340,78 @@ def standardize_jira_ref(text):
337
340
338
341
return clean_text
339
342
340
- branches = get_json ("%s/branches" % GITHUB_API_BASE )
341
- branch_names = filter (lambda x : x .startswith ("branch-" ), [x ['name' ] for x in branches ])
342
- # Assumes branch names can be sorted lexicographically
343
- latest_branch = sorted (branch_names , reverse = True )[0 ]
344
-
345
- pr_num = raw_input ("Which pull request would you like to merge? (e.g. 34): " )
346
- pr = get_json ("%s/pulls/%s" % (GITHUB_API_BASE , pr_num ))
347
- pr_events = get_json ("%s/issues/%s/events" % (GITHUB_API_BASE , pr_num ))
348
-
349
- url = pr ["url" ]
350
- title = standardize_jira_ref (pr ["title" ])
351
- body = pr ["body" ]
352
- target_ref = pr ["base" ]["ref" ]
353
- user_login = pr ["user" ]["login" ]
354
- base_ref = pr ["head" ]["ref" ]
355
- pr_repo_desc = "%s/%s" % (user_login , base_ref )
356
-
357
- # Merged pull requests don't appear as merged in the GitHub API;
358
- # Instead, they're closed by asfgit.
359
- merge_commits = \
360
- [e for e in pr_events if e ["actor" ]["login" ] == "asfgit" and e ["event" ] == "closed" ]
361
-
362
- if merge_commits :
363
- merge_hash = merge_commits [0 ]["commit_id" ]
364
- message = get_json ("%s/commits/%s" % (GITHUB_API_BASE , merge_hash ))["commit" ]["message" ]
365
-
366
- print "Pull request %s has already been merged, assuming you want to backport" % pr_num
367
- commit_is_downloaded = run_cmd (['git' , 'rev-parse' , '--quiet' , '--verify' ,
343
+ def main ():
344
+ os .chdir (SPARK_HOME )
345
+ original_head = run_cmd ("git rev-parse HEAD" )[:8 ]
346
+
347
+ branches = get_json ("%s/branches" % GITHUB_API_BASE )
348
+ branch_names = filter (lambda x : x .startswith ("branch-" ), [x ['name' ] for x in branches ])
349
+ # Assumes branch names can be sorted lexicographically
350
+ latest_branch = sorted (branch_names , reverse = True )[0 ]
351
+
352
+ pr_num = raw_input ("Which pull request would you like to merge? (e.g. 34): " )
353
+ pr = get_json ("%s/pulls/%s" % (GITHUB_API_BASE , pr_num ))
354
+ pr_events = get_json ("%s/issues/%s/events" % (GITHUB_API_BASE , pr_num ))
355
+
356
+ url = pr ["url" ]
357
+ title = standardize_jira_ref (pr ["title" ])
358
+ body = pr ["body" ]
359
+ target_ref = pr ["base" ]["ref" ]
360
+ user_login = pr ["user" ]["login" ]
361
+ base_ref = pr ["head" ]["ref" ]
362
+ pr_repo_desc = "%s/%s" % (user_login , base_ref )
363
+
364
+ # Merged pull requests don't appear as merged in the GitHub API;
365
+ # Instead, they're closed by asfgit.
366
+ merge_commits = \
367
+ [e for e in pr_events if e ["actor" ]["login" ] == "asfgit" and e ["event" ] == "closed" ]
368
+
369
+ if merge_commits :
370
+ merge_hash = merge_commits [0 ]["commit_id" ]
371
+ message = get_json ("%s/commits/%s" % (GITHUB_API_BASE , merge_hash ))["commit" ]["message" ]
372
+
373
+ print "Pull request %s has already been merged, assuming you want to backport" % pr_num
374
+ commit_is_downloaded = run_cmd (['git' , 'rev-parse' , '--quiet' , '--verify' ,
368
375
"%s^{commit}" % merge_hash ]).strip () != ""
369
- if not commit_is_downloaded :
370
- fail ("Couldn't find any merge commit for #%s, you may need to update HEAD." % pr_num )
376
+ if not commit_is_downloaded :
377
+ fail ("Couldn't find any merge commit for #%s, you may need to update HEAD." % pr_num )
371
378
372
- print "Found commit %s:\n %s" % (merge_hash , message )
373
- cherry_pick (pr_num , merge_hash , latest_branch )
374
- sys .exit (0 )
379
+ print "Found commit %s:\n %s" % (merge_hash , message )
380
+ cherry_pick (pr_num , merge_hash , latest_branch )
381
+ sys .exit (0 )
375
382
376
- if not bool (pr ["mergeable" ]):
377
- msg = "Pull request %s is not mergeable in its current form.\n " % pr_num + \
378
- "Continue? (experts only!)"
379
- continue_maybe (msg )
383
+ if not bool (pr ["mergeable" ]):
384
+ msg = "Pull request %s is not mergeable in its current form.\n " % pr_num + \
385
+ "Continue? (experts only!)"
386
+ continue_maybe (msg )
380
387
381
- print ("\n === Pull Request #%s ===" % pr_num )
382
- print ("title\t %s\n source\t %s\n target\t %s\n url\t %s" % (
383
- title , pr_repo_desc , target_ref , url ))
384
- continue_maybe ("Proceed with merging pull request #%s?" % pr_num )
388
+ print ("\n === Pull Request #%s ===" % pr_num )
389
+ print ("title\t %s\n source\t %s\n target\t %s\n url\t %s" % (
390
+ title , pr_repo_desc , target_ref , url ))
391
+ continue_maybe ("Proceed with merging pull request #%s?" % pr_num )
385
392
386
- merged_refs = [target_ref ]
393
+ merged_refs = [target_ref ]
387
394
388
- merge_hash = merge_pr (pr_num , target_ref )
395
+ merge_hash = merge_pr (pr_num , target_ref )
389
396
390
- pick_prompt = "Would you like to pick %s into another branch?" % merge_hash
391
- while raw_input ("\n %s (y/n): " % pick_prompt ).lower () == "y" :
392
- merged_refs = merged_refs + [cherry_pick (pr_num , merge_hash , latest_branch )]
397
+ pick_prompt = "Would you like to pick %s into another branch?" % merge_hash
398
+ while raw_input ("\n %s (y/n): " % pick_prompt ).lower () == "y" :
399
+ merged_refs = merged_refs + [cherry_pick (pr_num , merge_hash , latest_branch )]
393
400
394
- if JIRA_IMPORTED :
395
- if JIRA_USERNAME and JIRA_PASSWORD :
396
- continue_maybe ("Would you like to update an associated JIRA?" )
397
- jira_comment = "Issue resolved by pull request %s\n [%s/%s]" % (pr_num , GITHUB_BASE , pr_num )
398
- resolve_jira_issues (title , merged_refs , jira_comment )
401
+ if JIRA_IMPORTED :
402
+ if JIRA_USERNAME and JIRA_PASSWORD :
403
+ continue_maybe ("Would you like to update an associated JIRA?" )
404
+ jira_comment = "Issue resolved by pull request %s\n [%s/%s]" % (pr_num , GITHUB_BASE , pr_num )
405
+ resolve_jira_issues (title , merged_refs , jira_comment )
406
+ else :
407
+ print "JIRA_USERNAME and JIRA_PASSWORD not set"
408
+ print "Exiting without trying to close the associated JIRA."
399
409
else :
400
- print "JIRA_USERNAME and JIRA_PASSWORD not set "
410
+ print "Could not find jira-python library. Run 'sudo pip install jira-python' to install. "
401
411
print "Exiting without trying to close the associated JIRA."
402
- else :
403
- print "Could not find jira-python library. Run 'sudo pip install jira-python' to install."
404
- print "Exiting without trying to close the associated JIRA."
412
+
413
+ if __name__ == "__main__" :
414
+ import doctest
415
+ doctest .testmod ()
416
+
417
+ main ()
0 commit comments