Skip to content

Instantly share code, notes, and snippets.

@spmason
Last active July 15, 2022 10:54
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spmason/7889198 to your computer and use it in GitHub Desktop.
Save spmason/7889198 to your computer and use it in GitHub Desktop.
GitHub "open PR" script. Add somewhere in your path, then opening a PR is as easy as typing `pr` on the branch you want to open a PR for
#!/usr/bin/env bash
# GitHub "Open Pull Request" script
#
# Add somewhere in your path, then opening a PR is as easy as typing `pr` while you're
# on the branch you want to open a Pull Request for
#
# NOTES:
# - Uses the `hub` tool: https://cli.github.com/
# - Assumes that the upstream repository is called 'origin' and your fork is named after your github username
# (this is how `hub clone` and then `hub fork` should set things up)
PUSH_ARGS=""
SHOW_BROWSER=1
LOCAL_BRANCH=$(git branch | grep ^\* | sed 's/^* //')
BOX=$(uname -s)
USERNAME=$(gh api user --jq .login)
MERGE_BRANCH=$(gh repo view --json defaultBranchRef --jq .defaultBranchRef.name)
while test $# -gt 0
do
case "$1" in
--force) PUSH_ARGS="--force-with-lease"
;;
-f) PUSH_ARGS="--force-with-lease"
;;
--no-browser) SHOW_BROWSER=0
;;
-n) SHOW_BROWSER=0
;;
*) MERGE_BRANCH=$1
;;
esac
shift
done
REMOTE=$USERNAME
if ! git remote | grep $USERNAME 1> /dev/null; then
echo "No remote $USERNAME found. Pushing to origin"
REMOTE=origin
fi
git push ${REMOTE} ${LOCAL_BRANCH} ${PUSH_ARGS}
if ! gh pr view ${REMOTE}:${LOCAL_BRANCH} --json url --jq .url &> /dev/null; then
if [[ $SHOW_BROWSER == 1 ]]; then
# Open browser to create new PR
HEAD="${REMOTE}:${LOCAL_BRANCH}"
if [[ "${REMOTE}" = "origin" ]]; then
echo "Remote is ${REMOTE}"
HEAD="${LOCAL_BRANCH}"
fi
gh pr create --web --head "$HEAD"
fi
elif [[ $SHOW_BROWSER == 1 ]]; then
# Show existing PR
gh pr view ${REMOTE}:${LOCAL_BRANCH} --web
else
# Just output the PR URL
gh pr view ${REMOTE}:${LOCAL_BRANCH} --json url --jq .url
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment