| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | #!/usr/bin/env bashset -euo pipefailset +egit diff-files --quietis_unclean=$?set -e# Revert `git stash` on exitfunction revert_git_stash {  >&2 echo "Unstashing uncommitted changes..."  git stash pop -q}# Stash pending changes and revert them when script endsif [ -z "${NO_STASH:-}" ] && [ $is_unclean -ne 0 ]; then  >&2 echo "Stashing uncommitted changes..."  GIT_LITERAL_PATHSPECS=0 git stash -q --keep-index  trap revert_git_stash EXITfiexport FLAKEBOX_GIT_LSFLAKEBOX_GIT_LS="$(git ls-files)"export FLAKEBOX_GIT_LS_TEXTFLAKEBOX_GIT_LS_TEXT="$(echo "$FLAKEBOX_GIT_LS" | grep -v -E "\.(png|ods|jpg|jpeg|woff2|keystore|wasm|ttf|jar|ico|gif)\$")"function check_nothing() {  true}export -f check_nothingfunction check_cargo_fmt() {    set -euo pipefail    flakebox-in-each-cargo-workspace cargo fmt --all --check}export -f check_cargo_fmtfunction check_cargo_lock() {    set -euo pipefail    # https://users.rust-lang.org/t/check-if-the-cargo-lock-is-up-to-date-without-building-anything/91048/5    flakebox-in-each-cargo-workspace cargo update --workspace --locked |& while read -r note ; do echo "$note    (cargo)"; done}export -f check_cargo_lockfunction check_leftover_dbg() {    set -euo pipefail    errors=""    for path in $(echo "$FLAKEBOX_GIT_LS_TEXT" | grep '.*\.rs'); do      if grep 'dbg!(' "$path" > /dev/null; then        >&2 echo "$path contains dbg! macro"        errors="true"      fi    done    if [ -n "$errors" ]; then      >&2 echo "Fix the problems above or use --no-verify" 1>&2      return 1    fi}export -f check_leftover_dbgfunction check_semgrep() {    set -euo pipefail    # semgrep is not available on MacOS    if ! command -v semgrep > /dev/null ; then      >&2 echo "Skipping semgrep check: not available"      return 0    fi    if [ ! -f .config/semgrep.yaml ] ; then      >&2 echo "Skipping semgrep check: .config/semgrep.yaml doesn't exist"      return 0    fi    if [ ! -s .config/semgrep.yaml ] ; then      >&2 echo "Skipping semgrep check: .config/semgrep.yaml empty"      return 0    fi    env SEMGREP_ENABLE_VERSION_CHECK=0 \      semgrep -q --error --no-rewrite-rule-ids --config .config/semgrep.yaml}export -f check_semgrepfunction check_shellcheck() {    set -euo pipefail    for path in $(echo "$FLAKEBOX_GIT_LS_TEXT" | grep -E '.*\.sh$'); do      shellcheck --severity=warning "$path"    done}export -f check_shellcheckfunction check_trailing_newline() {    set -euo pipefail    errors=""    for path in $(echo "$FLAKEBOX_GIT_LS_TEXT"); do      # extra branches for clarity      if [ ! -s "$path" ]; then         # echo "$path is empty"         true      elif [ -z "$(tail -c 1 < "$path")" ]; then         # echo "$path ends with a newline or with a null byte"         true      else        >&2 echo "$path doesn't end with a newline" 1>&2        errors="true"      fi    done    if [ -n "$errors" ]; then      >&2 echo "Fix the problems above or use --no-verify" 1>&2      return 1    fi}export -f check_trailing_newlinefunction check_trailing_whitespace() {    set -euo pipefail    rev="HEAD"    if ! git rev-parse -q 1>/dev/null HEAD 2>/dev/null ; then      >&2 echo "Warning: no commits yet, checking against --root"      rev="--root"    fi    if ! git diff --check $rev ; then      >&2 echo "Trailing whitespace detected. Please remove them before committing."      return 1    fi}export -f check_trailing_whitespacefunction check_typos() {    set -euo pipefail    if ! echo "$FLAKEBOX_GIT_LS_TEXT" | typos --file-list - --force-exclude ; then      >&2 echo "Typos found: Valid new words can be added to '.typos.toml'"      return 1    fi}export -f check_typosparallel \  --nonotice \::: \    check_cargo_fmt \    check_cargo_lock \    check_leftover_dbg \    check_semgrep \    check_shellcheck \    check_trailing_newline \    check_trailing_whitespace \    check_typos \  check_nothing
 |