diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-05 16:33:29 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-05 16:33:29 +0300 |
| commit | 46fe0523140b8da22d9992adfbda3ee8fb6fcfb8 (patch) | |
| tree | aa94d8eba97cba12a59a3c4500d1e2f2223cbf7e | |
| parent | e73a4803a9261cb71985872cf66be4a8b9fdda53 (diff) | |
Slim template render context interface
| -rwxr-xr-x | bin/photoalbum | 95 | ||||
| -rwxr-xr-x | src/photoalbum.sh | 95 | ||||
| -rwxr-xr-x | tests/cli.sh | 42 |
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 \ |
