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 "############################################################"
 | 
						|
    GHCURL="curl"
 | 
						|
else
 | 
						|
    GHCURL="curl -H \"Authorization: token $TOKEN\""
 | 
						|
fi
 | 
						|
 | 
						|
PULL_JSON=`$GHCURL -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=`$GHCURL -s $STATUS_JSON_URL | node $BASEDIR/utils/json_extract.js description | cut -d '|' -f1`
 | 
						|
PR_LABELS=`$GHCURL -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 ignor 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: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 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."
 | 
						|
 |