aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcontrib/devtools/github-merge.py34
1 files changed, 22 insertions, 12 deletions
diff --git a/contrib/devtools/github-merge.py b/contrib/devtools/github-merge.py
index 9a62fccbbb..f82362fe41 100755
--- a/contrib/devtools/github-merge.py
+++ b/contrib/devtools/github-merge.py
@@ -47,9 +47,9 @@ def git_config_get(option, default=None):
except subprocess.CalledProcessError as e:
return default
-def retrieve_pr_title(repo,pull):
+def retrieve_pr_info(repo,pull):
'''
- Retrieve pull request title from github.
+ Retrieve pull request information from github.
Return None if no title can be found, or an error happens.
'''
try:
@@ -57,9 +57,9 @@ def retrieve_pr_title(repo,pull):
result = urlopen(req)
reader = codecs.getreader('utf-8')
obj = json.load(reader(result))
- return obj['title']
+ return obj
except Exception as e:
- print('Warning: unable to retrieve pull title from github: %s' % e)
+ print('Warning: unable to retrieve pull information from github: %s' % e)
return None
def ask_prompt(text):
@@ -69,13 +69,13 @@ def ask_prompt(text):
print("",file=stderr)
return reply
-def parse_arguments(branch):
+def parse_arguments():
epilog = '''
In addition, you can set the following git configuration variables:
githubmerge.repository (mandatory),
user.signingkey (mandatory),
githubmerge.host (default: git@github.com),
- githubmerge.branch (default: master),
+ githubmerge.branch (no default),
githubmerge.testcmd (default: none).
'''
parser = argparse.ArgumentParser(description='Utility to merge, sign and push github pull requests',
@@ -83,14 +83,14 @@ def parse_arguments(branch):
parser.add_argument('pull', metavar='PULL', type=int, nargs=1,
help='Pull request ID to merge')
parser.add_argument('branch', metavar='BRANCH', type=str, nargs='?',
- default=branch, help='Branch to merge against (default: '+branch+')')
+ default=None, help='Branch to merge against (default: githubmerge.branch setting, or base branch for pull, or \'master\')')
return parser.parse_args()
def main():
# Extract settings from git repo
repo = git_config_get('githubmerge.repository')
host = git_config_get('githubmerge.host','git@github.com')
- branch = git_config_get('githubmerge.branch','master')
+ opt_branch = git_config_get('githubmerge.branch',None)
testcmd = git_config_get('githubmerge.testcmd')
signingkey = git_config_get('user.signingkey')
if repo is None:
@@ -105,9 +105,20 @@ def main():
host_repo = host+":"+repo # shortcut for push/pull target
# Extract settings from command line
- args = parse_arguments(branch)
+ args = parse_arguments()
pull = str(args.pull[0])
- branch = args.branch
+
+ # Receive pull information from github
+ info = retrieve_pr_info(repo,pull)
+ if info is None:
+ exit(1)
+ title = info['title']
+ # precedence order for destination branch argument:
+ # - command line argument
+ # - githubmerge.branch setting
+ # - base branch for pull (as retrieved from github)
+ # - 'master'
+ branch = args.branch or opt_branch or info['base']['ref'] or 'master'
# Initialize source branches
head_branch = 'pull/'+pull+'/head'
@@ -147,7 +158,6 @@ def main():
try:
# Create unsigned merge commit.
- title = retrieve_pr_title(repo,pull)
if title:
firstline = 'Merge #%s: %s' % (pull,title)
else:
@@ -165,7 +175,7 @@ def main():
print("ERROR: Creating merge failed (already merged?).",file=stderr)
exit(4)
- print('%s#%s%s %s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title))
+ print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET))
subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch])
print()
# Run test command if configured.