pull-request.sh

Sun, 08 Jun 2014 23:26:40 +0300

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Sun, 08 Jun 2014 23:26:40 +0300
changeset 6
b7f23f86cb2c
parent 5
9d63b4f82112
child 7
7dbc04a61376
permissions
-rwxr-xr-x

- merge

#!/bin/bash
hg log -r tip >/dev/null || exit 1

if [ -z "$(which curl)" ]
then
	echo "no curl installed" >/dev/stderr
	exit 1
fi

# Get path to this script
pushd $(dirname $0) >/dev/null
	selfpath=$(dirname $(readlink $0))
popd >/dev/null

# What's the upstream?
# TODO: can this be dynamically retrieved from bitbucket?
upstream=$(hg paths upstream |rev |cut -d '/' -f 1,2 |rev)

if [ -z "$upstream" ]
then
	echo "cannot find upstream! Please set the 'upstream' path in .hg/hgrc" >/dev/stderr
	exit 1
fi

echo "upstream is $upstream"

# Get all heads and filter merges out since we don't generally want to post
# pull requests for those.
allheads=$(hg heads --template '{node}@{parents}\n' |sed 's@ @#@g')
i=0

for head in $allheads
do
	if [ "$(echo $head |sed 's@#@ @g' |wc -w)" -le "1" ]
	then
		heads="${heads}$(echo $head |cut -f 1 -d '@') "
	fi
done

if [ -z "$heads" ]
then
	echo "No non-merge heads. Nothing to do."
	exit 0
fi

numheads=$(echo $heads |wc -w)

# Ask the user which head to request pull of. We do this even if there is just
# one head, to give the user a chance to review exactly what is being submitted.
echo "There are $numheads non-merge heads:"

for head in $heads
do
	let i+=1
	bookmarksblurb=""
	tmpfile=$(tempfile)
	hg log -r $head --template '{bookmarks}\n{desc}\n' >$tmpfile
	bookmarks=$(head -n1 $tmpfile)
	title=$(tail -n1 $tmpfile)
	rm $tmpfile

	if [ -n "$bookmarks" ]
	then
		bookmarksblurb=" [${bookmarks}]"
	fi

	echo "[${i}] $(echo $head |head -c 8)${bookmarksblurb}: $title"
done

head_index=-1
while [ "$head_index" -le "0" -o "$head_index" -gt "$numheads" ]
do
	echo -n "Which head? "
	read head_index
done

# Data for the pull request
head=$(echo $heads |cut -d ' ' -f $head_index)
title=$(hg log -r ${head} -r tip --template '{desc}')
source_repo=$(hg paths default |rev |cut -d '/' -f 1,2 |rev)
bturl=$(grep bturl $selfpath/settings.cfg |cut -d ' ' -f 2)
btuser=$(grep btuser $selfpath/settings.cfg |cut -d ' ' -f 2)
btpass=$(grep btpass $selfpath/settings.cfg |cut -d ' ' -f 2)
ticket=$(hg log -r $head --template '{bookmarks}' |cut -f 2 -d '|')

while [ "$(echo $title |wc -c)" -gt "255" ]
do
	echo "Pull request title is too long, please input a new title"
	echo -n "new title: "
	read title
done

echo "Requesting pull of $head"

# Get the JSON template and fill in the values
json=$(cat $selfpath/pullrequest_template.json \
	|sed "s@{{TITLE}}@${title}@" \
	|sed "s@{{SOURCE_REPO}}@${source_repo}@" \
	|sed "s@{{HEAD}}@${head}@")

# Get bitbucket credentials
echo -n "Username: "
read username
echo -n "Password: "
read -s password
echo

response=$(tempfile)

# Post the pull request.
curl \
	-X POST \
	-H "Content-Type: application/json" \
	-u "${username}:${password}" \
	-d "$json" \
	-o "$response" \
	"https://api.bitbucket.org/2.0/repositories/${upstream}/pullrequests" \
	>/dev/stdout 2>&1

mercurial