#!/usr/bin/env bash # # Echo and exit # abort() { echo >&2 "$@" exit 1 } # # Produce json with , <body>, <head> and <base> # json() { local title="${1//\"/\\\"}" local body="${2//\"/\\\"}" local head="${3//\"/\\\"}" local base="${4//\"/\\\"}" cat <<EOF { "title": "$title", "body": "$body", "head": "$head", "base": "$base" } EOF } # personal access token # config name is github-personal-access-token '_' is not allowed in git config github_personal_access_token=$(git config git-extras.github-personal-access-token) test -z "$github_personal_access_token" && abort "git config git-extras.github-personal-access-token required" # branch branch=${1-$(git symbolic-ref HEAD | sed 's/refs\/heads\///')} remote=$(git config branch."$branch".remote) if [ -z "$remote" ]; then echo 'no upstream found, push to origin as default' remote="origin" fi [ "$remote" == "." ] && abort "the upstream should be a remote branch." # make sure it's pushed git push "$remote" "$branch" || abort "failed to push $branch" remote_url=$(git config remote."$remote".url) if [[ "$remote_url" == git@* ]]; then project=${remote_url##*:} else project=${remote_url#https://*/} fi project=${project%.git} # prompt echo echo " create pull-request for $project '$branch'" echo printf " title: " && read -r title printf " body: " && read -r body printf " base [%s]: " "$(git_extra_default_branch)" && read -r base printf " GitHub two-factor authentication code (leave blank if not set up): " && read -r mfa_code echo # create pull request if [ -z "$base" ] then base="master" fi body=$(json "$title" "$body" "$branch" "$base") curl \ -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token $github_personal_access_token" \ -H "X-GitHub-OTP: $mfa_code" \ "https://api.github.com/repos/$project/pulls" -d "$body"