#!/bin/bash # gen_web_hook.sh — generates static HTML header/footer files for the # Apache autoindex listing of the danix Slackware package repository. # # Can be called standalone or from slackrepo's HOOK_FINISH. # Usage: gen_web_hook.sh [/path/to/pkgrepo] # # If no argument is given, uses $SR_PKGREPO if set, otherwise /repo. set -euo pipefail PKGREPO="${1:-${SR_PKGREPO:-/repo}}" log() { echo "gen_web_hook: $*"; } warn() { echo "gen_web_hook: WARNING: $*" >&2; } if [ ! -d "$PKGREPO" ]; then warn "PKGREPO '$PKGREPO' not found." exit 1 fi log "Generating static web files in $PKGREPO ..." # ── HTML escape ─────────────────────────────────────────────────────────────── html_escape() { local s="$1" s="${s//&/&}" s="${s///>}" s="${s//\"/"}" printf '%s' "$s" } # ── Shared CSS ──────────────────────────────────────────────────────────────── CSS='' # ── Shared footer signature ─────────────────────────────────────────────────── footer_sig() { cat << 'EOF' EOF } # ── Generate root _footer.html (last-updated + signature) ──────────────────── generate_root_footer() { local last_updated='unknown' if [ -f "$PKGREPO/ChangeLog.txt" ]; then last_updated=$(grep -m1 -E '^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)' "$PKGREPO/ChangeLog.txt" || echo 'unknown') fi { cat << EOF EOF } > "$PKGREPO/_footer.html" log "Written: $PKGREPO/_footer.html" } # ── Generate per-package _footer.html ──────────────────────────────────────── generate_package_footer() { local pkg_dir="$1" local pkg_name pkg_name=$(basename "$pkg_dir") local txt_file txt_file=$(find "$pkg_dir" -maxdepth 1 -name '*.txt' | head -1) if [ -z "$txt_file" ]; then # No .txt file — minimal footer { echo ''; footer_sig; } > "$pkg_dir/_footer.html" return fi # Parse .txt local title='' homepage='' body_lines=() while IFS= read -r line; do # Strip "pkgname:" or "pkgname: " prefix local text text=$(echo "$line" | sed 's/^[^:]*: \?//') # Skip lines that were just "pkgname:" with nothing after [[ "$line" == *: ]] && text='' if [[ "$text" == Homepage:* ]]; then homepage="${text#Homepage: }" continue fi if [ -z "$title" ]; then [ -n "$text" ] && title="$text" else [ -n "$text" ] && body_lines+=("$text") fi done < "$txt_file" # Parse .meta for sizes local meta_file size_c='' size_u='' meta_file=$(find "$pkg_dir" -maxdepth 1 -name '*.meta' | head -1) if [ -n "$meta_file" ]; then size_c=$(grep 'PACKAGE SIZE (compressed):' "$meta_file" | sed 's/.*: *//') size_u=$(grep 'PACKAGE SIZE (uncompressed):' "$meta_file" | sed 's/.*: *//') fi { echo '' echo '
' echo '
' echo ' Package description' echo " $(html_escape "$pkg_name")" echo '
' echo '
' echo "

$(html_escape "$title")

" for bline in "${body_lines[@]}"; do echo "

$(html_escape "$bline")

" done echo '
' if [ -n "$size_c" ] || [ -n "$size_u" ]; then echo '
' [ -n "$size_c" ] && echo " Size (compressed): $(html_escape "$size_c")" [ -n "$size_u" ] && echo " Size (uncompressed): $(html_escape "$size_u")" echo '
' fi if [ -n "$homepage" ]; then echo "
$(html_escape "$homepage")
" fi echo '
' footer_sig } > "$pkg_dir/_footer.html" log "Written: $pkg_dir/_footer.html" } # ── Write _header.html to a given directory ─────────────────────────────────── write_header() { local dir="$1" cat > "$dir/_header.html" << EOF danix Slackware Repository ${CSS}
EOF log "Written: $dir/_header.html" } # ── Write _header.html for a category directory (includes pill) ─────────────── write_category_header() { local dir="$1" local cat_name cat_name=$(basename "$dir") cat > "$dir/_header.html" << EOF danix Slackware Repository ${CSS}
EOF log "Written: $dir/_header.html" } # ── Generate category _footer.html (just the signature) ────────────────────── generate_category_footer() { local cat_dir="$1" { echo '
'; footer_sig; } > "$cat_dir/_footer.html" log "Written: $cat_dir/_footer.html" } # ── Main ────────────────────────────────────────────────────────────────────── write_header "$PKGREPO" generate_root_footer for category in "$PKGREPO"/*/; do [ -d "$category" ] || continue write_category_header "$category" generate_category_footer "$category" for pkg in "$category"*/; do [ -d "$pkg" ] || continue write_header "$pkg" generate_package_footer "$pkg" done done log "Done."