blob: 4ae4f15d87a3b44e730c6e5944f458e10bcb3b67 [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Always use on a separate merge-only repo!
# Best used with a wrapper script in your PATH
# #!/bin/bash
# export USERNAME=<github username>
# export PERSONAL_TOKEN=<github personal token from https://github.com/settings/tokens>
# <absolute path to brooklyn-dist>/scripts/am $@
set -e
PR=$1
BRANCH=${2:-master}
: ${PR_REMOTE:=upstream}
: ${APACHE_REMOTE:=apache}
: ${CLOSES_MESSAGE:="Closes #"}
# Includes a fallback for git versions earlier than 2.7.0
REMOTE_URL=$(git remote get-url ${APACHE_REMOTE} || git remote show apache | grep "Push URL");
MODULE=${REMOTE_URL##*/}
if [ -z "$PR" ]; then
echo "Usage: am <PR number> [ branch-name ]"
echo "Supply branch-name if you are merging onto a branch that is not master"
exit 1
fi
if ! git branch | grep -q "* ${BRANCH}"; then
echo "Must be on ${BRANCH} branch"
exit 1
fi
if [ -z "$USERNAME" ] || [ -z "$PERSONAL_TOKEN" ]; then
echo "Anonymous requests to Github are subject to rate limiting - 60 unauthenticated requests per hour per ip (https://developer.github.com/v3/#rate-limiting)"
echo "Pass USERNAME and PERSONAL_TOKEN environment variables to authenticate. PERSONAL_TOKEN can be created at https://github.com/settings/tokens"
fi
function get_pr_message {
local TMP_JSON=${TMPDIR:-/tmp}/pr-${PR}.$$.json
local URL=https://api.github.com/repos/apache/${MODULE}/pulls/$PR
if [ -n "$USERNAME" ] && [ -n "$PERSONAL_TOKEN" ]; then
AUTH="-u ${USERNAME}:${PERSONAL_TOKEN}"
fi
curl ${AUTH} --fail -sH "Accept: application/vnd.github.v3+json" -o ${TMP_JSON} ${URL}
if [ $? -ne 0 ]; then
echo "Couldn't fetch PR ${PR} details from ${URL}" >&2
cat ${TMP_JSON} >&2
exit 1
fi
cat ${TMP_JSON} |
PYTHONIOENCODING=utf-8 python -c 'import json,sys; resp=json.load(sys.stdin); print resp["title"];print "";print resp["body"]'
rm -f ${TMP_JSON}
}
PR_MESSAGE=$(get_pr_message)
if [ -z "$MESSAGE" ]; then
MESSAGE="${CLOSES_MESSAGE//#/#${PR}}
${PR_MESSAGE}"
fi
# Fetch fresh PR references
git fetch ${PR_REMOTE}
git fetch ${APACHE_REMOTE}
# Makes sure we are on the latest upstream/${BRANCH}
# TODO Warn or fail if there are extra local commits? Could be committed by mistake or just a previous PR merge.
git merge ${APACHE_REMOTE}/${BRANCH} --ff-only
echo
echo "Merge commit message"
echo "=================================="
echo "$MESSAGE"
echo "=================================="
echo
# Do the merge
git merge --no-ff -m "${MESSAGE}" ${PR_REMOTE}/pr/${PR}
echo "Type 'git push ${APACHE_REMOTE} ${BRANCH}' to complete the merge."