diff options
Diffstat (limited to 'aux')
-rwxr-xr-x | aux/ci/ci-build.sh | 2 | ||||
-rwxr-xr-x | aux/ci/report.sh | 26 | ||||
-rwxr-xr-x | aux/tests-lib.sh | 11 | ||||
-rwxr-xr-x | aux/workflow/TODOs.sh | 40 | ||||
-rwxr-xr-x | aux/workflow/assert-changelog.sh | 32 | ||||
-rwxr-xr-x | aux/workflow/assert-manpages.sh | 25 | ||||
-rwxr-xr-x | aux/workflow/assert-readme.sh | 28 | ||||
-rwxr-xr-x[-rw-r--r--] | aux/workflow/assert-spelling.sh | 73 | ||||
-rwxr-xr-x | aux/workflow/commonmark.sh | 60 | ||||
-rwxr-xr-x | aux/workflow/dist.sh | 51 | ||||
-rwxr-xr-x | aux/workflow/manpages.sh | 12 | ||||
-rwxr-xr-x | aux/workflow/public.sh | 48 | ||||
-rwxr-xr-x | aux/workflow/sign-tarballs.sh | 22 |
13 files changed, 372 insertions, 58 deletions
diff --git a/aux/ci/ci-build.sh b/aux/ci/ci-build.sh index 7fa3382..be97866 100755 --- a/aux/ci/ci-build.sh +++ b/aux/ci/ci-build.sh @@ -26,7 +26,7 @@ EOF git notes append -m "$NOTE" cd - - sh aux/ci/report.sh "$PROJECT" public + sh aux/ci/report.sh -n "$PROJECT" -o public rsync -av public/ "/srv/http/$PROJECT/" --delete printf "\n>>>\n>>> CI logs added as Git note.\n>>>\n>>> Run status was %s" "$STATUS" diff --git a/aux/ci/report.sh b/aux/ci/report.sh index c873f54..69dbea3 100755 --- a/aux/ci/report.sh +++ b/aux/ci/report.sh @@ -1,9 +1,31 @@ #!/bin/sh set -eu -PROJECT="$1" -OUTDIR="$2" TLD="$(cat aux/tld.txt)" +while getopts 'n:o:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + o) + OUTDIR="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${OUTDIR:-}" '-o OUTDIR' PASS='✅' FAIL='❌' diff --git a/aux/tests-lib.sh b/aux/tests-lib.sh index 007282a..a3ce7dc 100755 --- a/aux/tests-lib.sh +++ b/aux/tests-lib.sh @@ -5,6 +5,7 @@ red="\033[0;31m" green="\033[0;32m" yellow="\033[0;33m" +N= OUT= ERR= STATUS= @@ -14,10 +15,15 @@ ERROR() { printf "${red}ERROR${end}" } +print_debug_info() { + printf 'LINENO: %s\nOUT: %s\nERR: %s\n' "$N" "$OUT" "$ERR" >&2 +} + assert_status() { if [ "$STATUS" != "$1" ]; then printf '\n%s: Bad status.\n\nexpected: %s\ngot: %s\n' \ "$(ERROR)" "$1" "$STATUS" >&2 + print_debug_info exit 1 fi } @@ -26,6 +32,7 @@ assert_usage() { if ! grep -Fq 'Usage' "$1"; then echo 'Expected to find "Usage" text, it was missing:' >&2 cat "$1" >&2 + print_debug_info exit 1 fi } @@ -34,6 +41,7 @@ assert_empty_stream() { if [ -s "$2" ]; then printf '\n%s: Expected %s (%s) to be empty, but has content:\n%s\n' \ "$(ERROR)" "$1" "$2" "$(cat "$2")" >&2 + print_debug_info exit 1 fi } @@ -50,6 +58,7 @@ assert_stream() { if [ "$(cat "$2")" != "$3" ]; then printf '\nERR: Bad %s (%s)\n\nexpected: %s\ngot: %s\n' \ "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info exit 1 fi } @@ -66,6 +75,7 @@ assert_grep_stream() { if ! grep -qE "$3" "$2"; then printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info exit 1 fi } @@ -82,6 +92,7 @@ assert_fgrep_stream() { if ! grep -Fq -- "$3" "$2"; then printf '\nERR: Bad %s (%s)\n\ngrepping: %s\nin:\n%s\n' \ "$1" "$2" "$3" "$(cat "$2")" >&2 + print_debug_info exit 1 fi } diff --git a/aux/workflow/TODOs.sh b/aux/workflow/TODOs.sh index f93ece8..6c24c3e 100755 --- a/aux/workflow/TODOs.sh +++ b/aux/workflow/TODOs.sh @@ -1,11 +1,43 @@ #!/bin/sh set -eu -PROJECT_UC="$1" -PROJECT="$2" -MAILING_LIST="$3" -OUTDIR="$4" TLD="$(cat aux/tld.txt)" +PROJECT_UC= +while getopts 'n:N:m:o:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + N) + PROJECT_UC="$OPTARG" + ;; + m) + MAILING_LIST="$OPTARG" + ;; + o) + OUTDIR="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' +assert_arg "${OUTDIR:-}" '-o OUTDIR' + +if [ -z "${PROJECT_UC:-}" ]; then + PROJECT_UC="$PROJECT" +fi TODOS_ADD_REGEX='s/^## (TODO|DOING|WAITING|MEETING|INACTIVE|NEXT|CANCELLED|DONE) (.*) \{#(.*?)\}$/## <a href="#\3"><span class="\1">\1<\/span> \2<\/a>\n<pre class="header-anchor" id="\3">#\3<\/pre>\n/' TODOS_CLEANUP_REGEX1='s/(<a><a)/<a/' diff --git a/aux/workflow/assert-changelog.sh b/aux/workflow/assert-changelog.sh index e2cd926..11088a8 100755 --- a/aux/workflow/assert-changelog.sh +++ b/aux/workflow/assert-changelog.sh @@ -2,10 +2,34 @@ set -eu TLD="$(cat aux/tld.txt)" -PROJECT_UC="$1" -PROJECT="$2" -shift -shift +PROJECT_UC= +while getopts 'n:N:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + N) + PROJECT_UC="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' + +if [ -z "${PROJECT_UC:-}" ]; then + PROJECT_UC="$PROJECT" +fi HOMEPAGE_LINK="Changelog for [$PROJECT_UC](https://$TLD/$PROJECT/)." diff --git a/aux/workflow/assert-manpages.sh b/aux/workflow/assert-manpages.sh index a2bd3f9..d609685 100755 --- a/aux/workflow/assert-manpages.sh +++ b/aux/workflow/assert-manpages.sh @@ -1,22 +1,35 @@ #!/bin/sh set -eu -PROJECT="$1" -MAILING_LIST="$2" -shift -shift TLD="$(cat aux/tld.txt)" - IN_PLACE=false -while getopts 'i' flag; do +while getopts 'n:m:i' flag; do case "$flag" in + n) + PROJECT="$OPTARG" + ;; + m) + MAILING_LIST="$OPTARG" + ;; i) IN_PLACE=true ;; *) + exit 2 ;; esac done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' EXPECTED_EN="$(mktemp)" diff --git a/aux/workflow/assert-readme.sh b/aux/workflow/assert-readme.sh index 2a6c3fd..f8a05a4 100755 --- a/aux/workflow/assert-readme.sh +++ b/aux/workflow/assert-readme.sh @@ -1,11 +1,31 @@ #!/bin/sh set -eu -PROJECT="$1" -MAILING_LIST="$2" -shift -shift TLD="$(cat aux/tld.txt)" +while getopts 'n:m:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + m) + MAILING_LIST="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' EXPECTED="$(mktemp)" cat <<EOF >> "$EXPECTED" diff --git a/aux/workflow/assert-spelling.sh b/aux/workflow/assert-spelling.sh index e69de29..3781454 100644..100755 --- a/aux/workflow/assert-spelling.sh +++ b/aux/workflow/assert-spelling.sh @@ -0,0 +1,73 @@ +#!/bin/sh +set -eu + +sort_dicts() { + for f in doc/spelling/*.txt; do + if ! LANG=POSIX sort "$f" | diff - "$f"; then + if [ "$IN_PLACE" = true ]; then + OUT="$(mktemp)" + LANG=POSIX sort "$f" | uniq > "$OUT" + mv "$OUT" "$f" + else + echo "The $f dictionary is unsorted. To fix it, run:" >&2 + echo " sh aux/workflow/assert-spelling.sh -i" >&2 + exit 1 + fi + fi + done +} + +IN_PLACE=false +while getopts 'l:i' flag; do + case "$flag" in + l) + LANGS="$OPTARG" + ;; + i) + IN_PLACE=true + sort_dicts + exit + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND -1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${LANGS:-}" '-l LANGS' + +mkdir -p doc/spelling +eval "touch doc/spelling/{international,$(echo "$LANGS" | tr ' ' ,)}.txt" + +get_lang() { + grep lang=.. "$1" | \ + head -n1 | \ + awk ' + match($0, /lang="(..)"/) { + print substr($0, RSTART+length("lang=\""), 2) + } + ' +} + +ACC="$(mktemp)" +for f in "$@"; do + l="$(get_lang "$f")" + CURR_DICT="$(mktemp)" + cat doc/spelling/international.txt "doc/spelling/$l.txt" | sort | uniq > "$CURR_DICT" + hunspell -u3 -H -d "$l" -p "$CURR_DICT" "$f" | tee -a "$ACC" >&2 +done + +if [ -s "$ACC" ]; then + printf '\n\tMispelled words detected by hunspell above.\n\n' >&2 + exit 1 +fi + +sort_dicts diff --git a/aux/workflow/commonmark.sh b/aux/workflow/commonmark.sh index 7267145..2333f5d 100755 --- a/aux/workflow/commonmark.sh +++ b/aux/workflow/commonmark.sh @@ -1,19 +1,51 @@ #!/bin/sh set -eu -PROJECT_UC="$1" -F="$2" -OUTDIR="$3" -OUT="${4:-${F%.*}.html}" +while getopts 'N:o:r:w:' flag; do + case "$flag" in + N) + PROJECT_UC="$OPTARG" + ;; + o) + OUTDIR="$OPTARG" + ;; + r) + IN_FILE="$OPTARG" + ;; + w) + OUT_FILE="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT_UC:-}" '-N PROJECT_UC' +assert_arg "${OUTDIR:-}" '-o OUTDIR' +assert_arg "${IN_FILE:-}" '-i IN_FILE' + +if [ -z "${OUT_FILE:-}" ]; then + OUT_FILE="${IN_FILE%.md}.html" +fi + pandoc \ - --toc \ - --highlight-style pygments \ - --toc-depth=2 \ - -s \ - --metadata title="$PROJECT_UC - ${F%.*}" \ - --metadata lang=en \ - -r commonmark \ - -w html \ - -H aux/workflow/favicon.html \ - < "$F" > "$OUTDIR/$OUT" + --toc \ + --highlight-style pygments \ + --toc-depth=2 \ + -s \ + --metadata title="$PROJECT_UC - ${IN_FILE%.md}" \ + --metadata lang=en \ + -r commonmark \ + -w html \ + -H aux/workflow/favicon.html \ + < "$IN_FILE" > "$OUTDIR/$OUT_FILE" diff --git a/aux/workflow/dist.sh b/aux/workflow/dist.sh index ed61ee5..69c0173 100755 --- a/aux/workflow/dist.sh +++ b/aux/workflow/dist.sh @@ -1,19 +1,54 @@ #!/bin/sh set -eu -DATE="$1" -VVERSION="v$2" -PROJECT_UC="$3" -PROJECT="$4" -MAILING_LIST="$5" +PROJECT_UC= +while getopts 'd:V:n:N:m:' flag; do + case "$flag" in + d) + DATE="$OPTARG" + ;; + V) + VVERSION="v$OPTARG" + ;; + n) + PROJECT="$OPTARG" + ;; + N) + PROJECT_UC="$OPTARG" + ;; + m) + MAILING_LIST="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${DATE:-}" '-d DATE' +assert_arg "${VVERSION:-}" '-V VERSION' +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' + +if [ -z "${PROJECT_UC:-}" ]; then + PROJECT_UC="$PROJECT" +fi if git show "$VVERSION" 1>/dev/null 2>/dev/null; then echo "Version '$VVERSION' already exists." >&2 exit 1 fi -sh aux/workflow/assert-changelog.sh "$PROJECT_UC" "$PROJECT" "$VVERSION" -sh aux/workflow/assert-readme.sh "$PROJECT" "$MAILING_LIST" "$VVERSION" +sh aux/workflow/assert-changelog.sh -N "$PROJECT_UC" -n "$PROJECT" "$VVERSION" +sh aux/workflow/assert-readme.sh -n "$PROJECT" -m "$MAILING_LIST" "$VVERSION" if [ "$DATE" != "$(git log -1 --format=%cd --date=short HEAD)" ]; then echo "Date '$DATE' is not up-to-date." >&2 @@ -32,7 +67,7 @@ fi git tag "$VVERSION" -sh aux/workflow/sign-tarballs.sh "$PROJECT" +sh aux/workflow/sign-tarballs.sh -n "$PROJECT" cat <<EOF >&2 diff --git a/aux/workflow/manpages.sh b/aux/workflow/manpages.sh index fe215f7..d0d19ae 100755 --- a/aux/workflow/manpages.sh +++ b/aux/workflow/manpages.sh @@ -25,34 +25,34 @@ while getopts 'iuHo:p:' flag; do done shift $((OPTIND - 1)) -assert() { +assert_arg() { if [ -z "$1" ]; then - echo "Missing $2 argument" >&2 + echo "Missing $2" >&2 exit 2 fi } -assert "${ACTION:-}" ACTION +assert_arg "${ACTION:-}" '-[iuH] for choosing action' for f in "$@"; do l="$(echo "$f" | awk -F. '{print $(NF-1)}')" n="$(echo "$f" | awk -F. '{print $NF}')" case "$ACTION" in html) - assert "${OUTDIR:-}" OUTDIR + assert_arg "${OUTDIR:-}" '-o OUTDIR' to_name="$(basename "${f%.$l.$n}.$n.html")" mkdir -p "$OUTDIR/$l" pandoc -s -r man -w html --metadata "lang=$l" < "$f" > "$OUTDIR/$l/$to_name" ;; install) - assert "${MANPREFIX:-}" MANPREFIX + assert_arg "${MANPREFIX:-}" '-p MANPREFIX' to_name="$(basename "${f%.$l.$n}.$n")" mkdir -p "$MANPREFIX/$l/man$n" "$MANPREFIX/man$n" cp "$f" "$MANPREFIX/$l/man$n/$to_name" ln -fs "../en/man$n/$to_name" "$MANPREFIX/man$n/$to_name" ;; uninstall) - assert "${MANPREFIX:-}" MANPREFIX + assert_arg "${MANPREFIX:-}" '-p MANPREFIX' to_name="$(basename "${f%.$l.$n}.$n")" rm -f \ "$MANPREFIX/$l/man$n/$to_name" \ diff --git a/aux/workflow/public.sh b/aux/workflow/public.sh index 7433595..ef89d07 100755 --- a/aux/workflow/public.sh +++ b/aux/workflow/public.sh @@ -1,20 +1,52 @@ #!/bin/sh set -eu -PROJECT_UC="$1" -PROJECT="$2" -MAILING_LIST="$3" -OUTDIR="$4" +PROJECT_UC= +while getopts 'n:N:m:o:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + N) + PROJECT_UC="$OPTARG" + ;; + m) + MAILING_LIST="$OPTARG" + ;; + o) + OUTDIR="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' +assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' +assert_arg "${OUTDIR:-}" '-o OUTDIR' + +if [ -z "${PROJECT_UC:-}" ]; then + PROJECT_UC="$PROJECT" +fi mkdir -p "$OUTDIR" -sh aux/workflow/TODOs.sh "$PROJECT_UC" "$PROJECT" "$MAILING_LIST" "$OUTDIR" -sh aux/workflow/commonmark.sh "$PROJECT" README.md "$OUTDIR" index.html ||: +sh aux/workflow/TODOs.sh -N "$PROJECT_UC" -n "$PROJECT" -m "$MAILING_LIST" -o "$OUTDIR" +sh aux/workflow/commonmark.sh -N "$PROJECT" -o "$OUTDIR" -r README.md -w index.html if [ -f CHANGELOG.md ]; then - sh aux/workflow/commonmark.sh "$PROJECT" CHANGELOG.md "$OUTDIR" + sh aux/workflow/commonmark.sh -N "$PROJECT" -o "$OUTDIR" -r CHANGELOG.md fi -sh aux/ci/report.sh "$PROJECT" "$OUTDIR" +sh aux/ci/report.sh -n "$PROJECT" -o "$OUTDIR" cp aux/workflow/favicon.svg aux/workflow/favicon.png "$OUTDIR" diff --git a/aux/workflow/sign-tarballs.sh b/aux/workflow/sign-tarballs.sh index 8de6ac4..168d38d 100755 --- a/aux/workflow/sign-tarballs.sh +++ b/aux/workflow/sign-tarballs.sh @@ -1,7 +1,27 @@ #!/bin/sh set -eu -PROJECT="$1" +while getopts 'n:' flag; do + case "$flag" in + n) + PROJECT="$OPTARG" + ;; + *) + exit 2 + ;; + esac +done +shift $((OPTIND -1)) + +assert_arg() { + if [ -z "$1" ]; then + echo "Missing $2" >&2 + exit 2 + fi +} + +assert_arg "${PROJECT:-}" '-n PROJECT' + SIGNATURES="$(git notes --ref=refs/notes/signatures/tar.gz list | cut -d\ -f2)" for tag in $(git tag); do |