f94f9640d0
Previously the auth token could have been split into three separate args in bash which resulted in two bogus requests being sent out for each curl call. These requests had to time out before the real request was made, but without the token. I couldn't find a better way to quickly fix this without adding some duplication.
157 lines
4.9 KiB
Bash
Executable File
157 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -u -e -o pipefail
|
|
|
|
BASEDIR=$(dirname "$0")
|
|
BASEDIR=`(cd $BASEDIR; pwd)`
|
|
|
|
PR_NUMBER=0
|
|
PUSH_UPSTREAM=1
|
|
FORCE=0
|
|
while [[ $# -gt 0 ]]
|
|
do
|
|
key="$1"
|
|
|
|
case $key in
|
|
--dryrun)
|
|
PUSH_UPSTREAM=0
|
|
shift # past argument
|
|
;;
|
|
--force)
|
|
FORCE=1
|
|
shift # past argument
|
|
;;
|
|
*) # unknown option
|
|
PR_NUMBER="$1" # save it in an array for later
|
|
shift # past argument
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$PR_NUMBER" -eq 0 ]; then
|
|
echo "Merge github PR into the target branches if status is green"
|
|
echo
|
|
echo "$0 PR_NUMBER [--dryrun] [--force]"
|
|
echo
|
|
echo --dryrun Performs all operations but does not push the merge back to git@github.com:angular/angular.git.
|
|
echo --force Continues even if PR status is not green.
|
|
exit 0
|
|
fi
|
|
|
|
if [ -z ${TOKEN:-''} ]; then
|
|
echo "############################################################"
|
|
echo "############################################################"
|
|
echo "WARNING: you should set the TOKEN variable to a github token"
|
|
echo "############################################################"
|
|
echo "############################################################"
|
|
GH_AUTH=""
|
|
else
|
|
GH_AUTH="Authorization: token $TOKEN"
|
|
fi
|
|
|
|
PULL_JSON=`curl -H "$GH_AUTH" -s https://api.github.com/repos/angular/angular/pulls/$PR_NUMBER`
|
|
PR_SHA_COUNT=`node $BASEDIR/utils/json_extract.js commits <<< """$PULL_JSON"""`
|
|
STATUS_JSON_URL=`node $BASEDIR/utils/json_extract.js _links.statuses.href <<< """$PULL_JSON"""`
|
|
STATUS=`curl -H "$GH_AUTH" -s $STATUS_JSON_URL | node $BASEDIR/utils/json_extract.js description | cut -d '|' -f1`
|
|
PR_LABELS=`curl -H "$GH_AUTH" -s https://api.github.com/repos/angular/angular/issues/$PR_NUMBER/labels`
|
|
PR_ACTION=`echo "$PR_LABELS" | node $BASEDIR/utils/json_extract.js "name=^PR action:"`
|
|
PR_TARGET=`echo "$PR_LABELS" | node $BASEDIR/utils/json_extract.js "name=^PR target:"`
|
|
PR_CLA=`echo "$PR_LABELS" | node $BASEDIR/utils/json_extract.js "name=^cla"`
|
|
MASTER_BRANCH='master'
|
|
|
|
if [[ ! "$PR_ACTION" =~ "PR action: merge" ]]; then
|
|
echo The PR is missing 'PR action: merge(-assistance)' label, found: $PR_ACTION
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$PR_CLA" != "cla: yes" ]]; then
|
|
echo The PR is missing 'cla: Yes' label, found: $PR_CLA
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$STATUS" != "All checks passed!" ]]; then
|
|
echo PR $PR_NUMBER is failing with: $STATUS
|
|
if [[ $FORCE == 1 ]]; then
|
|
echo FORCING: --force flag used to ignore PR status.
|
|
else
|
|
echo Exting...
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [[ $PR_TARGET == "PR target: master & patch" ]]; then
|
|
MERGE_MASTER=1
|
|
MERGE_PATCH=1
|
|
elif [[ $PR_TARGET == "PR target: master-only" ]]; then
|
|
MERGE_MASTER=1
|
|
MERGE_PATCH=0
|
|
elif [[ $PR_TARGET == "PR target: patch-only" ]]; then
|
|
MERGE_MASTER=0
|
|
MERGE_PATCH=1
|
|
else
|
|
echo "Unknown PR target format: $PR_TARGET"
|
|
exit 1;
|
|
fi
|
|
|
|
CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
|
|
PATCH_BRANCH=`git ls-remote --heads git@github.com:angular/angular.git | grep -E 'refs\/heads\/[0-9]+\.[0-9]+\.x' | cut -d '/' -f3 | sort -r | head -n1`
|
|
|
|
CHECKOUT_MASTER="git checkout merge_pr_master"
|
|
CHECKOUT_PATCH="git checkout merge_pr_patch"
|
|
RESTORE_BRANCH="git checkout $CURRENT_BRANCH"
|
|
|
|
FETCH_PR="git fetch git@github.com:angular/angular.git pull/$PR_NUMBER/head:merge_pr heads/$MASTER_BRANCH:merge_pr_master heads/$PATCH_BRANCH:merge_pr_patch -f"
|
|
BASE_PR="git checkout merge_pr~$PR_SHA_COUNT -B merge_pr_base"
|
|
SQUASH_PR="git rebase --autosquash --interactive merge_pr_base merge_pr"
|
|
REWRITE_MESSAGE="git filter-branch -f --msg-filter \"$BASEDIR/utils/github_closes.js $PR_NUMBER\" merge_pr_base..merge_pr"
|
|
PUSH_BRANCHES="git push git@github.com:angular/angular.git merge_pr_master:$MASTER_BRANCH merge_pr_patch:$PATCH_BRANCH"
|
|
CHERRY_PICK_PR="git cherry-pick merge_pr_base..merge_pr"
|
|
|
|
echo "======================"
|
|
echo "GitHub Merge PR Steps"
|
|
echo "======================"
|
|
echo " $FETCH_PR"
|
|
echo " $BASE_PR"
|
|
echo " $SQUASH_PR"
|
|
echo " $REWRITE_MESSAGE"
|
|
if [[ $MERGE_MASTER == 1 ]]; then
|
|
echo " $CHECKOUT_MASTER && $CHERRY_PICK_PR"
|
|
fi
|
|
if [[ $MERGE_PATCH == 1 ]]; then
|
|
echo " $CHECKOUT_PATCH && $CHERRY_PICK_PR"
|
|
fi
|
|
echo " $PUSH_BRANCHES"
|
|
echo " $RESTORE_BRANCH"
|
|
echo "----------------------"
|
|
echo ">>> Fetch PR: $FETCH_PR"
|
|
$FETCH_PR
|
|
echo ">>> Mark base: $BASE_PR"
|
|
$BASE_PR
|
|
echo ">>> Autosquash: $SQUASH_PR"
|
|
GIT_EDITOR=echo $SQUASH_PR
|
|
echo ">>> Rewrite message: $REWRITE_MESSAGE"
|
|
# Next line should work, but it errors, hence copy paste the command.
|
|
# $REWRITE_MESSAGE
|
|
git filter-branch -f --msg-filter "$BASEDIR/utils/github_closes.js $PR_NUMBER" merge_pr_base..merge_pr
|
|
if [[ $MERGE_MASTER == 1 ]]; then
|
|
echo
|
|
echo ">>> Cherry pick to master: $CHECKOUT_MASTER && $CHERRY_PICK_PR"
|
|
$CHECKOUT_MASTER
|
|
$CHERRY_PICK_PR
|
|
fi
|
|
if [[ $MERGE_PATCH == 1 ]]; then
|
|
echo
|
|
echo ">>> Cherry pick to path: $CHECKOUT_PATCH && $CHERRY_PICK_PR"
|
|
$CHECKOUT_PATCH
|
|
$CHERRY_PICK_PR
|
|
fi
|
|
$RESTORE_BRANCH
|
|
|
|
if [[ $PUSH_UPSTREAM == 1 ]]; then
|
|
echo ">>> Push branches to angular repo"
|
|
$PUSH_BRANCHES
|
|
fi
|
|
echo
|
|
echo ">>>>>> SUCCESS <<<<<< PR#$PR_NUMBER merged."
|
|
|