This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch auto-theme-version-bump in repository https://gitbox.apache.org/repos/asf/airflow-site.git
commit efd4467a0308c7f554410a0b7cc90be69c829db8 Author: Jarek Potiuk <[email protected]> AuthorDate: Mon Mar 16 23:12:15 2026 +0100 Add automatic version bumping for sphinx_airflow_theme Add a pre-commit hook that detects changes to theme files and automatically bumps the patch version. The CI workflow is updated to skip theme build/upload/publish when the version is unchanged, avoiding unnecessary work on non-theme commits. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> --- .github/workflows/build.yml | 23 +++++- .pre-commit-config.yaml | 6 ++ sphinx_airflow_theme/.theme_files_hash | 1 + sphinx_airflow_theme/LATEST_VERSION.txt | 1 + sphinx_airflow_theme/check_and_bump_version.sh | 96 ++++++++++++++++++++++ .../sphinx_airflow_theme/__init__.py | 2 +- 6 files changed, 127 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e85b818620..34472a8cf8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -160,14 +160,32 @@ jobs: - name: π§ Copy files from site to theme run: | ./site.sh prepare-theme + - name: π Check if sphinx_airflow_theme changed + id: check-theme + run: | + NEW_VERSION=$(cat sphinx_airflow_theme/LATEST_VERSION.txt | tr -d '[:space:]') + PUBLISHED_VERSION="" + if [ -f dist/sphinx-airflow-theme/LATEST_VERSION.txt ]; then + PUBLISHED_VERSION=$(cat dist/sphinx-airflow-theme/LATEST_VERSION.txt | tr -d '[:space:]') + fi + if [ "${NEW_VERSION}" != "${PUBLISHED_VERSION}" ]; then + echo "theme_changed=true" >> "${GITHUB_OUTPUT}" + echo "sphinx_airflow_theme version changed: ${PUBLISHED_VERSION} -> ${NEW_VERSION}" + else + echo "theme_changed=false" >> "${GITHUB_OUTPUT}" + echo "sphinx_airflow_theme version unchanged (${NEW_VERSION}), skipping theme upload" + fi - name: π§ Prepare sphinx_airflow_theme package οΈ + if: steps.check-theme.outputs.theme_changed == 'true' working-directory: sphinx_airflow_theme run: | uv build - name: π¦ Copy sphinx_airflow_theme package to dist + if: steps.check-theme.outputs.theme_changed == 'true' run: | mkdir -p dist/sphinx-airflow-theme cp sphinx_airflow_theme/dist/* dist/sphinx-airflow-theme/ + cp sphinx_airflow_theme/LATEST_VERSION.txt dist/sphinx-airflow-theme/ - name: πRefresh PMC/COMMITTERS profiles env: PMC_COMMITTERS_FILES: landing-pages/site/data/committers.json,landing-pages/site/data/pmc.json @@ -194,6 +212,7 @@ jobs: echo "Running git push to ${PUBLISH_BRANCH} branch" git push origin ${PUBLISH_BRANCH} - name: π Upload sphinx_airflow_theme package as artifact + if: steps.check-theme.outputs.theme_changed == 'true' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: airflow-sphinx-theme @@ -201,12 +220,14 @@ jobs: if-no-files-found: error retention-days: 14 - name: π§ Build theme demo + if: steps.check-theme.outputs.theme_changed == 'true' working-directory: sphinx_airflow_theme run: | pip install ./dist/sphinx_airflow_theme-*.whl cd demo ./docs.sh build - name: π Upload sphinx_airflow_theme demo as artifact + if: steps.check-theme.outputs.theme_changed == 'true' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: airflow-sphinx-theme-demo @@ -219,7 +240,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_COMMIT: ${{ github.sha }} GITHUB_REF: ${{ github.ref }} - if: env.PROD_PUBLISH_REQUIRED != 'false' || env.STAGING_PUBLISH_REQUIRED != 'false' + if: steps.check-theme.outputs.theme_changed == 'true' && (env.PROD_PUBLISH_REQUIRED != 'false' || env.STAGING_PUBLISH_REQUIRED != 'false') run: | set -x if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cc90f867a6..a4377746f0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -136,6 +136,12 @@ repos: - --fuzzy-match-generates-todo - repo: local hooks: + - id: check-sphinx-theme-version + name: Check and bump sphinx_airflow_theme version if files changed + language: script + entry: sphinx_airflow_theme/check_and_bump_version.sh + files: ^sphinx_airflow_theme/ + pass_filenames: false - id: shellcheck name: Check Shell scripts syntax correctness language: docker_image diff --git a/sphinx_airflow_theme/.theme_files_hash b/sphinx_airflow_theme/.theme_files_hash new file mode 100644 index 0000000000..c3dfc8db26 --- /dev/null +++ b/sphinx_airflow_theme/.theme_files_hash @@ -0,0 +1 @@ +07df2243846a413e643fa9ea4ba7faa06cb8431317caa58243b93a011017c0f2 diff --git a/sphinx_airflow_theme/LATEST_VERSION.txt b/sphinx_airflow_theme/LATEST_VERSION.txt new file mode 100644 index 0000000000..d15723fbe8 --- /dev/null +++ b/sphinx_airflow_theme/LATEST_VERSION.txt @@ -0,0 +1 @@ +0.3.2 diff --git a/sphinx_airflow_theme/check_and_bump_version.sh b/sphinx_airflow_theme/check_and_bump_version.sh new file mode 100755 index 0000000000..fe2c65ecce --- /dev/null +++ b/sphinx_airflow_theme/check_and_bump_version.sh @@ -0,0 +1,96 @@ +#!/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. + +# Pre-commit hook that checks if sphinx_airflow_theme files have changed. +# If they have, it bumps the patch version and updates the stored hash. + +set -euo pipefail + +REPO_ROOT="$(git rev-parse --show-toplevel)" +THEME_DIR="${REPO_ROOT}/sphinx_airflow_theme" +THEME_MODULE="${THEME_DIR}/sphinx_airflow_theme" +HASH_FILE="${THEME_DIR}/.theme_files_hash" +VERSION_FILE="${THEME_DIR}/LATEST_VERSION.txt" +INIT_FILE="${THEME_MODULE}/__init__.py" + +compute_theme_hash() { + # Hash all theme files (excluding version lines in __init__.py) plus pyproject.toml. + # We use shasum via stdin (< "$f") to avoid embedding absolute paths in the hash. + # File paths are echoed separately so the hash is stable regardless of working directory. + ( + find "${THEME_MODULE}" -type f | sort | while read -r f; do + local relative + relative="${f#"${REPO_ROOT}/"}" + if [ "$f" = "${INIT_FILE}" ]; then + echo "${relative}" + grep -v '^__version__' "$f" | grep -v '^__version_full__' | shasum -a 256 | cut -d' ' -f1 + else + echo "${relative}" + shasum -a 256 < "$f" | cut -d' ' -f1 + fi + done + echo "sphinx_airflow_theme/pyproject.toml" + shasum -a 256 < "${THEME_DIR}/pyproject.toml" | cut -d' ' -f1 + ) | shasum -a 256 | cut -d' ' -f1 +} + +current_hash=$(compute_theme_hash) + +if [ -f "${HASH_FILE}" ]; then + stored_hash=$(head -1 "${HASH_FILE}" | tr -d '[:space:]') +else + stored_hash="" +fi + +if [ "${current_hash}" = "${stored_hash}" ]; then + # No changes, verify version file is in sync + current_version=$(grep '^__version__' "${INIT_FILE}" | head -1 | sed "s/.*= *['\"]//;s/['\"]//") + stored_version=$(head -1 "${VERSION_FILE}" | tr -d '[:space:]') + if [ "${current_version}" != "${stored_version}" ]; then + echo "${current_version}" > "${VERSION_FILE}" + git add "${VERSION_FILE}" + echo "sphinx_airflow_theme: synced LATEST_VERSION.txt to ${current_version}" + fi + exit 0 +fi + +# Hash changed - bump the patch version +current_version=$(grep '^__version__' "${INIT_FILE}" | head -1 | sed "s/.*= *['\"]//;s/['\"]//") +IFS='.' read -r major minor patch <<< "${current_version}" +new_patch=$((patch + 1)) +new_version="${major}.${minor}.${new_patch}" + +echo "sphinx_airflow_theme: files changed, bumping version ${current_version} -> ${new_version}" + +# Update __init__.py +sed -i.bak "s/^__version__ = .*/__version__ = '${new_version}'/" "${INIT_FILE}" +sed -i.bak "s/^__version_full__ = .*/__version_full__ = __version__/" "${INIT_FILE}" +rm -f "${INIT_FILE}.bak" + +# Recompute hash after version bump (since __init__.py changed but version lines are excluded) +new_hash=$(compute_theme_hash) + +# Update stored hash and version +echo "${new_hash}" > "${HASH_FILE}" +echo "${new_version}" > "${VERSION_FILE}" + +# Stage the modified files +git add "${INIT_FILE}" "${HASH_FILE}" "${VERSION_FILE}" + +echo "sphinx_airflow_theme: updated hash and version files" +exit 1 diff --git a/sphinx_airflow_theme/sphinx_airflow_theme/__init__.py b/sphinx_airflow_theme/sphinx_airflow_theme/__init__.py index d71e298020..74c21d4d4a 100644 --- a/sphinx_airflow_theme/sphinx_airflow_theme/__init__.py +++ b/sphinx_airflow_theme/sphinx_airflow_theme/__init__.py @@ -18,7 +18,7 @@ from os import path from sphinx.application import Sphinx -__version__ = '0.3.1' +__version__ = '0.3.2' __version_full__ = __version__
