You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2016/04/27 09:07:15 UTC

bookkeeper git commit: BOOKKEEPER-920: Extend bk-merge-pr.py to add more info to Jira ticket…

Repository: bookkeeper
Updated Branches:
  refs/heads/master 91595fc04 -> d66b9f0b4


BOOKKEEPER-920: Extend bk-merge-pr.py to add more info to Jira ticket…

… when merging

Author: user.email <mm...@apache.org>

Reviewers: Sijie Guo <si...@apache.org>

Closes #36 from merlimat/bk-920


Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/d66b9f0b
Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/d66b9f0b
Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/d66b9f0b

Branch: refs/heads/master
Commit: d66b9f0b4d27eae59fb9d6e607f24b2e8a0e611a
Parents: 91595fc
Author: Matteo Merli <mm...@apache.org>
Authored: Wed Apr 27 00:07:08 2016 -0700
Committer: Sijie Guo <si...@apache.org>
Committed: Wed Apr 27 00:07:08 2016 -0700

----------------------------------------------------------------------
 dev/bk-merge-pr.py | 66 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 52 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/d66b9f0b/dev/bk-merge-pr.py
----------------------------------------------------------------------
diff --git a/dev/bk-merge-pr.py b/dev/bk-merge-pr.py
old mode 100644
new mode 100755
index 6b1db3f..c3cda40
--- a/dev/bk-merge-pr.py
+++ b/dev/bk-merge-pr.py
@@ -62,7 +62,8 @@ GITHUB_OAUTH_KEY = os.environ.get("GITHUB_OAUTH_KEY")
 
 GITHUB_USER = os.environ.get("GITHUB_USER", "apache")
 GITHUB_BASE = "https://github.com/%s/%s/pull" % (GITHUB_USER, PROJECT_NAME)
-GITHUB_API_BASE = "https://api.github.com/repos/%s/%s" % (GITHUB_USER, PROJECT_NAME)
+GITHUB_API_URL  = "https://api.github.com"
+GITHUB_API_BASE = "%s/repos/%s/%s" % (GITHUB_API_URL, GITHUB_USER, PROJECT_NAME)
 JIRA_BASE = "https://issues.apache.org/jira/browse"
 JIRA_API_BASE = "https://issues.apache.org/jira"
 # Prefix added to temporary branches
@@ -123,7 +124,7 @@ def get_current_branch():
     return run_cmd("git rev-parse --abbrev-ref HEAD").replace("\n", "")
 
 # merge the requested PR and return the merge hash
-def merge_pr(pr_num, target_ref, title, body, pr_repo_desc):
+def merge_pr(pr_num, target_ref, title, body, default_pr_reviewers, pr_repo_desc):
     pr_branch_name = "%s_MERGE_PR_%s" % (TEMP_BRANCH_PREFIX, pr_num)
     target_branch_name = "%s_MERGE_PR_%s_%s" % (TEMP_BRANCH_PREFIX, pr_num, target_ref.upper())
     run_cmd("git fetch %s pull/%s/head:%s" % (PR_REMOTE_NAME, pr_num, pr_branch_name))
@@ -140,6 +141,15 @@ def merge_pr(pr_num, target_ref, title, body, pr_repo_desc):
         continue_maybe(msg)
         had_conflicts = True
 
