Igor Minar f94f9640d0 ci: correctly encode quoted params passed as params to curl
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.
2018-07-30 16:46:11 -07:00

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."