109 lines
2.6 KiB
Bash
Executable File
109 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
CONFIG_FILE="${REPO_ROOT}/docs.yml"
|
|
README_TEMPLATE="${REPO_ROOT}/README.md.tmpl"
|
|
README_OUTPUT="${REPO_ROOT}/README.md"
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage: scripts/render-docs [--check]
|
|
|
|
Render generated Markdown docs from repo-local templates.
|
|
|
|
Options:
|
|
--check fail if generated docs differ from committed output
|
|
USAGE
|
|
}
|
|
|
|
read_config_value() {
|
|
local key="$1"
|
|
|
|
awk -F ':' -v key="${key}" '
|
|
$1 == key {
|
|
value = $0
|
|
sub("^[^:]*:[[:space:]]*", "", value)
|
|
gsub(/^[[:space:]"'"'"']+|[[:space:]"'"'"']+$/, "", value)
|
|
print value
|
|
found = 1
|
|
exit
|
|
}
|
|
END {
|
|
if (!found) {
|
|
exit 1
|
|
}
|
|
}
|
|
' "${CONFIG_FILE}"
|
|
}
|
|
|
|
render_readme() {
|
|
local main_script="$1"
|
|
|
|
if grep -Eo '{{[[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*}}' "${README_TEMPLATE}" |
|
|
grep -Evq '{{[[:space:]]*main_script[[:space:]]*}}'; then
|
|
printf 'Unsupported template variable in %s\n' "${README_TEMPLATE}" >&2
|
|
return 1
|
|
fi
|
|
|
|
sed "s/{{[[:space:]]*main_script[[:space:]]*}}/${main_script}/g" "${README_TEMPLATE}"
|
|
}
|
|
|
|
main() {
|
|
local mode="render"
|
|
local main_script
|
|
local rendered
|
|
|
|
case "${1:-}" in
|
|
"")
|
|
;;
|
|
--check)
|
|
mode="check"
|
|
;;
|
|
-h | --help)
|
|
usage
|
|
return 0
|
|
;;
|
|
*)
|
|
usage >&2
|
|
return 2
|
|
;;
|
|
esac
|
|
|
|
if [[ ! -s "${CONFIG_FILE}" ]]; then
|
|
printf 'Missing docs config: %s\n' "${CONFIG_FILE}" >&2
|
|
return 1
|
|
fi
|
|
if [[ ! -s "${README_TEMPLATE}" ]]; then
|
|
printf 'Missing README template: %s\n' "${README_TEMPLATE}" >&2
|
|
return 1
|
|
fi
|
|
|
|
main_script="$(read_config_value main_script)"
|
|
if [[ -z "${main_script}" ]]; then
|
|
printf 'docs.yml main_script must not be empty\n' >&2
|
|
return 1
|
|
fi
|
|
|
|
rendered="$(mktemp)"
|
|
render_readme "${main_script}" >"${rendered}"
|
|
|
|
if [[ "${mode}" == "check" ]]; then
|
|
if ! cmp -s "${rendered}" "${README_OUTPUT}"; then
|
|
printf 'Generated README.md is stale. Run scripts/render-docs.\n' >&2
|
|
diff -u "${README_OUTPUT}" "${rendered}" || true
|
|
rm -f "${rendered}"
|
|
return 1
|
|
fi
|
|
printf 'docs are current\n'
|
|
rm -f "${rendered}"
|
|
return 0
|
|
fi
|
|
|
|
mv "${rendered}" "${README_OUTPUT}"
|
|
printf 'Rendered %s from %s\n' "${README_OUTPUT}" "${README_TEMPLATE}"
|
|
}
|
|
|
|
main "$@"
|