Created
August 6, 2016 16:22
-
-
Save fizruk/0517907243add27c463c004584c9016b to your computer and use it in GitHub Desktop.
Build and upload haddocks for multi-package Stack project to custom server.
This file contains hidden or 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
#!/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