Sun, 08 Jun 2014 23:26:40 +0300
- 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