Skip to content

Commit 04028a9

Browse files
committed
add script
1 parent 52b60c7 commit 04028a9

1 file changed

Lines changed: 168 additions & 0 deletions

File tree

scripts/build-javadoc-archive.sh

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
4+
5+
show_usage() {
6+
cat <<'EOF'
7+
Usage: build-javadoc-archive.sh [--output-dir <path>] [--help]
8+
9+
Builds the aggregated RDF4J Javadocs and creates a compressed archive for
10+
the current project version. By default, the archive is written to
11+
site/static/javadoc/<version>.tar.xz and a latest.tar.xz companion copy is
12+
maintained.
13+
14+
Environment overrides:
15+
JAVADOC_BUILD_CMD Custom shell command that prepares target/reports/apidocs.
16+
When set, the Maven build steps are skipped.
17+
JAVADOC_SKIP_INSTALL If set to "true", skips the initial mvn -Pquick install.
18+
JAVADOC_SOURCE_DIR Use an existing apidocs directory instead of searching defaults.
19+
JAVADOC_ARCHIVE_VERSION
20+
Override the version used for the archive file name.
21+
EOF
22+
}
23+
24+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25+
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
26+
27+
OUTPUT_DIR="${REPO_ROOT}/site/static/javadoc"
28+
COMPRESSOR="${JAVADOC_COMPRESSOR:-xz}"
29+
30+
while [[ $# -gt 0 ]]; do
31+
case "$1" in
32+
--output-dir)
33+
if [[ $# -lt 2 ]]; then
34+
echo "Missing value for --output-dir" >&2
35+
exit 1
36+
fi
37+
OUTPUT_DIR="$2"
38+
shift 2
39+
;;
40+
-h|--help)
41+
show_usage
42+
exit 0
43+
;;
44+
*)
45+
echo "Unknown option: $1" >&2
46+
show_usage >&2
47+
exit 1
48+
;;
49+
esac
50+
done
51+
52+
mkdir -p "${OUTPUT_DIR}"
53+
OUTPUT_DIR="$(cd "${OUTPUT_DIR}" && pwd)"
54+
55+
cd "${REPO_ROOT}"
56+
57+
run_maven_with_fallback() {
58+
local -a args=("$@")
59+
local -a offline_cmd=("mvn" "-o" "${args[@]}")
60+
if "${offline_cmd[@]}"; then
61+
return 0
62+
fi
63+
64+
echo "Offline Maven command failed, retrying online: mvn ${args[*]}" >&2
65+
local -a online_cmd=("mvn" "${args[@]}")
66+
"${online_cmd[@]}"
67+
}
68+
69+
locate_javadoc_dir() {
70+
if [[ -n "${JAVADOC_SOURCE_DIR:-}" ]]; then
71+
if [[ -d "${JAVADOC_SOURCE_DIR}" ]]; then
72+
printf '%s\n' "${JAVADOC_SOURCE_DIR}"
73+
return 0
74+
fi
75+
echo "JAVADOC_SOURCE_DIR '${JAVADOC_SOURCE_DIR}' does not exist" >&2
76+
return 1
77+
fi
78+
79+
local candidate
80+
for candidate in "${REPO_ROOT}/target/reports/apidocs" "${REPO_ROOT}/target/site/apidocs"; do
81+
if [[ -d "${candidate}" ]]; then
82+
printf '%s\n' "${candidate}"
83+
return 0
84+
fi
85+
done
86+
87+
return 1
88+
}
89+
90+
determine_version() {
91+
local version
92+
version="$(awk -F'[<>]' '/<version>/{print $3; exit}' pom.xml)"
93+
if [[ -z "${version:-}" ]]; then
94+
echo "Unable to determine project version from pom.xml" >&2
95+
exit 1
96+
fi
97+
printf '%s\n' "${version}"
98+
}
99+
100+
prepare_javadocs() {
101+
if [[ -n "${JAVADOC_SOURCE_DIR:-}" && -d "${JAVADOC_SOURCE_DIR}" ]]; then
102+
echo "Using pre-built Javadocs from ${JAVADOC_SOURCE_DIR}; skipping Maven build." >&2
103+
return
104+
fi
105+
106+
if [[ -n "${JAVADOC_BUILD_CMD:-}" ]]; then
107+
echo "Using custom javadoc build command from JAVADOC_BUILD_CMD" >&2
108+
bash -c "${JAVADOC_BUILD_CMD}"
109+
return
110+
fi
111+
112+
if [[ "${JAVADOC_SKIP_INSTALL:-}" != "true" ]]; then
113+
run_maven_with_fallback "-Pquick" "install"
114+
else
115+
echo "Skipping Maven install step because JAVADOC_SKIP_INSTALL=true" >&2
116+
fi
117+
118+
run_maven_with_fallback "-Passembly" "-DskipTests" "-Djapicmp.skip" "javadoc:aggregate-no-fork"
119+
}
120+
121+
PROJECT_VERSION="${JAVADOC_ARCHIVE_VERSION:-$(determine_version)}"
122+
echo "Building Javadocs for RDF4J ${PROJECT_VERSION}"
123+
124+
prepare_javadocs
125+
126+
JAVADOC_DIR="$(locate_javadoc_dir 2>/dev/null || true)"
127+
if [[ -z "${JAVADOC_DIR}" || ! -d "${JAVADOC_DIR}" ]]; then
128+
echo "Unable to locate generated Javadocs. Checked target/reports/apidocs and target/site/apidocs." >&2
129+
exit 1
130+
fi
131+
132+
if [[ -z "$(find "${JAVADOC_DIR}" -mindepth 1 -print -quit)" ]]; then
133+
echo "Javadoc directory '${JAVADOC_DIR}' is empty" >&2
134+
exit 1
135+
fi
136+
137+
TMP_ARCHIVE="$(mktemp "${OUTPUT_DIR}/.${PROJECT_VERSION}.XXXXXX.tar.${COMPRESSOR}")"
138+
trap 'rm -f "${TMP_ARCHIVE}"' EXIT
139+
140+
echo "Compressing javadocs"
141+
142+
case "${COMPRESSOR}" in
143+
xz)
144+
tar --no-xattrs --exclude '*/.*' -c -C "${JAVADOC_DIR}" . | xz -9 -T0 > "${TMP_ARCHIVE}"
145+
EXTENSION="tar.xz"
146+
;;
147+
zst|zstd)
148+
tar --no-xattrs --exclude '*/.*' -c -C "${JAVADOC_DIR}" . | zstd -q --ultra -22 -T0 -o "${TMP_ARCHIVE}"
149+
EXTENSION="tar.zst"
150+
;;
151+
gz|gzip)
152+
tar --no-xattrs --exclude '*/.*' -czf "${TMP_ARCHIVE}" -C "${JAVADOC_DIR}" .
153+
EXTENSION="tgz"
154+
;;
155+
*)
156+
echo "Unsupported compressor '${COMPRESSOR}'. Supported values: xz, zst, gz." >&2
157+
exit 1
158+
;;
159+
esac
160+
161+
FINAL_ARCHIVE="${OUTPUT_DIR}/${PROJECT_VERSION}.${EXTENSION}"
162+
mv -f "${TMP_ARCHIVE}" "${FINAL_ARCHIVE}"
163+
trap - EXIT
164+
165+
cp -f "${FINAL_ARCHIVE}" "${OUTPUT_DIR}/latest.${EXTENSION}"
166+
167+
echo "Created archive: ${FINAL_ARCHIVE}"
168+
echo "Updated latest.${EXTENSION}"

0 commit comments

Comments
 (0)