You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@distributedlog.apache.org by si...@apache.org on 2017/01/04 08:40:32 UTC
incubator-distributedlog git commit: Improve merge pull request
scripts
Repository: incubator-distributedlog
Updated Branches:
refs/heads/master f607a48ff -> 0711bc2fd
Improve merge pull request scripts
- check if a pull request is approved or not
- reject merging if there is no approval
- handle cases that reviewers don't have name and email configured.
Author: Sijie Guo <si...@apache.org>
Reviewers: Franck Cuny <fc...@apache.org>
Closes #93 from sijie/sijie/improve_merge_scripts
Project: http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/commit/0711bc2f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/tree/0711bc2f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/diff/0711bc2f
Branch: refs/heads/master
Commit: 0711bc2fdc2afbb573ce42d9eecccf03e166f006
Parents: f607a48
Author: Sijie Guo <si...@apache.org>
Authored: Wed Jan 4 00:40:28 2017 -0800
Committer: Sijie Guo <si...@apache.org>
Committed: Wed Jan 4 00:40:28 2017 -0800
----------------------------------------------------------------------
scripts/dev/dl-merge-pr.py | 42 ++++++++++++++++++++++++++++++++---------
scripts/dev/reviewers | 18 ++++++++++++++++++
2 files changed, 51 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/blob/0711bc2f/scripts/dev/dl-merge-pr.py
----------------------------------------------------------------------
diff --git a/scripts/dev/dl-merge-pr.py b/scripts/dev/dl-merge-pr.py
index ca853d0..6c9d3e8 100755
--- a/scripts/dev/dl-merge-pr.py
+++ b/scripts/dev/dl-merge-pr.py
@@ -84,8 +84,9 @@ TEMP_BRANCH_PREFIX = 'PR_TOOL'
RELEASE_BRANCH_PREFIX = ''
DEV_BRANCH_NAME = 'master'
+DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "0.4.0")
-def get_json(url):
+def get_json(url, preview_api = False):
"""
Returns parsed JSON from an API call to the GitHub API.
"""
@@ -93,6 +94,8 @@ def get_json(url):
request = urllib2.Request(url)
if GITHUB_OAUTH_KEY:
request.add_header('Authorization', 'token {0}'.format(GITHUB_OAUTH_KEY))
+ if preview_api:
+ request.add_header('Accept', 'application/vnd.github.black-cat-preview+json')
return json.load(urllib2.urlopen(request))
except urllib2.HTTPError as e:
if 'X-RateLimit-Remaining' in e.headers and e.headers['X-RateLimit-Remaining'] == '0':
@@ -139,7 +142,7 @@ def clean_up():
print('Restoring head pointer to {0}'.format(original_head))
run_cmd(['git', 'checkout', original_head])
- branches = run_cmd(['git', 'branch']).strip().split('\n')
+ branches = run_cmd(['git', 'branch']).replace(" ", "").split('\n')
for branch in filter(lambda x: x.startswith(TEMP_BRANCH_PREFIX), branches):
print('Deleting local branch {0}'.format(branch))
@@ -290,6 +293,7 @@ def cherry_pick(pr_num, merge_hash, default_branch):
def fix_version_from_branch(branch, versions):
# Note: Assumes this is a sorted (newest->oldest) list of un-released versions
if branch == DEV_BRANCH_NAME:
+ versions = filter(lambda x: x == DEFAULT_FIX_VERSION, versions)
if len(versions) > 0:
return versions[0]
else:
@@ -328,9 +332,10 @@ def resolve_jira_issue(merge_branches, comment, jira_id):
if cur_status == 'Resolved' or cur_status == 'Closed':
fail('JIRA issue {0} already has status \'{1}\''.format(jira_id, cur_status))
- print ('=== JIRA {0} ==='.format(jira_id))
- print ('summary\t\t{0}\nassignee\t{1}\nstatus\t\t{2}\nurl\t\t{3}/{4}\n'.format(
- cur_summary, cur_assignee, cur_status, JIRA_BASE, jira_id))
+
+ print ('=== JIRA {0} ==='.format(jira_id))
+ print ('summary\t\t{0}\nassignee\t{1}\nstatus\t\t{2}\nurl\t\t{3}/{4}\n'.format(
+ cur_summary, cur_assignee, cur_status, JIRA_BASE, jira_id))
versions = asf_jira.project_versions(CAPITALIZED_PROJECT_NAME)
versions = sorted(versions, key=lambda x: x.name, reverse=True)
@@ -418,21 +423,40 @@ def get_reviewers(pr_num):
"""
Gets a candidate list of reviewers that have commented on the PR with '+1' or 'LGTM'
"""
- approval_msgs = ['+1', 'lgtm']
+ reviewers_ids = set()
+ approval_msgs = ['+1', 'lgtm']
pr_comments = get_json('{0}/issues/{1}/comments'.format(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'])
+ approval_review_states = ['approved']
+ pr_reviews = get_json('{0}/pulls/{1}/reviews'.format(GITHUB_API_BASE, pr_num), True)
+ for review in pr_reviews:
+ for approval_state in approval_review_states:
+ if approval_state in review['state'].lower():
+ reviewers_ids.add(review['user']['login'])
+
+ if len(reviewers_ids) == 0:
+ fail("No approvals found in this pull request")
+
+ dir_path = os.path.dirname(os.path.realpath(__file__))
+ with open('{0}/reviewers'.format(dir_path)) as reviewers_data:
+ reviewers = json.load(reviewers_data)
+
reviewers_emails = []
for reviewer_id in reviewers_ids:
- user = get_json('{0}/users/{1}'.format(GITHUB_API_URL, reviewer_id))
username = None
useremail = None
+ if reviewers[reviewer_id] is not None:
+ reviewer = reviewers[reviewer_id]
+ username = reviewer['name']
+ useremail = reviewer['email']
+ reviewers_emails += ['{0} <{1}>'.format(username, useremail)]
+ continue
+ user = get_json('{0}/users/{1}'.format(GITHUB_API_URL, reviewer_id))
if user['email'] is not None:
useremail = user['email'].strip()
else:
http://git-wip-us.apache.org/repos/asf/incubator-distributedlog/blob/0711bc2f/scripts/dev/reviewers
----------------------------------------------------------------------
diff --git a/scripts/dev/reviewers b/scripts/dev/reviewers
new file mode 100644
index 0000000..c1a78e2
--- /dev/null
+++ b/scripts/dev/reviewers
@@ -0,0 +1,18 @@
+{
+ "franckcuny": {
+ "name" : "Franck Cuny",
+ "email" : "fcuny@apache.org"
+ },
+ "leighst": {
+ "name" : "Leigh Stewart",
+ "email" : "lstewart@apache.org"
+ },
+ "mgodave": {
+ "name" : "Dave Rusek",
+ "email" : "drusek@apache.org"
+ },
+ "sijie": {
+ "name" : "Sijie Guo",
+ "email" : "sijie@apache.org"
+ }
+}