+    # Offer to run unit tests before committing
+    result = raw_input('Do you want to validate unit tests after the merge? (y/n): ')
+    if result.lower() == 'y':
+        test_res = subprocess.call('mvn clean install'.split())
+        if test_res == 0:
+            print('Unit tests execution succeeded')
+        else:
+            continue_maybe("Unit tests execution FAILED. Do you want to continue with the merge anyway?")
+
     commit_authors = run_cmd(['git', 'log', 'HEAD..%s' % pr_branch_name,
                              '--pretty=format:%an <%ae>']).split("\n")
     distinct_authors = sorted(set(commit_authors),
@@ -150,8 +160,9 @@ def merge_pr(pr_num, target_ref, title, body, pr_repo_desc):
     if primary_author == "":
         primary_author = distinct_authors[0]
 
-    reviewers = raw_input(
-        "Enter reviewers in the format of \"name1 <email1>, name2 <email2>\": ").strip()
+    reviewers = raw_input("Enter reviewers [%s]: " % default_pr_reviewers).strip()
+    if reviewers == '':
+        reviewers = default_pr_reviewers
 
     commits = run_cmd(['git', 'log', 'HEAD..%s' % pr_branch_name,
                       '--pretty=format:%h [%an] %s']).split("\n")
@@ -208,10 +219,11 @@ def merge_pr(pr_num, target_ref, title, body, pr_repo_desc):
         fail("Exception while pushing: %s" % e)
 
     merge_hash = run_cmd("git rev-parse %s" % target_branch_name)[:8]
+    merge_log = run_cmd("git show --format=fuller -q %s" % target_branch_name)
     clean_up()
     print("Pull request #%s merged!" % pr_num)
     print("Merge hash: %s" % merge_hash)
-    return merge_hash
+    return merge_hash, merge_log
 
 
 def cherry_pick(pr_num, merge_hash, default_branch):
@@ -265,13 +277,13 @@ def fix_version_from_branch(branch, versions):
             return None
 
 
-def resolve_jira_issue(merge_branches, comment, default_jira_id=""):
+def resolve_jira_issue(merge_branches, comment, jira_id):
     asf_jira = jira.client.JIRA({'server': JIRA_API_BASE},
                                 basic_auth=(JIRA_USERNAME, JIRA_PASSWORD))
 
-    jira_id = raw_input("Enter a JIRA id [%s]: " % default_jira_id)
-    if jira_id == "":
-        jira_id = default_jira_id
+    result = raw_input("Resolve JIRA %s ? (y/n): " % jira_id)
+    if result.lower() != "y":
+        return
 
     try:
         issue = asf_jira.issue(jira_id)
@@ -321,10 +333,10 @@ def resolve_jira_issue(merge_branches, comment, default_jira_id=""):
 
 
 def resolve_jira_issues(title, merge_branches, comment):
-    jira_ids = re.findall("%s-[0-9]{4,5}" % CAPITALIZED_PROJECT_NAME, title)
+    jira_ids = re.findall("%s-[0-9]{3,6}" % CAPITALIZED_PROJECT_NAME, title)
 
     if len(jira_ids) == 0:
-        resolve_jira_issue(merge_branches, comment)
+        pritnf ("No JIRA issue found to update")
     for jira_id in jira_ids:
         resolve_jira_issue(merge_branches, comment, jira_id)
 
@@ -369,6 +381,26 @@ def standardize_jira_ref(text):
 
     return clean_text
 
+def get_reviewers(pr_num):
+    """
+    Get a candidate list of reviewers that have commented on the PR with '+1' or 'LGTM'
+    """
+    approval_msgs = ['+1', 'lgtm']
+
+    pr_comments = get_json("%s/issues/%s/comments" % (GITHUB_API_BASE, pr_num))
+
+    reviewers_ids = set()
+    for comment in pr_comments:
+        for approval_msg in approval_msgs:
+            if approval_msg in comment['body'].lower():
+                reviewers_ids.add(comment['user']['login'])
+
+    reviewers_emails = []
+    for reviewer_id in reviewers_ids:
+        user = get_json("%s/users/%s" % (GITHUB_API_URL, reviewer_id))
+        reviewers_emails += ['%s <%s>' % (user['name'].strip(), user['email'].strip())]
+    return ', '.join(reviewers_emails)
+
 def main():
     global original_head
 
@@ -382,6 +414,7 @@ def main():
     pr_num = raw_input("Which pull request would you like to merge? (e.g. 34): ")
     pr = get_json("%s/pulls/%s" % (GITHUB_API_BASE, pr_num))
     pr_events = get_json("%s/issues/%s/events" % (GITHUB_API_BASE, pr_num))
+    pr_reviewers = get_reviewers(pr_num)
 
     url = pr["url"]
 
@@ -441,7 +474,7 @@ def main():
 
     merged_refs = [target_ref]
 
-    merge_hash = merge_pr(pr_num, target_ref, commit_title, body, pr_repo_desc)
+    merge_hash, merge_commit_log = merge_pr(pr_num, target_ref, commit_title, body, pr_reviewers, pr_repo_desc)
 
     pick_prompt = "Would you like to pick %s into another branch?" % merge_hash
     while raw_input("\n%s (y/n): " % pick_prompt).lower() == "y":
@@ -449,8 +482,13 @@ def main():
 
     if JIRA_IMPORTED:
         if JIRA_USERNAME and JIRA_PASSWORD:
-            continue_maybe("Would you like to update an associated JIRA?")
-            jira_comment = "Issue resolved by pull request %s\n[%s/%s]" % (pr_num, GITHUB_BASE, pr_num)
+            jira_comment = '''Issue resolved by merging pull request %s
+            [%s/%s]
+
+            {noformat}
+            %s
+            {noformat}
+            ''' % (pr_num, GITHUB_BASE, pr_num, merge_commit_log)
             resolve_jira_issues(commit_title, merged_refs, jira_comment)
         else:
             print "JIRA_USERNAME and JIRA_PASSWORD not set"