Skip to content

Instantly share code, notes, and snippets.

@fizruk
Created August 6, 2016 16:22
Show Gist options
  • Save fizruk/0517907243add27c463c004584c9016b to your computer and use it in GitHub Desktop.
Save fizruk/0517907243add27c463c004584c9016b to your computer and use it in GitHub Desktop.
Build and upload haddocks for multi-package Stack project to custom server.
#!/bin/bash
set -e
# Run this script from top-level multi-package Stack project.
# It will build haddock documentation for every package and
# upload it over SSH to $SERVER:$SERVER_HADDOCK_PATH
# Script accepts 2 arguments: BRANCH and HADDOCK_PATH
# HADDOCK_PATH is where haddocks are served.
# BRANCH is an extra tag for this particular docs, I usually use Git branch.
# Example:
#
# [email protected]
# SERVER_HADDOCK_PATH=/opt/my-project/haddock
# BRANCH=master
# HADDOCK_PATH=/docs
#
# This will result in uploading docs to [email protected]:/opt/my-project/haddock/master
# Haddock should be available at http://example.com/docs/master
# IMPORTANT: serve this documentation under HTTPS and with some sort of authorization enabled!
# Otherwise you will effectively expose your private project's source code!
# This a fork of https://github.com/phadej/binary-orphans/blob/master/hackage-docs.sh
# adapted for multi-package Stack projects and with upload to custom server
# where to upload
[email protected]
SERVER_HADDOCK_PATH=/opt/my-project/haddock
if [ "$#" -ne 2 ]; then
echo "Usage: scripts/upload-haddocks.sh BRANCH HADDOCK_PATH"
exit 1
fi
branch=$1
haddock_path=$2
stack_file=$(find . -maxdepth 1 -name "stack.yaml" -print -quit)
if [ ! -f "$stack_file" ]; then
echo "stack.yaml not found, please run from top-level directory of a multi-package Stack project"
exit 1
fi
set -x
stack_dir=`pwd`
dir=$stack_dir/$(mktemp -d build-docs.XXXXXX)
trap 'rm -r "$dir"' EXIT
# Cabal dist in temporary location
builddir=$dir/dist
export PATH=$(stack path --bin-path)
ghc --version
cabal --version
stack --version
for package in `find . -maxdepth 1 -type d -name "*"`
do
cd "$stack_dir/$package"
cabal_file=$(find . -maxdepth 1 -name "*.cabal" -print -quit)
if [ ! -f "$cabal_file" ]; then
continue
fi
pkg=$(awk -F ":[[:space:]]*" 'tolower($1)=="name" { print $2 }' < "$cabal_file")
ver=$(awk -F ":[[:space:]]*" 'tolower($1)=="version" { print $2 }' < "$cabal_file")
if [ -z "$pkg" ]; then
echo "Unable to determine package name"
continue
fi
if [ -z "$ver" ]; then
echo "Unable to determine package version"
continue
fi
echo "Detected package: $pkg-$ver"
if haddock --hyperlinked-source >/dev/null
then
echo "Using fancy hyperlinked source"
HYPERLINK_FLAG="--haddock-option=--hyperlinked-source"
else
echo "Using boring hyperlinked source"
HYPERLINK_FLAG="--hyperlink-source"
fi
# Build dependencies haddocks with stack, so we get links
#stack haddock --only-dependencies $pkg
# Configure using stack databases
snapshotpkgdb=$(stack path --snapshot-pkg-db)
localpkgdb=$(stack path --local-pkg-db)
cabal configure -v2 --builddir=$builddir --package-db=clear --package-db=global --package-db=$snapshotpkgdb --package-db=$localpkgdb
# Build Hadckage compatible docs
cabal haddock -v2 --builddir=$builddir $HYPERLINK_FLAG --html-location="$haddock_path/$branch/\$pkg-\$version/docs" --contents-location="$haddock_path/$branch/\$pkg-\$version" --haddock-options="--use-contents=$haddock_path/$branch/index.html --use-index=$haddock_path/$branch/doc-index.html"
# Copy into right directory
mkdir -p $dir/haddock/$branch/$pkg-$ver
cp -R $builddir/doc/html/$pkg/ $dir/haddock/$branch/$pkg-$ver/docs
done
cd $dir/haddock/$branch
HADDOCK_FILES=
for f in $(find . -name \*.haddock); do
HADDOCK_FILES="$HADDOCK_FILES -i $(dirname $f),$f"
done
# Generate Contents and Index pages for all packages
haddock --gen-index --gen-contents -t "My Project documentation" $HADDOCK_FILES
# Tar and gzip
tar cvz -C $dir/haddock -f $dir/haddock/$branch.tar.gz $branch
# Upload
scp "$dir/haddock/${branch}.tar.gz" $SERVER:$SERVER_HADDOCK_PATH/.
ssh $SERVER "bash -c 'cd $SERVER_HADDOCK_PATH && rm -rf $branch && tar -xvf ${branch}.tar.gz'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment