summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-05 16:33:29 +0300
committerPaul Buetow <paul@buetow.org>2026-06-05 16:33:29 +0300
commit46fe0523140b8da22d9992adfbda3ee8fb6fcfb8 (patch)
treeaa94d8eba97cba12a59a3c4500d1e2f2223cbf7e
parente73a4803a9261cb71985872cf66be4a8b9fdda53 (diff)
Slim template render context interface
-rwxr-xr-xbin/photoalbum95
-rwxr-xr-xsrc/photoalbum.sh95
-rwxr-xr-xtests/cli.sh42
3 files changed, 170 insertions, 62 deletions
diff --git a/bin/photoalbum b/bin/photoalbum
index 7079465..cb629bb 100755
--- a/bin/photoalbum
+++ b/bin/photoalbum
@@ -576,38 +576,23 @@ validate_template_context() {
source_template_file() {
local -r template_path="$1"; shift
local -r output_path="$1"; shift
+ local context_file
+ local -i status=0
+
+ context_file=$(mktemp)
+ {
+ serialize_template_render_context
+ printf 'unset BASH_ENV\n'
+ } > "$context_file"
- env -i \
- PATH="$PATH" \
- render_animation_class_html="$render_animation_class_html" \
- render_backhref_css="$render_backhref_css" \
- render_backhref_html="$render_backhref_html" \
- render_background_image_css="$render_background_image_css" \
- render_blurs_dir_css="$render_blurs_dir_css" \
- render_current_date_text="$render_current_date_text" \
- render_enter_page_html="$render_enter_page_html" \
- render_exif_details_html="$render_exif_details_html" \
- render_height_html="$render_height_html" \
- render_html_dir_html="$render_html_dir_html" \
- render_maxpreviews_html="$render_maxpreviews_html" \
- render_next_html="$render_next_html" \
- render_original_basepath_is_set="$render_original_basepath_is_set" \
- render_original_basepath_html="$render_original_basepath_html" \
- render_page_num_html="$render_page_num_html" \
- render_photo_html="$render_photo_html" \
- render_photos_dir_html="$render_photos_dir_html" \
- render_prev_html="$render_prev_html" \
- render_preview_num_html="$render_preview_num_html" \
- render_redirect_page_html="$render_redirect_page_html" \
- render_show_header_bar="$render_show_header_bar" \
- render_tarball_include="$render_tarball_include" \
- render_tarball_name_html="$render_tarball_name_html" \
- render_thumbheight_html="$render_thumbheight_html" \
- render_thumbs_dir_html="$render_thumbs_dir_html" \
- render_title_html="$render_title_html" \
- render_view_next_html="$render_view_next_html" \
- render_view_prev_html="$render_view_prev_html" \
- bash -euo pipefail -- "$template_path" >> "$output_path"
+ if env -i PATH="$PATH" BASH_ENV="$context_file" \
+ bash -euo pipefail -- "$template_path" >> "$output_path"; then
+ rm -f "$context_file"
+ else
+ status=$?
+ rm -f "$context_file"
+ return "$status"
+ fi
}
parse_template_context() {
@@ -637,6 +622,54 @@ parse_template_context() {
done
}
+serialize_template_render_var() {
+ local -r name="$1"; shift
+ local -r value="$1"; shift
+
+ printf '%s=%q\n' "$name" "$value"
+}
+
+serialize_template_render_context() {
+ serialize_template_render_var \
+ render_animation_class_html "$render_animation_class_html"
+ serialize_template_render_var render_backhref_css "$render_backhref_css"
+ serialize_template_render_var render_backhref_html "$render_backhref_html"
+ serialize_template_render_var \
+ render_background_image_css "$render_background_image_css"
+ serialize_template_render_var render_blurs_dir_css "$render_blurs_dir_css"
+ serialize_template_render_var \
+ render_current_date_text "$render_current_date_text"
+ serialize_template_render_var render_enter_page_html "$render_enter_page_html"
+ serialize_template_render_var \
+ render_exif_details_html "$render_exif_details_html"
+ serialize_template_render_var render_height_html "$render_height_html"
+ serialize_template_render_var render_html_dir_html "$render_html_dir_html"
+ serialize_template_render_var \
+ render_maxpreviews_html "$render_maxpreviews_html"
+ serialize_template_render_var render_next_html "$render_next_html"
+ serialize_template_render_var \
+ render_original_basepath_is_set "$render_original_basepath_is_set"
+ serialize_template_render_var \
+ render_original_basepath_html "$render_original_basepath_html"
+ serialize_template_render_var render_page_num_html "$render_page_num_html"
+ serialize_template_render_var render_photo_html "$render_photo_html"
+ serialize_template_render_var render_photos_dir_html "$render_photos_dir_html"
+ serialize_template_render_var render_prev_html "$render_prev_html"
+ serialize_template_render_var \
+ render_preview_num_html "$render_preview_num_html"
+ serialize_template_render_var \
+ render_redirect_page_html "$render_redirect_page_html"
+ serialize_template_render_var render_show_header_bar "$render_show_header_bar"
+ serialize_template_render_var render_tarball_include "$render_tarball_include"
+ serialize_template_render_var \
+ render_tarball_name_html "$render_tarball_name_html"
+ serialize_template_render_var render_thumbheight_html "$render_thumbheight_html"
+ serialize_template_render_var render_thumbs_dir_html "$render_thumbs_dir_html"
+ serialize_template_render_var render_title_html "$render_title_html"
+ serialize_template_render_var render_view_next_html "$render_view_next_html"
+ serialize_template_render_var render_view_prev_html "$render_view_prev_html"
+}
+
prepare_template_render_vars() {
local -r context_name="$1"; shift
diff --git a/src/photoalbum.sh b/src/photoalbum.sh
index 9f9cc7d..32a38ee 100755
--- a/src/photoalbum.sh
+++ b/src/photoalbum.sh
@@ -576,38 +576,23 @@ validate_template_context() {
source_template_file() {
local -r template_path="$1"; shift
local -r output_path="$1"; shift
+ local context_file
+ local -i status=0
+
+ context_file=$(mktemp)
+ {
+ serialize_template_render_context
+ printf 'unset BASH_ENV\n'
+ } > "$context_file"
- env -i \
- PATH="$PATH" \
- render_animation_class_html="$render_animation_class_html" \
- render_backhref_css="$render_backhref_css" \
- render_backhref_html="$render_backhref_html" \
- render_background_image_css="$render_background_image_css" \
- render_blurs_dir_css="$render_blurs_dir_css" \
- render_current_date_text="$render_current_date_text" \
- render_enter_page_html="$render_enter_page_html" \
- render_exif_details_html="$render_exif_details_html" \
- render_height_html="$render_height_html" \
- render_html_dir_html="$render_html_dir_html" \
- render_maxpreviews_html="$render_maxpreviews_html" \
- render_next_html="$render_next_html" \
- render_original_basepath_is_set="$render_original_basepath_is_set" \
- render_original_basepath_html="$render_original_basepath_html" \
- render_page_num_html="$render_page_num_html" \
- render_photo_html="$render_photo_html" \
- render_photos_dir_html="$render_photos_dir_html" \
- render_prev_html="$render_prev_html" \
- render_preview_num_html="$render_preview_num_html" \
- render_redirect_page_html="$render_redirect_page_html" \
- render_show_header_bar="$render_show_header_bar" \
- render_tarball_include="$render_tarball_include" \
- render_tarball_name_html="$render_tarball_name_html" \
- render_thumbheight_html="$render_thumbheight_html" \
- render_thumbs_dir_html="$render_thumbs_dir_html" \
- render_title_html="$render_title_html" \
- render_view_next_html="$render_view_next_html" \
- render_view_prev_html="$render_view_prev_html" \
- bash -euo pipefail -- "$template_path" >> "$output_path"
+ if env -i PATH="$PATH" BASH_ENV="$context_file" \
+ bash -euo pipefail -- "$template_path" >> "$output_path"; then
+ rm -f "$context_file"
+ else
+ status=$?
+ rm -f "$context_file"
+ return "$status"
+ fi
}
parse_template_context() {
@@ -637,6 +622,54 @@ parse_template_context() {
done
}
+serialize_template_render_var() {
+ local -r name="$1"; shift
+ local -r value="$1"; shift
+
+ printf '%s=%q\n' "$name" "$value"
+}
+
+serialize_template_render_context() {
+ serialize_template_render_var \
+ render_animation_class_html "$render_animation_class_html"
+ serialize_template_render_var render_backhref_css "$render_backhref_css"
+ serialize_template_render_var render_backhref_html "$render_backhref_html"
+ serialize_template_render_var \
+ render_background_image_css "$render_background_image_css"
+ serialize_template_render_var render_blurs_dir_css "$render_blurs_dir_css"
+ serialize_template_render_var \
+ render_current_date_text "$render_current_date_text"
+ serialize_template_render_var render_enter_page_html "$render_enter_page_html"
+ serialize_template_render_var \
+ render_exif_details_html "$render_exif_details_html"
+ serialize_template_render_var render_height_html "$render_height_html"
+ serialize_template_render_var render_html_dir_html "$render_html_dir_html"
+ serialize_template_render_var \
+ render_maxpreviews_html "$render_maxpreviews_html"
+ serialize_template_render_var render_next_html "$render_next_html"
+ serialize_template_render_var \
+ render_original_basepath_is_set "$render_original_basepath_is_set"
+ serialize_template_render_var \
+ render_original_basepath_html "$render_original_basepath_html"
+ serialize_template_render_var render_page_num_html "$render_page_num_html"
+ serialize_template_render_var render_photo_html "$render_photo_html"
+ serialize_template_render_var render_photos_dir_html "$render_photos_dir_html"
+ serialize_template_render_var render_prev_html "$render_prev_html"
+ serialize_template_render_var \
+ render_preview_num_html "$render_preview_num_html"
+ serialize_template_render_var \
+ render_redirect_page_html "$render_redirect_page_html"
+ serialize_template_render_var render_show_header_bar "$render_show_header_bar"
+ serialize_template_render_var render_tarball_include "$render_tarball_include"
+ serialize_template_render_var \
+ render_tarball_name_html "$render_tarball_name_html"
+ serialize_template_render_var render_thumbheight_html "$render_thumbheight_html"
+ serialize_template_render_var render_thumbs_dir_html "$render_thumbs_dir_html"
+ serialize_template_render_var render_title_html "$render_title_html"
+ serialize_template_render_var render_view_next_html "$render_view_next_html"
+ serialize_template_render_var render_view_prev_html "$render_view_prev_html"
+}
+
prepare_template_render_vars() {
local -r context_name="$1"; shift
diff --git a/tests/cli.sh b/tests/cli.sh
index 8056da5..975b724 100755
--- a/tests/cli.sh
+++ b/tests/cli.sh
@@ -2483,6 +2483,45 @@ test_generate_templates_cannot_read_renderer_internals() {
test::teardown
}
+test_generate_templates_cannot_read_serialized_context_hook() {
+ local config_file
+ local fake_bin
+ local output
+ local template_dir
+
+ test::setup
+ fake_bin="$TEST_TMPDIR/bin"
+ config_file="$TEST_TMPDIR/photoalbum.conf"
+ template_dir="$TEST_TMPDIR/templates"
+
+ test::install_fake_imagemagick "$fake_bin"
+ PATH="$fake_bin:$PATH" \
+ test::generate_fixture_images "$TEST_TMPDIR/incoming"
+ cp -R "$TEST_REPO_ROOT/share/templates/default" "$template_dir"
+ # shellcheck disable=SC2016
+ printf 'printf "bash env: %%s\\n" "${BASH_ENV}"\n' \
+ > "$template_dir/preview.tmpl"
+ mkdir -p "$TEST_TMPDIR/dist"
+ printf 'old index\n' > "$TEST_TMPDIR/dist/index.html"
+ test::write_album_config \
+ "$config_file" "$TEST_TMPDIR/incoming" "$TEST_TMPDIR/dist" \
+ 'Renderer context album' 40
+ printf 'TEMPLATE_DIR=%q\n' "$template_dir" >> "$config_file"
+
+ output=$(
+ cd "$TEST_TMPDIR"
+ PATH="$fake_bin:$PATH" BASH_ENV=ambient \
+ test::capture_failure_output "$TEST_PHOTOALBUM" --generate
+ )
+
+ test::assert_contains 'BASH_ENV: unbound variable' "$output"
+ test "$(<"$TEST_TMPDIR/dist/index.html")" = 'old index'
+ test::assert_path_absent "$TEST_TMPDIR/dist/photos/01-landscape.jpg"
+ test::assert_path_absent "$TEST_TMPDIR/dist/photoalbum.json"
+ test::assert_no_staging_dirs "$TEST_TMPDIR"
+ test::teardown
+}
+
test_generate_swap_failure_restores_dist() {
local config_file
local fake_bin
@@ -3048,6 +3087,9 @@ main() {
'--generate templates cannot read renderer internals' \
test_generate_templates_cannot_read_renderer_internals
test::run_case \
+ '--generate templates cannot read serialized context hook' \
+ test_generate_templates_cannot_read_serialized_context_hook
+ test::run_case \
'--generate swap failure restores final dist' \
test_generate_swap_failure_restores_dist
test::run_case \