diff --git a/specifications/generateCR/publish_spec.sh b/specifications/generateCR/publish_spec.sh new file mode 100644 index 0000000000000000000000000000000000000000..ecdb637e4208308d796c322787b3fd6e125c2af7 --- /dev/null +++ b/specifications/generateCR/publish_spec.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cleanup_on_failure() { + local exit_code=$? + if [[ $exit_code -eq 0 ]]; then + return 0 + fi + + echo "Execution failed (exit code: $exit_code). Cleaning run artifacts..." + + if [[ -n "${FOLDER_NAME:-}" ]]; then + rm -rf "GENERATED_FILES/${FOLDER_NAME}" + fi + + if [[ -n "${SPEC_NAME:-}" && -n "${COMMIT_TAG:-}" ]]; then + rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.docx" + rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.pdf" + rm -f "baseline/${SPEC_NAME}_${COMMIT_TAG}.epub" + fi +} + +trap cleanup_on_failure EXIT + +PROJECT_URL="${1:-}" +COMMIT_TAG="${2:-}" +TEMPLATE_DOCX_ARG="${3:-}" +SPEC_NAME="${4:-}" + +if [[ -z "$PROJECT_URL" || -z "$COMMIT_TAG" ]]; then + echo "Usage: ./publish_spec.sh [template_docx_ignored] [spec_name]" + exit 1 +fi + +# Execution assumptions for this repository pipeline: +# - fixed container image: mirkesx/spec-converter +# - pull image on each run +# - source format is always markdown +# - no local image build path +IMAGE_NAME="mirkesx/spec-converter" + +# Allow explicit override from CI when needed. +MD_SOURCE_DIR="${MD_SOURCE_DIR:-}" +if [[ -z "$MD_SOURCE_DIR" ]]; then + if [[ -d "./md" ]]; then + MD_SOURCE_DIR="./md" + else + mapfile -t md_candidates < <(find . -mindepth 2 -maxdepth 2 -type d -name md | sort) + if [[ ${#md_candidates[@]} -eq 0 ]]; then + echo "Error: could not find an md directory at ./md or ./*/md" + exit 1 + fi + MD_SOURCE_DIR="${md_candidates[0]}" + if [[ ${#md_candidates[@]} -gt 1 ]]; then + echo "Warning: multiple md directories found, using: $MD_SOURCE_DIR" + echo "Set MD_SOURCE_DIR to choose a specific one." + fi + fi +fi + +if [[ ! -d "$MD_SOURCE_DIR" ]]; then + echo "Error: MD_SOURCE_DIR does not exist: $MD_SOURCE_DIR" + exit 1 +fi + +ABS_MD_SOURCE="$(cd "$MD_SOURCE_DIR" && pwd)" +TOP_FOLDER_NAME="$(basename "$(dirname "$ABS_MD_SOURCE")")" +FOLDER_NAME="${FOLDER_NAME:-$TOP_FOLDER_NAME}" + +if [[ -z "$SPEC_NAME" ]]; then + SPEC_NAME="$FOLDER_NAME" +fi + +echo "Publishing from project: $PROJECT_URL" +echo "Detected source: $ABS_MD_SOURCE" +echo "Conversion folder: $FOLDER_NAME" +echo "Spec name: $SPEC_NAME" + +docker pull "$IMAGE_NAME" + +if [[ -n "$TEMPLATE_DOCX_ARG" ]]; then + echo "Info: template_docx argument is ignored. Using customized_reference.docx when available." +fi + +mkdir -p GENERATED_FILES baseline + +TEMPLATE_MOUNT="" +if [[ -f "customized_reference.docx" ]]; then + TEMPLATE_MOUNT="$(pwd)/customized_reference.docx:/app/customized_reference.docx:ro" +else + echo "Warning: customized_reference.docx not found, running with container default template" +fi + +TEMPLATE_ARGS=() +if [[ -n "$TEMPLATE_MOUNT" ]]; then + TEMPLATE_ARGS=(-v "$TEMPLATE_MOUNT") +fi + +docker run --rm \ + -v "$(pwd)/GENERATED_FILES:/app/GENERATED_FILES:rw" \ + -v "$ABS_MD_SOURCE:/data/sources:rw" \ + "${TEMPLATE_ARGS[@]}" \ + "$IMAGE_NAME" \ + --frm md \ + --to html \ + --folder "$FOLDER_NAME" \ + --src /data/sources + +docker run --rm \ + -v "$(pwd)/GENERATED_FILES:/app/GENERATED_FILES:rw" \ + "${TEMPLATE_ARGS[@]}" \ + "$IMAGE_NAME" \ + --frm html \ + --to docx \ + --folder "$FOLDER_NAME" \ + --extra-outputs pdf,epub + +OUTPUT_DIR="GENERATED_FILES/$FOLDER_NAME/docx" +if [[ ! -d "$OUTPUT_DIR" ]]; then + echo "Error: expected output directory not found: $OUTPUT_DIR" + exit 1 +fi + +for ext in docx pdf epub; do + source_file="$OUTPUT_DIR/document.$ext" + target_file="baseline/${SPEC_NAME}_${COMMIT_TAG}.$ext" + if [[ -f "$source_file" ]]; then + cp "$source_file" "$target_file" + else + echo "Warning: output not found: $source_file" + fi +done + +echo "Publication artifacts copied to baseline/" \ No newline at end of file