The Haskell community has built up a great resource: the Hackage Haskell package database, where we recently hit the 500-package mark!

One of those 500 packages was mine, I added another to their number just an hour ago, and I’ve got two more in the oven. Given, then, that I’m starting to maintain a few packages, I went to the trouble of automating the Hackage release process, and in this post I’m going to briefly walk through setting up this automated environment.

1. Install cabal-upload from Hackage. I’m afraid that at the time of writing this is not perfectly simple because it won’t build with GHC 6.8 or above: this can be fixed with a new .cabal file, however, which I’ve made available here. (Edit: I’ve just noticed that this functionality seems to have been added to Cabal itself! You may just be able to use cabal upload. However, I’m not sure what the right config file location is for the next step).

3. Copy the following shell script into a file called release in the root of your project (the same directory as the Setup.lhs file):

#!/bin/bash
#

echo "Have you updated the version number? Type 'yes' if you have!"

if [ "$version_response" != "yes" ]; then echo "Go and update the version number" exit 1 fi sdist_output=runghc Setup.lhs sdist if [ "$?" != "0" ]; then
echo "Cabal sdist failed, aborting"
exit 1
fi

# Want to find a line like:
# Source tarball created: dist/ansi-terminal-0.1.tar.gz

# Test this with:
# runghc Setup.lhs sdist | grep ...
filename=echo $sdist_output | sed 's/.*Source tarball created: $$[^ ]*$$.*/\1/' echo "Filename:$filename"

if [ "$filename" = "$sdist_output" ]; then
echo "Could not find filename, aborting"
exit 1
fi

# Test this with:
# echo dist/ansi-terminal-0.1.tar.gz | sed ...
version=echo $filename | sed 's/^[^0-9]*$$[0-9\.]*$$.tar.gz$/\1/'
echo "Version: $version" if [ "$version" = "$filename" ]; then echo "Could not find version, aborting" exit 1 fi echo "This is your last chance to abort! I'm going to upload in 10 seconds" sleep 10 git tag "v$version"

if [ "$?" != "0" ]; then echo "Git tag failed, aborting" exit 1 fi # You need to have stored your Hackage username and password as directed by cabal-upload # I use -v5 because otherwise the error messages can be cryptic :-) cabal-upload -v5$filename

if [ "\$?" != "0" ]; then