diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 05c8421b8..bb99a96ed 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -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 diff --git a/scripts/haddocks.sh b/scripts/haddocks.sh index e2ae3f7c6..e9d1b1a97 100755 --- a/scripts/haddocks.sh +++ b/scripts/haddocks.sh @@ -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"