Skip to content

Commit 0e115dd

Browse files
authored
Merge pull request #4195 from IntersectMBO/neilmayhew/fix-haddock-ci
Fix Haddocks CI
2 parents 6764449 + 2889356 commit 0e115dd

File tree

3 files changed

+138
-93
lines changed

3 files changed

+138
-93
lines changed

.github/workflows/gh-pages.yml

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Github Pages
1+
name: Haddocks to GitHub Pages
22

33
on:
44
push:
@@ -12,28 +12,72 @@ jobs:
1212
contents: write
1313

1414
steps:
15-
- uses: actions/checkout@v3
16-
- uses: cachix/install-nix-action@v18
17-
with:
18-
nix_path: nixpkgs=channel:nixos-unstable
19-
extra_nix_config: |
20-
trusted-public-keys = hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
21-
substituters = https://cache.iog.io https://cache.nixos.org/
22-
- name: Build projects and haddocks
23-
run: nix develop --command bash -c 'cabal update && cabal build --enable-documentation all && ./scripts/haddocks.sh'
24-
- name: Add files
25-
run: |
26-
git config --local user.name ${{ github.actor }}
27-
git config --local user.email "${{ github.actor }}@users.noreply.github.com"
28-
git add -A --force ./haddocks
29-
git mv ./haddocks/* .
30-
git commit -m "Updated"
31-
rm -rf haddocks
32-
33-
- name: Push to gh-pages
34-
uses: ad-m/[email protected]
35-
with:
36-
github_token: ${{ secrets.GITHUB_TOKEN }}
37-
branch: gh-pages
38-
force: true
39-
directory: .
15+
- uses: actions/checkout@v4
16+
17+
- name: Install Haskell
18+
uses: input-output-hk/setup-haskell@v1
19+
id: setup-haskell
20+
with:
21+
ghc-version: "9.2.8"
22+
cabal-version: latest
23+
24+
- name: Install system dependencies
25+
uses: input-output-hk/actions/base@latest
26+
with:
27+
use-sodium-vrf: false # default is true
28+
29+
- name: Configure to use libsodium
30+
run: |
31+
cat >> cabal.project <<EOF
32+
package cardano-crypto-praos
33+
flags: -external-libsodium-vrf
34+
EOF
35+
36+
- name: Cabal update
37+
run: cabal update
38+
39+
- name: Build haddocks
40+
run: scripts/haddocks.sh haddocks all
41+
42+
- name: Add files
43+
run: |
44+
git config --local user.name ${{ github.actor }}
45+
git config --local user.email "${{ github.actor }}@users.noreply.github.com"
46+
47+
# Start a new version of the gh-pages branch
48+
git for-each-ref refs/heads/gh-pages --format='%(refname:short)' |
49+
while read -r REFNAME; do
50+
git branch -D "$REFNAME"
51+
done
52+
git checkout -b gh-pages
53+
54+
git rm -rfq .
55+
git commit -qm "Remove all existing files"
56+
57+
echo "cardano-ledger.cardano.intersectmbo.org" >CNAME
58+
touch .nojekyll
59+
git add CNAME .nojekyll
60+
git commit -qm "Add CNAME and .nojekyll"
61+
62+
# Preserve benchmark results, if any
63+
git ls-remote origin --heads gh-pages |
64+
while read -r _SHA REFNAME; do
65+
git fetch origin "$REFNAME"
66+
if git diff --name-only FETCH_HEAD -- dev | grep -q .; then
67+
git checkout FETCH_HEAD dev
68+
git commit -qC "$(git log -1 --format=%H FETCH_HEAD dev)"
69+
fi
70+
done
71+
72+
# Add Haddocks
73+
git add -A --force ./haddocks
74+
git mv ./haddocks/* .
75+
git commit -qm "Updated from ${GITHUB_SHA} via ${GITHUB_EVENT_NAME}"
76+
77+
- name: Push to gh-pages
78+
uses: ad-m/[email protected]
79+
with:
80+
github_token: ${{ secrets.GITHUB_TOKEN }}
81+
branch: gh-pages
82+
force: true
83+
directory: .

CNAME

Lines changed: 0 additions & 1 deletion
This file was deleted.

scripts/haddocks.sh

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,110 +4,112 @@
44
# `cardano-ledger` repository.
55
#
66
# usage:
7-
# ./haddocks.sh directory [true|false]
7+
# ./haddocks.sh directory [components ...]
88
#
99
# $1 - where to put the generated pages, this directory contents will be wiped
1010
# out (so don't pass `/` or `./` - the latter will delete your 'dist-newstyle')
11-
# (the default is './haddocks')
12-
# $2 - whether to re-build haddocks with `cabal haddock` command or a component name
13-
# (the default is true)
11+
# (the default is 'haddocks')
12+
# $2 - the components to re-build haddocks for, or 'all'
13+
# (the default is none)
1414
#
1515

1616
set -euo pipefail
1717

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

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

23+
CABAL_OPTS=(
24+
--builddir "${BUILD_DIR}"
25+
--enable-benchmarks
26+
--enable-documentation
27+
--enable-tests
28+
)
2529

2630
# Generate `doc-index.json` and `doc-index.html` per package, to assemble them later at the top level.
2731
HADDOCK_OPTS=(
28-
--builddir "${BUILD_DIR}"
29-
--haddock-all
30-
--haddock-internal
31-
--haddock-html
32-
--haddock-quickjump
33-
--haddock-hyperlink-source
34-
--haddock-option "--show-all"
35-
--haddock-option "--use-unicode"
36-
--haddock-option="--base-url=.."
37-
)
32+
--haddock-all
33+
--haddock-html
34+
--haddock-hyperlink-source
35+
--haddock-internal
36+
--haddock-option "--show-all"
37+
--haddock-option "--use-unicode"
38+
--haddock-option="--base-url=.."
39+
--haddock-quickjump
40+
)
3841

39-
# build documentation of all modules
40-
if [ ${REGENERATE} == "true" ]; then
41-
cabal haddock "${HADDOCK_OPTS[@]}" all
42-
elif [ ${REGENERATE} != "false" ]; then
43-
cabal haddock "${HADDOCK_OPTS[@]}" ${REGENERATE}
42+
# Rebuild documentation if requested
43+
if (( "${#REGENERATE[@]}" > 0 )); then
44+
cabal build "${CABAL_OPTS[@]}" "${REGENERATE[@]}"
45+
cabal haddock "${CABAL_OPTS[@]}" "${REGENERATE[@]}" "${HADDOCK_OPTS[@]}"
4446
fi
4547

46-
if [[ !( -d ${OUTPUT_DIR} ) ]]; then
47-
mkdir -p ${OUTPUT_DIR}
48+
if [[ ! -d "${OUTPUT_DIR}" ]]; then
49+
mkdir -p "${OUTPUT_DIR}"
4850
fi
4951

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

55+
GHC_VERSION=$(ghc --numeric-version)
56+
OS_ARCH=$(jq -r '"\(.arch)-\(.os)"' "$BUILD_DIR/cache/plan.json")
57+
5358
# copy the new docs
54-
for dir in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"); do
55-
package=$(echo "${dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//')
56-
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ]; then
57-
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}" ${OUTPUT_DIR}
58-
else continue;
59+
for package_dir in "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}"/*; do
60+
package=$(basename "${package_dir}" | sed 's/-[0-9]\+\(\.[0-9]\+\)*//')
61+
if [ -d "${package_dir}/doc/html/${package}" ]; then
62+
cp -r "${package_dir}/doc/html/${package}" "${OUTPUT_DIR}"
63+
else continue
5964
fi
6065
# copy test packages documentation when it exists
61-
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t" ]; then
62-
for test_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t"); do
63-
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" ]; then
64-
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/t/${test_package}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}"
65-
cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}"
66-
fi
67-
done
66+
if [ -d "${package_dir}/t" ]; then
67+
for test_package_dir in "${package_dir}/t"/*; do
68+
test_package=$(basename "${test_package_dir}")
69+
if [ -d "${test_package_dir}/doc/html/${package}/${test_package}" ]; then
70+
cp -r "${test_package_dir}/doc/html/${package}/${test_package}" "${OUTPUT_DIR}/${package}:${test_package}"
71+
cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${test_package}"
72+
fi
73+
done
6874
fi
6975
# copy lib packages documentation when it exists
70-
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l" ]; then
71-
for lib_package in $(ls "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l"); do
72-
if [ -d "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" ]; then
73-
cp -r "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/l/${lib_package}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}"
74-
cp -n "${BUILD_DIR}/build/${OS_ARCH}/ghc-${GHC_VERSION}/${dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}"
75-
fi
76-
done
76+
if [ -d "${package_dir}/l" ]; then
77+
for lib_package_dir in "${package_dir}/l"/*; do
78+
lib_package=$(basename "${lib_package_dir}")
79+
if [ -d "${lib_package_dir}/doc/html/${package}" ]; then
80+
cp -r "${lib_package_dir}/doc/html/${package}" "${OUTPUT_DIR}/${package}:${lib_package}"
81+
cp -n "${package_dir}/doc/html/${package}"/{*.css,*.js} "${OUTPUT_DIR}/${package}:${lib_package}"
82+
fi
83+
done
7784
fi
7885
done
7986

8087
# build read-interface arguments for haddock
81-
interface_options () {
82-
for package in $(ls "${OUTPUT_DIR}"); do
83-
if [[ -d "${OUTPUT_DIR}/${package}" ]]; then
84-
haddock_file=$(ls -1 ${OUTPUT_DIR}/${package}/*.haddock | head -1)
85-
echo "--read-interface=${package},${haddock_file}"
86-
fi
87-
done
88-
}
88+
interface_options=()
89+
for package_dir in "${OUTPUT_DIR}"/*; do
90+
package=$(basename "${package_dir}")
91+
if [[ -d "${package_dir}" ]]; then
92+
haddock_files=("${package_dir}"/*.haddock)
93+
interface_options+=("--read-interface=${package},${haddock_files[0]}")
94+
fi
95+
done
8996

90-
./scripts/mkprolog.sh ./haddocks ./scripts/prolog
97+
./scripts/mkprolog.sh "${OUTPUT_DIR}" scripts/prolog
9198

9299
# Generate top level index using interface files
93100
haddock \
94-
-o ${OUTPUT_DIR} \
101+
-o "${OUTPUT_DIR}" \
95102
--title "cardano-ledger" \
96103
--package-name "Cardano Ledger" \
97104
--gen-index \
98105
--gen-contents \
99106
--quickjump \
100107
--prolog ./scripts/prolog \
101-
$(interface_options)
108+
"${interface_options[@]}"
102109

103110
# Assemble a toplevel `doc-index.json` from package level ones.
104-
echo "[]" > "${OUTPUT_DIR}/doc-index.json"
105-
for file in $(ls $OUTPUT_DIR/*/doc-index.json); do
106-
project=$(basename $(dirname $file));
107-
jq -s \
108-
".[0] + [.[1][] | (. + {link: (\"${project}/\" + .link)}) ]" \
109-
"${OUTPUT_DIR}/doc-index.json" \
110-
${file} \
111-
> /tmp/doc-index.json
112-
mv /tmp/doc-index.json "${OUTPUT_DIR}/doc-index.json"
113-
done
111+
for file in "$OUTPUT_DIR"/*/doc-index.json; do
112+
project=$(basename "$(dirname "$file")");
113+
jq ".[] | .link = \"${project}/\(.link)\"" "${file}"
114+
done |
115+
jq -s . >"${OUTPUT_DIR}/doc-index.json"

0 commit comments

Comments
 (0)