Skip to content

Commit

Permalink
Merge pull request #496 from IntersectMBO/lehins/fix-haddock-deployme…
Browse files Browse the repository at this point in the history
…nt-to-ghc-pages

Fix haddock deployment to Github Pages
  • Loading branch information
lehins authored Sep 12, 2024
2 parents 2dbf4c5 + df709de commit 9b5458b
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 70 deletions.
24 changes: 20 additions & 4 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,26 @@ jobs:
run: |
git config --local user.name ${{ github.actor }}
git config --local user.email "${{ github.actor }}@users.noreply.github.com"
cp -r ./haddocks/* ./
rm -rf haddocks
git add -A --force
git commit -m "Updated"
# Start a new version of the gh-pages branch
git for-each-ref refs/heads/gh-pages --format='%(refname:short)' |
while read -r REFNAME; do
git branch -D "$REFNAME"
done
git checkout -b gh-pages
git rm -rfq .
git commit -qm "Remove all existing files"
echo "cardano-base.cardano.intersectmbo.org" >CNAME
touch .nojekyll
git add CNAME .nojekyll
git commit -qm "Add CNAME and .nojekyll"
# Add Haddocks
git add -A --force ./haddocks
git mv ./haddocks/* .
git commit -qm "Updated from ${GITHUB_SHA} via ${GITHUB_EVENT_NAME}"
- name: Push to gh-pages
uses: ad-m/github-push-action@v0.6.0
Expand Down
134 changes: 68 additions & 66 deletions scripts/haddocks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,110 +4,112 @@
# `cardano-base` repository.
#
# usage:
# ./haddocks.sh directory [true|false]
# ./haddocks.sh directory [components ...]
#
# $1 - where to put the generated pages, this directory contents will be wiped
# out (so don't pass `/` or `./` - the latter will delete your 'dist-newstyle')
# (the default is './haddocks')
# $2 - whether to re-build haddocks with `cabal haddock` command or a component name
# (the default is true)
# (the default is 'haddocks')
# $2 - the components to re-build haddocks for, or 'all'
# (the default is none)
#

set -euo pipefail

OUTPUT_DIR=${1:-"./haddocks"}
REGENERATE=${2:-"true"}
OUTPUT_DIR=${1:-haddocks}
REGENERATE=("${@:2}")

BUILD_DIR="dist-newstyle"
GHC_VERSION=$(ghc --numeric-version)
OS_ARCH="$(cat dist-newstyle/cache/plan.json | jq -r '.arch + "-" + .os' | head -n 1 | xargs)"
BUILD_DIR=dist-newstyle

CABAL_OPTS=(
--builddir "${BUILD_DIR}"
--enable-benchmarks
--enable-documentation
--enable-tests
)

# Generate `doc-index.json` and `doc-index.html` per package, to assemble them later at the top level.
HADDOCK_OPTS=(
--builddir "${BUILD_DIR}"
--haddock-all
--haddock-internal
--haddock-html
--haddock-quickjump
--haddock-hyperlink-source
--haddock-option "--show-all"
--haddock-option "--use-unicode"
--haddock-option="--base-url=.."
)
--haddock-executables
--haddock-tests
--haddock-benchmarks
--haddock-html
--haddock-hyperlink-source
--haddock-option "--use-unicode"
--haddock-option="--base-url=.."
--haddock-quickjump
)

# build documentation of all modules
if [ ${REGENERATE} == "true" ]; then
cabal haddock "${HADDOCK_OPTS[@]}" all
elif [ ${REGENERATE} != "false" ]; then
cabal haddock "${HADDOCK_OPTS[@]}" ${REGENERATE}
# Rebuild documentation if requested
if (( "${#REGENERATE[@]}" > 0 )); then
cabal build "${CABAL_OPTS[@]}" "${REGENERATE[@]}"
cabal haddock "${CABAL_OPTS[@]}" "${REGENERATE[@]}" "${HADDOCK_OPTS[@]}"
fi

if [[ !( -d ${OUTPUT_DIR} ) ]]; then
mkdir -p ${OUTPUT_DIR}
if [[ ! -d "${OUTPUT_DIR}" ]]; then
mkdir -p "${OUTPUT_DIR}"
fi

# make all files user writable
chmod -R u+w "${OUTPUT_DIR}"

GHC_VERSION=$(ghc --numeric-version)
OS_ARCH=$(jq -r '"\(.arch)-\(.os)"' "$BUILD_DIR/cache/plan.json")

# copy the new docs
for dir in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"); do
package=$(echo "${dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//')
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ]; then
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ${OUTPUT_DIR}
else continue;
for package_dir in "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"/*; do
package=$(basename "${package_dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//')
if [ -d "${package_dir}/doc/html/${package}" ]; then
cp -r "${package_dir}/doc/html/${package}" "${OUTPUT_DIR}"
else continue
fi
# copy test packages documentation when it exists
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t" ]; then
for test_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t"); do
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" ]; then
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}"
cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}" && true
fi
done
if [ -d "${package_dir}/t" ]; then
for test_package_dir in "${package_dir}/t"/*; do
test_package=$(basename "${test_package_dir}")
if [ -d "${test_package_dir}/doc/html/${package}/${test_package}" ]; then
cp -r "${test_package_dir}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}"
cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}"
fi
done
fi
# copy lib packages documentation when it exists
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l" ]; then
for lib_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l"); do
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" ]; then
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}"
cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}" && true
fi
done
if [ -d "${package_dir}/l" ]; then
for lib_package_dir in "${package_dir}/l"/*; do
lib_package=$(basename "${lib_package_dir}")
if [ -d "${lib_package_dir}/doc/html/${package}" ]; then
cp -r "${lib_package_dir}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}"
cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}"
fi
done
fi
done

# build read-interface arguments for haddock
interface_options () {
for package in $(ls "${OUTPUT_DIR}"); do
if [[ -d "${OUTPUT_DIR}/${package}" ]]; then
haddock_file=$(ls -1 ${OUTPUT_DIR}/${package}/*.haddock | head -1)
echo "--read-interface=${package},${haddock_file}"
fi
done
}
interface_options=()
for package_dir in "${OUTPUT_DIR}"/*; do
package=$(basename "${package_dir}")
if [[ -d "${package_dir}" ]]; then
haddock_files=("${package_dir}"/*.haddock)
interface_options+=("--read-interface=${package},${haddock_files[0]}")
fi
done

./scripts/mkprolog.sh ./haddocks ./scripts/prolog
./scripts/mkprolog.sh "${OUTPUT_DIR}" scripts/prolog

# Generate top level index using interface files
haddock \
-o ${OUTPUT_DIR} \
-o "${OUTPUT_DIR}" \
--title "cardano-base" \
--package-name "Cardano Base" \
--gen-index \
--gen-contents \
--quickjump \
--prolog ./scripts/prolog \
$(interface_options)
"${interface_options[@]}"

# Assemble a toplevel `doc-index.json` from package level ones.
echo "[]" > "${OUTPUT_DIR}/doc-index.json"
for file in $(ls $OUTPUT_DIR/*/doc-index.json); do
project=$(basename $(dirname $file));
jq -s \
".[0] + [.[1][] | (. + {link: (\"${project}/\" + .link)}) ]" \
"${OUTPUT_DIR}/doc-index.json" \
${file} \
> /tmp/doc-index.json
mv /tmp/doc-index.json "${OUTPUT_DIR}/doc-index.json"
done
for file in "$OUTPUT_DIR"/*/doc-index.json; do
project=$(basename "$(dirname "$file")");
jq ".[] | .link = \"${project}/\(.link)\"" "${file}"
done |
jq -s . >"${OUTPUT_DIR}/doc-index.json"

0 comments on commit 9b5458b

Please sign in to comment.