Skip to content

Instantly share code, notes, and snippets.

@jakub-g
Last active February 22, 2017 05:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jakub-g/88aca8a7cb63c731b0c6 to your computer and use it in GitHub Desktop.
Save jakub-g/88aca8a7cb63c731b0c6 to your computer and use it in GitHub Desktop.
Open Atlassian Stash pull request from command line (open browser at the right URL)
#!/bin/bash
##################################################################
# Open Atlassian Stash pull request from command line.
# (opens the default browser at the proper URL with data prefilled)
#
# It infers current branch name, repo name, current user name, from git config.
############################### CONFIG ###########################
URL_PREFIX="http://stash.yourcompany.com"
# ~!!!!!! no commas between the items !!!!!!
# this is the list of target branches for PRs; presence here implies being a forbidden input branch
AVAILABLE_TARGET_BRANCHES=("releases/master" "releases/1.4.0" "releases/1.5.0")
# additional forbidden input branches, other than the available target branches
ADDITIONAL_FORBIDDEN_INPUT_BRANCHES=("master")
##################################################################
SCRIPTNAME="pullrequest" # $0
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
echo "Usage:"
echo "$SCRIPTNAME does 'git push -f' and opens the pull request on Stash"
echo "$SCRIPTNAME --no-push opens the pull request on Stash without pushing"
echo "$SCRIPTNAME --help prints this help page"
exit
fi
DO_PUSH=true
if [ "$1" == "--no-push" ] ; then
DO_PUSH=false
fi
# figure out the name of the current branch
CURRENT_BRANCH_NAME=$( git rev-parse --abbrev-ref HEAD )
if [ "$CURRENT_BRANCH_NAME" == "HEAD" ]; then
echo "You are not currently in a branch. Please checkout a branch."
exit 1
fi
# prevent users from opening pull requests from "releases/1.4.0" etc.
for forbiddenInputBranch in "${AVAILABLE_TARGET_BRANCHES[@]}" "${ADDITIONAL_FORBIDDEN_INPUT_BRANCHES[@]}"
do
if [ "$forbiddenInputBranch" == "$CURRENT_BRANCH_NAME" ] ; then
echo "Please don't open pull requests directly from '${CURRENT_BRANCH_NAME}'; this breaks Stash automatic branch mirroring!"
echo "Please create a feature branch instead!"
exit 1
fi
done
if [ "$DO_PUSH" = true ] ; then
echo "Pushing to your remote git repo..."
git push -u -f origin ${CURRENT_BRANCH_NAME}
returnCode=$?
if [ "$returnCode" -ne "0" ] ; then
exit
fi
echo -e "\n=====================================================================================================\n"
fi
# figure out the user based on git remote settings value; taking advantage of "/~USER/" substring in Atlassian Stash URLs
USER_NAME=$( git config --get remote.origin.url | perl -l -ne '/\/~([^\/]+)\// && print $1' )
# figure out the repo name: substring after last "/", stripped from ".git"
REPO_NAME=$( git config --get remote.origin.url | sed 's/.*\///' | sed 's/.git//' )
echo "Opening pull request from '${USER_NAME}/${CURRENT_BRANCH_NAME}' to '${REPO_NAME}'..."
if [ "$DO_PUSH" = false ] ; then
echo "(make sure you pushed to the branch before!)"
fi
echo ""
NUM_OF_AVAILABLE_BRANCHES="${#AVAILABLE_TARGET_BRANCHES[@]}"
if [ "${NUM_OF_AVAILABLE_BRANCHES}" == "1" ] ; then
TARGET_BRANCH="${AVAILABLE_TARGET_BRANCHES[0]}"
else
# select destination branch from the list
echo "Select the destination branch of the pull request:"
PS3='Type the number: '
select TARGET_BRANCH in "${AVAILABLE_TARGET_BRANCHES[@]}"
do
goodBranchChosen=false
for availableBranch in "${AVAILABLE_TARGET_BRANCHES[@]}"
do
if [ "$TARGET_BRANCH" == "$availableBranch" ] ; then
goodBranchChosen=true
break # break for
fi
done
if [ "$goodBranchChosen" = false ] ; then
echo "Invalid option chosen, select a number from the list"
else
break # break select
fi
done
fi
# finalize: create the URL and open it
URL_BASE="/git/users/${USER_NAME}/repos/${REPO_NAME}/pull-requests"
URL_PARAMS="?create&targetBranch=refs%2Fheads%2F${TARGET_BRANCH}&sourceBranch=refs%2Fheads%2F${CURRENT_BRANCH_NAME}"
URL_VIEW=${URL_PREFIX}${URL_BASE}
URL_OPEN=${URL_VIEW}${URL_PARAMS}
# echo $URL
# note: if using start you have to put dummy first param, or escape & with ^, hence it's better to use explorer
# we are opening two URLs in a quick succession, this is a hack because first time Stash is opened it performs
# some authentication which does a redirection at the end, which loses the query string...
explorer "$URL_VIEW"
sleep 1
explorer "$URL_OPEN"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment