commit a3cde1e1e76b22983723e32ae80fb1120536545f from: roman zolotarev date: Sun Jan 25 10:31:28 2026 UTC fix: send normal log to stdout and errors to stderr commit - 43659a89e664fce88544843384a3e3295c2339e7 commit + a3cde1e1e76b22983723e32ae80fb1120536545f blob - 22a9c210e935bc56366bbe79203865e4858e058c blob + b73d135e2c0387c6f52dd1c4577c641789d53657 --- ssg.sh +++ ssg.sh @@ -15,7 +15,7 @@ # other tortious action, arising out of or in connection with the use or # performance of this software. -info() { echo "$@" >&2; } +info() { echo "$@" >&3; } fail() { echo "$@" >&2 && exit 1; } usage() { fail "usage: ${0##*/} "; } @@ -431,7 +431,7 @@ generate() { write_hashes() { if ! test -d "$DST"; then return; fi echo "$1" >"$DST/$SSG_SRC" - echo "$2" | tee "$DST/$SSG_DST" | sha256 >&2 + echo "$2" | tee "$DST/$SSG_DST" | sha256 } main() { @@ -453,4 +453,4 @@ main() { write_hashes "$src_hash" "$(hash_dst)" } -main "${@}" +main "${@}" 3>&1 blob - 07d13294eabbc487918bd8fc6ae56096b486cce0 blob + 4bc2ed2bf68da7d79ff11ff17a698840135ceb4e --- ssg.test.sh +++ ssg.test.sh @@ -1,7 +1,7 @@ #!/bin/ksh -e ok_count=0 -ok_expected=28 +ok_expected=29 plan() { echo "$ok_expected..$ok_count" @@ -69,7 +69,7 @@ basic_case() { if test -z "$1"; then echo "x.txt" && exit; fi echo . >"$2/x.txt" && echo "x.txt" ' >"$src/.ssg.sh" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "basic_case" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "basic_case" ' ignore .ssg.ignore sh .ssg.sh > x.txt sh .ssg.sh > x.txt.gz @@ -131,7 +131,7 @@ c/' >"$src/a/.ssg.ignore" echo >"$src/a/b/3.txt" echo >"$src/a/c/4.txt" echo >"$src/a/c/5.txt" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1" ' ignore .ssg.ignore ignore a/.ssg.ignore ignore a/b/.ssg.ignore @@ -145,7 +145,7 @@ ignore a/b/.ssg.ignore select_src_files_trailing_slash) mkdir "$src" && echo >"$src/t.png" - "$cmd" "$src"/ "$dst"/ 2>&1 | not_ok_diff_n "$1" ' + "$cmd" "$src"/ "$dst"/ | not_ok_diff_n "$1" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' @@ -154,14 +154,14 @@ copy t.png .ssg.src t.png ' - cat "$dst/.ssg.dst" | not_ok_diff_n "$1: .ssg.dst" ' + cat "$dst/.ssg.dst" | not_ok_diff_n "$1: .ssg.dst" ' 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b t.png ' ;; select_src_files_no_dst) mkdir "$src" && echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' @@ -174,17 +174,17 @@ t.png select_src_files_no_ssg_dst_ssg_src) mkdir "$src" "$dst" && echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' rm "$dst/.ssg.src" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' rm "$dst/.ssg.dst" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: third run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: third run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' @@ -192,12 +192,12 @@ copy t.png select_src_files_no_dst_ssg_dst_match) mkdir "$src" "$dst" && echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' echo x >>"$dst/.ssg.dst" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' @@ -205,24 +205,24 @@ copy t.png select_src_files_no_src_diff) mkdir "$src" "$dst" && echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' ;; select_src_files_clean_dst) mkdir "$src" && echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' echo >"$dst/trash_file" mkdir "$dst/trash_dir" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' copy t.png 9db7b136bc6fdd9c51009ce2f88c69ff64060c3f3ff540a9199f37d2aa404eaa ' @@ -237,13 +237,13 @@ t.png mkdir "$src" "$src/dir" echo >"$src/a.png" echo >"$src/dir/b.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy a.png copy dir/b.png 6e0b941542f81e1b299a21444d0efe2fa224a4220e67df9c37cc34a2c6f01b13 ' rm "$src/dir/b.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' rm dir/b.png rmdir dir/ e86615a87eeeae97fb6302dd5013109f0ccfb7336f164a39457e684c30bae90e @@ -262,7 +262,7 @@ a.png echo '' >"$src/html2.html" echo '# h1' >"$src/markdown.md" echo >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' template .ssg.template html html1.html, .ssg.template > html1.html html html1.html, .ssg.template > html1.html.gz @@ -292,7 +292,7 @@ t.png not_ok_find "$dst" "$1" "$expected_dst" echo 'x' >"$src/.ssg.template" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' template .ssg.template html html1.html, .ssg.template > html1.html html html1.html, .ssg.template > html1.html.gz @@ -305,11 +305,11 @@ cc2f8fab08e743666d490c9379e8580981115d95c3b6492893a46b generate_copy) mkdir "$src" "$dst" && echo 'png' >"$src/t.png" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' copy t.png 5265fde36fa46d08d2bc48d0f413d41c166ee966a4f94b5fd7ad0c23e1bb92d4 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 5265fde36fa46d08d2bc48d0f413d41c166ee966a4f94b5fd7ad0c23e1bb92d4 ' not_ok_find "$dst" "$1" ' @@ -322,12 +322,12 @@ t.png generate_file) mkdir "$src" "$dst" && echo 'txt' >"$src/t.txt" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' file t.txt file t.txt > t.txt.gz 482d02d3fdd5ca854ffc9370f9cf3d4efa5bb640713c90dcf5c9800d5acf6812 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 482d02d3fdd5ca854ffc9370f9cf3d4efa5bb640713c90dcf5c9800d5acf6812 ' not_ok_find "$dst" "$1" ' @@ -346,14 +346,14 @@ t.txt.gz generate_html) mkdir "$src" "$dst" && echo '' >"$src/h.html" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz sitemap sitemap.xml sitemap robots.txt c31554e49bd5671f634ec9392a21ded395383d00bf224088767fd2fc64a42486 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' c31554e49bd5671f634ec9392a21ded395383d00bf224088767fd2fc64a42486 ' not_ok_find "$dst" "$1" ' @@ -374,7 +374,7 @@ sitemap.xml generate_sitemap) mkdir "$src" "$dst" && echo '' >"$src/h.html" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz sitemap sitemap.xml @@ -393,7 +393,7 @@ c31554e49bd5671f634ec9392a21ded395383d00bf224088767fd2 ' rm "$src/h.html" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' rm h.html rm h.html.gz rm robots.txt @@ -411,7 +411,7 @@ rm sitemap.xml mkdir "$src" "$dst" echo '' >"$src/h.html" echo >"$src/sitemap.xml" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz file sitemap.xml @@ -425,7 +425,7 @@ file sitemap.xml > sitemap.xml.gz mkdir "$src" "$dst" echo '' >"$src/h.html" echo >"$src/robots.txt" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz file robots.txt @@ -443,7 +443,7 @@ nla

a

' >"$src/h.html" echo '{{title}}' >"$src/.ssg.template" - "$cmd" "$src" "$dst" 2>/dev/null + "$cmd" "$src" "$dst" >/dev/null cat "$dst/h.html" | not_ok_diff "$1: h.html" "'→ nl" ;; @@ -452,7 +452,7 @@ nla echo '

x

' >"$src/h.html" echo '{{title}}~{{site}}{{content}}' >"$src/.ssg.template" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' template .ssg.template html h.html, .ssg.template > h.html html h.html, .ssg.template > h.html.gz @@ -460,7 +460,7 @@ sitemap sitemap.xml sitemap robots.txt 5843646b566cdf923e8cb8745d6e516dc1d764e4af5894a823d6aef45b61f70e ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 5843646b566cdf923e8cb8745d6e516dc1d764e4af5894a823d6aef45b61f70e ' not_ok_find "$dst" "$1" ' @@ -487,7 +487,7 @@ sitemap.xml echo 'p' >"$src/p.html" echo '{{#title}}{{title}}: {{/title}}{{site}}{{content}}' >"$src/.ssg.template" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' template .ssg.template html h.html, .ssg.template > h.html html h.html, .ssg.template > h.html.gz @@ -519,7 +519,7 @@ sitemap.xml echo '/' >"$src/.ssg.template" echo '/dir' >"$src/dir/.ssg.template" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' template .ssg.template template dir/.ssg.template html dir/h2.html, dir/.ssg.template > dir/h2.html @@ -530,7 +530,7 @@ sitemap sitemap.xml sitemap robots.txt 51147e86d5a634da68279934469c49305735a5a0516b0b6327fb00df86795832 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 51147e86d5a634da68279934469c49305735a5a0516b0b6327fb00df86795832 ' not_ok_find "$dst" "$1" ' @@ -552,14 +552,14 @@ sitemap.xml mkdir "$src" "$dst" echo '

h1

' >"$src/h.html" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz sitemap sitemap.xml sitemap robots.txt 52494b82f46c80147bde275b53bf7318998d6986eaf6e503d7fe3dadfdf67d19 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 52494b82f46c80147bde275b53bf7318998d6986eaf6e503d7fe3dadfdf67d19 ' not_ok_find "$dst" "$1" ' @@ -584,7 +584,7 @@ sitemap.xml echo >"$src/h.md" echo >"$src/h.html" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" 2>&1| not_ok_diff_n "$1: first run" ' html h.html html h.html > h.html.gz fail: h.md collides with h.html @@ -596,7 +596,7 @@ fail: h.md collides with h.html echo '# h1' >"$src/h.md" echo '{{title}}~{{site}}{{content}}' >"$src/.ssg.template" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' template .ssg.template md h.md, .ssg.template > h.html md h.md, .ssg.template > h.html.gz @@ -604,7 +604,7 @@ sitemap sitemap.xml sitemap robots.txt ea62f877148817dcb0bf8b1d76e691880cd58961f239f9e2e25f282c79da26e6 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' ea62f877148817dcb0bf8b1d76e691880cd58961f239f9e2e25f282c79da26e6 ' not_ok_find "$dst" "$1" ' @@ -631,14 +631,14 @@ sitemap.xml mkdir "$src" "$dst" echo '# h1' >"$src/h.md" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' md h.md > h.html md h.md > h.html.gz sitemap sitemap.xml sitemap robots.txt 541864f1b492230aa29853b08cf13533054817db9b19bc75ebd47201e04bd470 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 541864f1b492230aa29853b08cf13533054817db9b19bc75ebd47201e04bd470 ' not_ok_find "$dst" "$1" ' @@ -667,12 +667,12 @@ if test -z "$1"; then echo "x.txt" && exit; fi echo . >"$2/x.txt" && echo "x.txt" ' >"$src/.ssg.sh" - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' sh .ssg.sh > x.txt sh .ssg.sh > x.txt.gz 99c418b0dcd6c6c2124e87b4857b415bcf0a12ba7c7540d8ac53fe73c2046a29 ' - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: second run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: second run" ' 99c418b0dcd6c6c2124e87b4857b415bcf0a12ba7c7540d8ac53fe73c2046a29 ' not_ok_find "$dst" "$1" ' @@ -708,7 +708,7 @@ fail: .ssg.sh collides with x.txt mkdir "$src" echo >"$src/x.txt" # shellcheck disable=2016 - "$cmd" "$src" "$dst" 2>&1 | not_ok_diff_n "$1: first run" ' + "$cmd" "$src" "$dst" | not_ok_diff_n "$1: first run" ' file x.txt file x.txt > x.txt.gz a12d7b67f235edb37cfcf1bdd5a50a2e0486e1612eda28210b816eaff424a100