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 2018/06/04 20:00:24 UTC

[bookkeeper] branch master updated: Improve merge script to merge PRs based on branches

This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 7a26120  Improve merge script to merge PRs based on branches
7a26120 is described below

commit 7a2612076eba9fbfd32aa177c66e4a1d0b58edf6
Author: Sijie Guo <si...@apache.org>
AuthorDate: Mon Jun 4 13:00:04 2018 -0700

    Improve merge script to merge PRs based on branches
    
    Descriptions of the changes in this PR:
    
    *Motivation*
    
    Merge script doesn't handle well on handling PRs based on branches. So committers ended up
    using merge button to merge PRs. so we lose a lot of informations such as descriptions, reviewers
    in the commit message.
    
    *Solution*
    
    This PR fixes the problems on handling merging PRs based on branches.
    
    This allows us merging #1469 using merge script.
    
    Author: Sijie Guo <si...@apache.org>
    
    Reviewers: Enrico Olivelli <eo...@gmail.com>
    
    This closes #1477 from sijie/merge_pull_request_from_branch
---
 dev/bk-merge-pr.py | 81 ++++++++++++++++++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 33 deletions(-)

diff --git a/dev/bk-merge-pr.py b/dev/bk-merge-pr.py
index 2c1384f..e623d5c 100755
--- a/dev/bk-merge-pr.py
+++ b/dev/bk-merge-pr.py
@@ -51,8 +51,6 @@ REPO_HOME = os.environ.get("%s_HOME" % CAPITALIZED_PROJECT_NAME, os.getcwd())
 PR_REMOTE_NAME = os.environ.get("PR_REMOTE_NAME", "apache-github")
 # Remote name which points to Apache git
 PUSH_REMOTE_NAME = os.environ.get("PUSH_REMOTE_NAME", "apache")
-# Reference branch name
-DEV_BRANCH_NAME = os.environ.get("DEV_BRANCH_NAME", "master")
 # ASF JIRA username
 JIRA_USERNAME = os.environ.get("JIRA_USERNAME", "")
 # ASF JIRA password
@@ -304,9 +302,9 @@ def cherry_pick(pr_num, merge_hash, pick_ref):
     return pick_ref
 
 
-def fix_version_from_branch(branch, versions):
+def fix_version_from_branch(branch, versions, target_ref):
     # Note: Assumes this is a sorted (newest->oldest) list of un-released versions
-    if branch == DEV_BRANCH_NAME:
+    if branch == target_ref:
         versions = filter(lambda x: x == DEFAULT_FIX_VERSION, versions)
         if len(versions) > 0:
             return versions[0]
@@ -320,7 +318,7 @@ def fix_version_from_branch(branch, versions):
             return None
 
 
-def resolve_jira_issue(merge_branches, comment, jira_id):
+def resolve_jira_issue(merge_branches, comment, jira_id, target_ref):
     asf_jira = jira.client.JIRA({'server': JIRA_API_BASE},
                                 basic_auth=(JIRA_USERNAME, JIRA_PASSWORD))
 
@@ -352,7 +350,7 @@ def resolve_jira_issue(merge_branches, comment, jira_id):
     versions = filter(lambda x: x.raw['released'] is False, versions)
 
     version_names = map(lambda x: x.name, versions)
-    default_fix_versions = map(lambda x: fix_version_from_branch(x, version_names), merge_branches)
+    default_fix_versions = map(lambda x: fix_version_from_branch(x, version_names), merge_branches, target_ref)
     default_fix_versions = filter(lambda x: x != None, default_fix_versions)
     default_fix_versions = ",".join(default_fix_versions)
 
@@ -375,13 +373,13 @@ def resolve_jira_issue(merge_branches, comment, jira_id):
     print "Successfully resolved %s with fixVersions=%s!" % (jira_id, fix_versions)
 
 
-def resolve_jira_issues(title, merge_branches, comment):
+def resolve_jira_issues(title, merge_branches, comment, target_ref):
     jira_ids = re.findall("%s-[0-9]{3,6}" % CAPITALIZED_PROJECT_NAME, title)
 
     if len(jira_ids) == 0:
         print "No JIRA issue found to update"
     for jira_id in jira_ids:
-        resolve_jira_issue(merge_branches, comment, jira_id)
+        resolve_jira_issue(merge_branches, comment, jira_id, target_ref)
 
 
 def standardize_jira_ref(text):
@@ -537,15 +535,16 @@ def ask_release_for_github_issues(branch, labels):
             break
     return fix_releases
 
-def ask_updates_for_github_issues(milestones, labels, issue_labels):
+def ask_updates_for_github_issues(milestones, labels, issue_labels, milestone_required):
     while True:
         fix_milestone, fix_milestone_number, fix_areas, fix_types = \
-            get_updates_for_github_issues(milestones, labels, issue_labels)
+            get_updates_for_github_issues(milestones, labels, issue_labels, milestone_required)
 
         print "=== Apply following milestone, area, type to github issues ==" 
         print "Fix Types: %s" % ', '.join(fix_types)
         print "Fix Areas: %s" % ', '.join(fix_areas)
