From fef6afab8478b04553503cf55452c85b8f333f2f Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 4 Feb 2018 13:39:15 +0100 Subject: [PATCH] github-apply.sh: add script to rebase, merge and close Github pull requests Signed-off-by: Jo-Philipp Wich --- github-apply.sh | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 github-apply.sh diff --git a/github-apply.sh b/github-apply.sh new file mode 100755 index 0000000..72916ce --- /dev/null +++ b/github-apply.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +# Github repository, just the name/repo part, no .git suffix, no base url! +REPO="openwrt/openwrt" + +# Your repository token, generate this token at your profile page: +# - Navigate to https://github.com/settings/tokens +# - Click on "Generate new token" +# - Enter a description, e.g. "pr.sh" and pick the "repo" scope +# - Hit "Generate token" +#TOKEN="d41d8cd98f00b204e9800998ecf8427e" + +# Default close comment +COMMENT="Pulled into my staging tree at https://git.openwrt.org/openwrt/staging/$(whoami).git" + +PRID="$1" +BRANCH="${2:-master}" + +if [ -z "$PRID" -o -n "${PRID//[0-9]*/}" ]; then + echo "Usage: $0 [rebase-branch]" >&2 + exit 1 +fi + +if [ -z "$(git branch --list "$BRANCH")" ]; then + echo "Given rebase branch '$BRANCH' does not exist!" >&2 + exit 2 +fi + +if ! git fetch "https://github.com/$REPO.git" "pull/$PRID/head:PR$PRID"; then + echo "Failed fetch PR #$PRID!" >&2 + exit 3 +fi + +git checkout "PR$PRID" + +if ! git rebase "$BRANCH"; then + echo "" >&2 + echo "Cannot automatically rebase 'PR$PRID' onto '$BRANCH'!" >&2 + echo "Fix conflicts manually and continue with:" >&2 + echo "" >&2 + echo " git checkout $BRANCH" >&2 + echo " git merge --ff-only PR$PRID" >&2 + echo " git branch -D PR$PRID" >&2 + echo "" >&2 + echo "Alternatively cancel the whole operation with:" >&2 + echo "" >&2 + echo " git rebase --abort" >&2 + echo " git checkout $BRANCH" >&2 + echo " git branch -D PR$PRID" >&2 + echo "" >&2 +fi + +git checkout "$BRANCH" + +oldhead="$(git log -1 --format="%H")" + +if ! git merge --ff-only "PR$PRID"; then + echo "" >&2 + echo "Failed to fast-forward merge 'PR$PRID' into '$BRANCH'!" >&2 + echo "Aborting, but leaving branch 'PR$PRID' behind." >&2 + exit 5 +fi + +git branch -D "PR$PRID" + +if [ -n "$TOKEN" ]; then + echo "" + echo "Enter a comment and hit to close the PR at Github automatically now." + echo "Hit - to exit." + echo "" + echo "If you do not provide a comment, the default will be: " + echo "[$COMMENT]" + + echo -n "Comment > " + read usercomment + + echo "Closing PR..." + + comment="${usercomment:-$COMMENT}" + comment="${comment//\\/\\\\}" + comment="${comment//\"/\\\"}" + comment="$(printf '{"body":"%s"}' "$comment")" + + if ! curl -s -o /dev/null -w "%{http_code} %{url_effective}\\n" --user "$TOKEN:x-oauth-basic" --request POST --data "$comment" "https://api.github.com/repos/$REPO/issues/$PRID/comments" || \ + ! curl -s -o /dev/null -w "%{http_code} %{url_effective}\\n" --user "$TOKEN:x-oauth-basic" --request PATCH --data '{"state":"closed"}' "https://api.github.com/repos/$REPO/pulls/$PRID" + then + echo "" >&2 + echo "Something failed while trying to close the PR via " >&2 + echo "the Github API, please review the state manually at " >&2 + echo "https://github.com/$REPO/pull/$PRID" >&2 + exit 6 + fi +fi + +echo "" +echo "The PR has been merged!" +echo "Consider pushing your '$BRANCH' branch to its remote now." + +exit 0 -- 2.30.2