Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Bash alias for generating GitHub Pull Requests
# Bash alias to generate pull requests on github.com
#
# PreRequisites:
# Create an auth token (bypasses 2 factor auth, when enabled):
# https://github.com/settings/tokens/new
#
# Use any name, something like 'pull requests' makes sense.
# Allow permissions 'repo' and 'public repo'.
# Create.
#
# Store the auth token:
# echo "export GITHUB_PR_TOKEN=<token>" >> ~/.bashrc
#
#
# Use:
# `pr`
#
# pr will attempt a regex capture on the branch name to determine a
# target issue for the pull request. You can override with a `read`
# prompt.
#
# The 'head' branch is your current branch.
#
# The 'base' branch is 'master'.
#
#
# Known issues:
# - Titled and bodied pull requests are not supported.
# - Issue candidate is not confirmed (weird results if you create a PR for
# closed issues).
# - Branch is not confirmed on origin, missing 'head' branch on origin
# causes the PR to fail.
#
#
function pr {
gh_root="https://api.github.com"
gh_base="master"
[ -z "$GITHUB_PR_TOKEN" ] && echo 'pr requires the $GITHUB_PR_TOKEN variable.' && return
#[ -z "$1" ] && echo "pr requires an issue number." && return
repoTest=$(git config --list | grep 'remote\.origin\.url' | grep 'github\.com' | awk -F ":" '{print $2}')
[ -z "$repoTest" ] && echo "This doesn't seem like a github repository." && return
cur=$(git rev-parse --abbrev-ref HEAD)
userRepo=${repoTest/.git/}
user=${userRepo%/*}
repo=${userRepo#*/}
# Try to retrieve the issue from the current branch name. Captures any digits.
issueRegex='([a-zA-Z_/-]+)?([0-9]+)([a-zA-Z_/-]+)?'
[[ $cur =~ $issueRegex ]] && issue="${BASH_REMATCH[2]}"
echo -n "Provide an issue for $cur or press Enter to use [$issue]: "
read userIssue
#TODO validate that the issue is valid ?
#TODO validate that the branch is pushed to origin ?
postdata="{\"issue\":\"${userIssue:-$issue}\",\"head\":\"$cur\",\"base\":\"$gh_base\"}"
#TODO trap/redirect the curl output
curl -u $GITHUB_PR_TOKEN:x-oauth-basic -d $postdata "$gh_root/repos/$user/$repo/pulls"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment