#!/usr/bin/env bash # This file strips all unit tests from ShellCheck, removing # the dependency on QuickCheck and Template Haskell and # reduces the binary size considerably. set -o pipefail sponge() { local data data="$(cat)" printf '%s\n' "$data" > "$1" } modify() { if ! "${@:2}" < "$1" | sponge "$1" then { printf 'Failed to modify %s: ' "$1" printf '%q ' "${@:2}" printf '\n' } >&2 exit 1 fi } detestify() { printf '%s\n' '-- AUTOGENERATED from ShellCheck by striptests. Do not modify.' awk ' BEGIN { state = 0; } /LANGUAGE TemplateHaskell/ { next; } /^import.*Test\./ { next; } /^module/ { sub(/,[^,)]*runTests/, ""); } # Delete tests /^prop_/ { state = 1; next; } # ..and any blank lines following them. state == 1 && /^ / { next; } # Template Haskell marker /^return / { exit; } { state = 0; print; } ' } if [[ ! -e 'ShellCheck.cabal' ]] then echo "Run me from the ShellCheck directory." >&2 exit 1 fi if [[ -d '.git' ]] && ! git diff --exit-code > /dev/null 2>&1 then echo "You have local changes! These may be overwritten." >&2 exit 2 fi modify 'ShellCheck.cabal' sed -e ' /QuickCheck/d /^test-suite/{ s/.*//; q; } ' find . -name '.git' -prune -o -type f -name '*.hs' -print | while IFS= read -r file do modify "$file" detestify done