-        print "Fix Milestone: %s" % fix_milestone
+        if milestone_required:
+            print "Fix Milestone: %s" % fix_milestone
         print ""
 
         if raw_input("Would you like to update github issues with these labels? (y/n): ") == "y":
@@ -553,22 +552,25 @@ def ask_updates_for_github_issues(milestones, labels, issue_labels):
 
     return fix_milestone, fix_milestone_number, fix_areas, fix_types
 
-def get_updates_for_github_issues(milestones, labels, issue_labels):
+def get_updates_for_github_issues(milestones, labels, issue_labels, milestone_required):
     # get milestone
-    default_milestone_name = milestones[0]['title']
-    milestone_list = map(lambda x: x['title'], milestones)
-    milestone_map = dict((milestone['title'], milestone['number']) for milestone in milestones)
     fix_milestone = ""
-    while True:
-        fix_milestone = raw_input("Choose fix milestone : options are [%s] - default: [%s]: " % (', '.join(milestone_list).strip(), default_milestone_name))
-        fix_milestone = fix_milestone.strip()
-        if fix_milestone == "":
-            fix_milestone = default_milestone_name
-            break
-        elif fix_milestone in milestone_map:
-            break
-        else:
-            print "Invalid milestone: %s." % fix_milestone
+    fix_milestone_number = ""
+    if milestone_required:
+        default_milestone_name = milestones[0]['title']
+        milestone_list = map(lambda x: x['title'], milestones)
+        milestone_map = dict((milestone['title'], milestone['number']) for milestone in milestones)
+        while True:
+            fix_milestone = raw_input("Choose fix milestone : options are [%s] - default: [%s]: " % (', '.join(milestone_list).strip(), default_milestone_name))
+            fix_milestone = fix_milestone.strip()
+            if fix_milestone == "":
+                fix_milestone = default_milestone_name
+                break
+            elif fix_milestone in milestone_map:
+                break
+            else:
+                print "Invalid milestone: %s." % fix_milestone
+        fix_milestone_number = milestone_map[fix_milestone]
 
     # get area
     fix_areas = ask_for_labels("area/", labels, issue_labels)
@@ -576,7 +578,7 @@ def get_updates_for_github_issues(milestones, labels, issue_labels):
     # get types
     fix_types = ask_for_labels("type/", labels, issue_labels) 
 
-    return fix_milestone, milestone_map[fix_milestone], fix_areas, fix_types
+    return fix_milestone, fix_milestone_number, fix_areas, fix_types
 
 def ask_for_labels(prefix, labels, issue_labels):
     issue_filtered_labels = map(lambda l: l.split('/')[1], filter(lambda x: x.startswith(prefix), issue_labels))
@@ -636,11 +638,17 @@ def update_github_issue(github_issue_id, fix_milestone_number, fix_milestone, fi
     url = get_github_issue_url(github_issue_id)
     labels = other_labels + map(lambda x: "area/%s" % x, fix_areas)
     labels = labels + map(lambda x: "type/%s" % x, fix_types)
-    labels.append("release/%s" % fix_milestone)
-    data = json.dumps({
-        'milestone': int(fix_milestone_number),
-        'labels': labels,
-    })
+    if fix_milestone_number == '':
+        data = json.dumps({
+            'labels': labels,
+        })
+    else:
+        labels.append("release/%s" % fix_milestone)
+        data = json.dumps({
+            'milestone': int(fix_milestone_number),
+            'labels': labels,
+        })
+
     post_json(url, data)
     return labels
 
@@ -747,7 +755,7 @@ def main():
     issue_labels = get_github_issue_labels(pr_num)
     # ask for fix milestone, area and type
     fix_milestone, fix_milestone_number, fix_areas, fix_types = \
-        ask_updates_for_github_issues(milestones, labels, issue_labels)
+        ask_updates_for_github_issues(milestones, labels, issue_labels, target_ref == "master")
     # update issues with fix milestone, are and type
     other_labels = filter(lambda x: not x.startswith("area"), issue_labels)
     all_issue_labels = update_github_issues( \
@@ -760,6 +768,13 @@ def main():
     # add the pr author to the assignees
     add_assignees_to_github_issues(github_issue_ids, [ user_login ])
 
+    if target_ref != "master":
+        branch_version = target_ref.split('-')[1]
+        # add releases
+        fix_releases = ask_release_for_github_issues(branch_version, labels)
+        if len(fix_releases) > 0:
+            all_issue_labels = add_release_to_github_issues(github_issue_ids, all_issue_labels, fix_releases[0])
+
     #
     # 5. Process the merge
     #
@@ -817,7 +832,7 @@ def main():
             %s
             {noformat}
             ''' % (pr_num, GITHUB_BASE, pr_num, merge_commit_log)
-            resolve_jira_issues(commit_title, merged_refs, jira_comment)
+            resolve_jira_issues(commit_title, merged_refs, jira_comment, target_ref)
         else:
             print "JIRA_USERNAME and JIRA_PASSWORD not set"
             print "Exiting without trying to close the associated JIRA."

-- 
To stop receiving notification emails like this one, please contact
sijie@apache.org.