#!/usr/bin/env bash # Справка `kit help` обязана перечислять все команды: авторские (их берём прямо из диспетчера # scripts/kit.sh) и наши. Если автор добавит команду, а мы забудем про справку — проверка упадёт, # и сборка релиза остановится: так справка не отстанет молча. set -Eeuo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." help=$(awk '/^kit_help_all\(\) \{/,/^\}/' scripts/kit-local.sh) [[ -n $help ]] || { echo "✗ не нашёл kit_help_all в scripts/kit-local.sh" >&2; exit 1; } bad=0 # 1) авторские команды: первое слово каждой ветки диспетчера kit.sh while read -r word; do [[ -n $word ]] || continue case $word in __* | local | help | -h | --help | -v | --version) continue ;; esac # «user off» в справке может стоять как «user on|off» — поэтому пробел допускаем и как разделитель вариантов pat=${word// /[ |]} grep -qE " kit ${pat}" <<<"$help" || { echo " ✗ в справке нет авторской команды: kit $word" >&2; bad=1; } done < <(grep -oE '^ +"[a-z][a-z0-9 -]*"\)|^ +"[a-z][a-z0-9 -]*" \*\)' scripts/kit.sh | sed 's/)$//' | tr -d '"' | sed 's/^ *//' | sort -u) # 2) наши команды из ветки kit_local_cmd while read -r word; do [[ -n $word ]] || continue grep -qF " kit local $word" <<<"$help" || { echo " ✗ в справке нет нашей команды: kit local $word" >&2; bad=1; } done < <(awk '/^kit_local_cmd\(\) \{/,/^\}/' scripts/kit-local.sh | grep -oE '^ [a-z-]+' | tr -d ' ' | sort -u) if (( bad )); then echo "✗ справка kit help отстала от набора команд — поправьте kit_help_all в scripts/kit-local.sh" >&2 exit 1 fi echo " ✓ справка kit help содержит все команды (авторские и наши)"