-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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