summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-05-18 17:04:02 +0200
committerDanilo M. <danix@danix.xyz>2026-05-18 17:04:02 +0200
commitdea52efa3e93c34b0baa81c7987d59483ec83c34 (patch)
tree6daea3e091b51278b4e2411cce78d9c47ef8b168
parent8e7bb77a16cad59928225c59b2e6f43fd00d1cb4 (diff)
downloadpkgs-html-structure-dea52efa3e93c34b0baa81c7987d59483ec83c34.tar.gz
pkgs-html-structure-dea52efa3e93c34b0baa81c7987d59483ec83c34.zip
refactor(gen_web_hook): skip writes when content unchangedHEADmaster
Adds write_if_changed: generates to a same-fs temp file, skips mv if cmp -s matches, otherwise atomically replaces. Trap ensures cleanup on failure. All header/footer write sites ported to use it. Also merges write_header/write_category_header into one function (optional cat_name arg for the pill), and splits footer_sig into footer_sig_inner so generate_root_footer can reuse the sig block without duplicating HTML. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rw-r--r--gen_web_hook.sh102
1 files changed, 39 insertions, 63 deletions
diff --git a/gen_web_hook.sh b/gen_web_hook.sh
index 77e2ec0..7be8c87 100644
--- a/gen_web_hook.sh
+++ b/gen_web_hook.sh
@@ -21,6 +21,22 @@ fi
log "Generating static web files in $PKGREPO ..."
+# ── Write file only if content changed ───────────────────────────────────────
+write_if_changed() {
+ local target="$1"
+ local tmp
+ tmp=$(mktemp "${target}.XXXXXX")
+ trap 'rm -f "$tmp"' EXIT
+ cat > "$tmp"
+ if cmp -s "$tmp" "$target" 2>/dev/null; then
+ rm "$tmp"
+ else
+ mv "$tmp" "$target"
+ log "Written: $target"
+ fi
+ trap - EXIT
+}
+
# ── HTML escape ───────────────────────────────────────────────────────────────
html_escape() {
local s="$1"
@@ -106,10 +122,8 @@ address { display: none; }
</style>'
# ── Shared footer signature ───────────────────────────────────────────────────
-footer_sig() {
+footer_sig_inner() {
cat << 'EOF'
-<footer class="site-footer">
- <div class="footer-inner">
<div class="footer-sig">
<span>danix packages &middot; Slackware64-current</span>
<span class="footer-sep">&middot;</span>
@@ -117,6 +131,16 @@ footer_sig() {
<span class="footer-sep">&middot;</span>
<span>GPG signed &middot; use at your own risk</span>
</div>
+EOF
+}
+
+footer_sig() {
+ cat << 'EOF'
+<footer class="site-footer">
+ <div class="footer-inner">
+EOF
+ footer_sig_inner
+ cat << 'EOF'
</div>
</footer>
</body>
@@ -149,20 +173,13 @@ generate_root_footer() {
RSS feed
</a>
</div>
- <div class="footer-sig">
- <span>danix packages &middot; Slackware64-current</span>
- <span class="footer-sep">&middot;</span>
- <a href="https://danix.xyz/is/here/">Contact danix</a>
- <span class="footer-sep">&middot;</span>
- <span>GPG signed &middot; use at your own risk</span>
- </div>
+$(footer_sig_inner)
</div>
</footer>
</body>
</html>
EOF
- } > "$PKGREPO/_footer.html"
- log "Written: $PKGREPO/_footer.html"
+ } | write_if_changed "$PKGREPO/_footer.html"
}
# ── Generate per-package _footer.html ────────────────────────────────────────
@@ -176,7 +193,7 @@ generate_package_footer() {
if [ -z "$txt_file" ]; then
# No .txt file — minimal footer
- { echo '</div><!-- .autoindex-wrapper -->'; footer_sig; } > "$pkg_dir/_footer.html"
+ { echo '</div><!-- .autoindex-wrapper -->'; footer_sig; } | write_if_changed "$pkg_dir/_footer.html"
return
fi
@@ -234,55 +251,16 @@ generate_package_footer() {
echo '</section>'
footer_sig
- } > "$pkg_dir/_footer.html"
-
- log "Written: $pkg_dir/_footer.html"
+ } | write_if_changed "$pkg_dir/_footer.html"
}
-# ── Write _header.html to a given directory ───────────────────────────────────
+# ── Write _header.html to a given directory (optional category pill) ──────────
write_header() {
local dir="$1"
- cat > "$dir/_header.html" << EOF
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>danix Slackware Repository</title>
- <link rel="icon" type="image/png" href="/.assets/img/favicon.png">
- <link rel="preconnect" href="https://fonts.googleapis.com">
- <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
- <script src="/.assets/js/matrix-rain.js" defer></script>
- ${CSS}
-</head>
-<body>
-<header class="site-header">
- <div class="header-top">
- <div class="site-title"><span>//</span> <a href="https://packages.danix.xyz" style="color:var(--accent)">danix packages</a></div>
- <div class="site-subtitle">Slackware64-current &middot; unofficial repository</div>
- </div>
- <p class="header-desc">
- Third-party Slackware packages built with
- <a href="https://github.com/aclemons/slackrepo" style="color:var(--accent)">slackrepo</a>
- on Slackware64-current. Use at your own risk. All packages are signed with my GPG key.
- </p>
- <div class="header-links">
- <a href="https://danix.xyz/is/here/">Contact me</a>
- <a href="/ChangeLog.txt">ChangeLog</a>
- <a href="/ChangeLog.rss">RSS</a>
- </div>
-</header>
-<div class="autoindex-wrapper">
-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
+ local cat_name="${2:-}"
+ local pill=''
+ [ -n "$cat_name" ] && pill=" <div class=\"category-pill\"><span>$(html_escape "$cat_name")</span></div>"
+ write_if_changed "$dir/_header.html" << EOF
<!DOCTYPE html>
<html lang="en">
<head>
@@ -311,18 +289,16 @@ write_category_header() {
<a href="/ChangeLog.txt">ChangeLog</a>
<a href="/ChangeLog.rss">RSS</a>
</div>
- <div class="category-pill"><span>$(html_escape "$cat_name")</span></div>
+${pill}
</header>
<div class="autoindex-wrapper">
EOF
- log "Written: $dir/_header.html"
}
# ── Generate category _footer.html (just the signature) ──────────────────────
generate_category_footer() {
local cat_dir="$1"
- { echo '</div><!-- .autoindex-wrapper -->'; footer_sig; } > "$cat_dir/_footer.html"
- log "Written: $cat_dir/_footer.html"
+ { echo '</div><!-- .autoindex-wrapper -->'; footer_sig; } | write_if_changed "$cat_dir/_footer.html"
}
# ── Main ──────────────────────────────────────────────────────────────────────
@@ -331,7 +307,7 @@ generate_root_footer
for category in "$PKGREPO"/*/; do
[ -d "$category" ] || continue
- write_category_header "$category"
+ write_header "$category" "$(basename "$category")"
generate_category_footer "$category"
for pkg in "$category"*/; do
[ -d "$pkg" ] || continue