Skip to content

Instantly share code, notes, and snippets.

@gatlin
Forked from Fuuzetsu/hackagedocs
Last active September 30, 2015 16:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gatlin/1d37e42fec07b6279ea2 to your computer and use it in GitHub Desktop.
Save gatlin/1d37e42fec07b6279ea2 to your computer and use it in GitHub Desktop.
Script for generating and uploading missing documentation for your Hackage packages. Now with fixed package links and contents page.
#!/usr/bin/env bash
###
# hdoc
# (c) Gatlin Johnson <gatlin@niltag.net>
#
###########
# Available under the following license:
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# Version 2, December 2004
#
# Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
#
# Everyone is permitted to copy and distribute verbatim or modified
# copies of this license document, and changing it is allowed as long
# as the name is changed.
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
# 0. You just DO WHAT THE FUCK YOU WANT TO.
###########
# Much of this code is stolen from:
#
# https://github.com/ekmett/lens/blob/master/scripts/hackage-docs.sh
#
# and
#
# https://gist.github.com/Fuuzetsu/8276421
#
# so, you know, big shout out to them.
#
# Usage: hdoc [pkg] [ver] [hackage_username]
#
# All arguments are optional and will be auto-detected
###
# make sure we are in fact in a cabal package directory
cabal_file=$(find . -maxdepth 1 -name "*.cabal" -print -quit)
if [ ! -f "$cabal_file" ];
then
echo "Run this script in a top level Haskell package directory."
exit 1
fi
# acquire package name
if [ -z ${1+x} ];
then
pkg=$(awk -F ":[[:space:]]*" 'tolower($1)=="name" { print $2 }' < "$cabal_file")
echo "Detected package: $pkg"
else
pkg=${1}
fi
# acquire package version
if [ -z ${2+x} ];
then
ver=$(awk -F ":[[:space:]]*" 'tolower($1)=="version" { print $2 }' < "$cabal_file")
echo "Detected version: $ver"
else
ver=${2}
fi
# acquire hackage username
if [ -z ${3+x} ];
then
read -p "Hackage username: " user
else
user=${3}
fi
# acquire hackage password
echo -n Hackage Password:
read -s password
echo ""
# Figure out which haddock flag to use for hyperlinked source
if haddock --hyperlinked-source >/dev/null
then
HYPERLINK_FLAG="--haddock-option=--hyperlinked-source"
else
HYPERLINK_FLAG="--hyperlink-source"
fi
# check for hscolour
ghc-pkg list 2>/dev/null | grep hscolour >/dev/null
HSCOLOUR=$?
if [ ! "${HSCOLOUR}" -eq "0" ];
then
echo "Please install HsColour and try again."
exit 1
fi
# build the package documentation
cabal configure
cabal build
cabal haddock $HYPERLINK_FLAG \
--html-location='/package/$pkg-$version/docs' \
--contents-location='/package/$pkg-$version'
S=$?
# on successful build, upload to hackage
if [ "${S}" -eq "0" ]; then
cd "dist/doc/html"
DDIR="${pkg}-${ver}-docs"
cp -r "${pkg}" "${DDIR}" && tar -c -v -z --format=ustar -f "${DDIR}.tar.gz" "${DDIR}"
CS=$?
if [ "${CS}" -eq "0" ]; then
echo "Uploading to Hackage…"
curl -X PUT -H 'Content-Type: application/x-tar' \
-H 'Content-Encoding: gzip' \
--data-binary "@${DDIR}.tar.gz" \
"https://${user}:${password}@hackage.haskell.org/package/${pkg}-${ver}/docs"
exit $?
else
echo "Error when packaging the documentation"
exit $CS
fi
else
echo "Error when trying to build the package."
exit $S
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment