blob: e43d27cb3ccea5fd7d451904b258f8b533edbd2d [file]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# This script freezes generated documentation content onto a release branch.
# It should be run once when creating a new release branch.
#
# On main, docs/source/user-guide/latest/ holds only template markers; CI fills them
# at publish time via docs/build.sh. A release branch instead commits the generated
# content so that the archived docs for the release render real tables (archived
# versions are served from the frozen branch, not regenerated at publish).
#
# This mirrors the generation in docs/build.sh, except it runs against the source tree
# (so the result can be committed) rather than a throwaway temp copy. Two kinds of
# content are generated:
# - configs.md: the config reference (not per-Spark-version)
# - compatibility/expressions/spark-<ver>/*.md: per-Spark-version compatibility pages,
# generated from the _category_template/ markers. Support can differ per Spark
# version, so GenerateDocs runs once per profile against that profile's build.
#
# Usage: ./dev/generate-release-docs.sh
#
# Example workflow when cutting release 0.13.0 (release-branch changes go via PR):
# git checkout -b release-0.13-docs branch-0.13
# ./dev/generate-release-docs.sh
# git add docs/source/user-guide/latest/
# git commit -m "Generate docs for 0.13.0 release"
# # open a PR targeting branch-0.13
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${PROJECT_ROOT}"
LATEST_USER_GUIDE="${PROJECT_ROOT}/docs/source/user-guide/latest"
COMPAT_EXPR_DIR="${LATEST_USER_GUIDE}/compatibility/expressions"
TEMPLATE_DIR="${COMPAT_EXPR_DIR}/_category_template"
# Spark profiles for which we publish per-version compatibility pages. Keep this list
# in sync with docs/build.sh. Each entry must match both a Maven profile id (-P<profile>)
# and a source-tree subdirectory under compatibility/expressions/.
SPARK_PROFILES=(spark-3.4 spark-3.5 spark-4.0 spark-4.1)
echo "Compiling and generating documentation content..."
for profile in "${SPARK_PROFILES[@]}"; do
echo "Generating configs and compatibility pages for ${profile}..."
mkdir -p "${COMPAT_EXPR_DIR}/${profile}"
cp "${TEMPLATE_DIR}"/*.md "${COMPAT_EXPR_DIR}/${profile}/"
./mvnw package -P"${profile}" -Pgenerate-docs -DskipTests -Dmaven.test.skip=true \
-Dexec.arguments="${LATEST_USER_GUIDE},${profile}"
done
# Format the generated Markdown. CI runs `prettier --check "**/*.md"`, and unlike
# docs/build.sh (whose output is a throwaway temp build) this output is committed, so it
# must pass the check. GenerateDocs wraps the config/cast tables in prettier-ignore, but
# the surrounding generated Markdown is not guaranteed prettier-clean. prettier honors
# .prettierignore, so excluded pages (e.g. expressions.md) are left untouched.
if ! command -v npx >/dev/null 2>&1; then
echo "ERROR: npx not found. Install Node/prettier (see docs/source/contributor-guide/development.md)" >&2
exit 1
fi
echo "Formatting generated Markdown with prettier..."
npx prettier "${LATEST_USER_GUIDE}/**/*.md" --write
echo ""
echo "Done! Generated documentation content in docs/source/user-guide/latest/"
echo " - configs.md (config reference)"
echo " - compatibility/expressions/spark-*/ (per-Spark-version compatibility pages)"
echo ""
echo "Next steps (release-branch changes go via PR):"
echo " git add docs/source/user-guide/latest/"
echo " git commit -m 'Generate docs for release'"
echo " # push to your fork and open a PR targeting the release branch"