diff --git a/.travis.yml b/.travis.yml index c8e70bb..4104085 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,8 @@ before_install: script: - mkdir deploy + # Remove all tests to reduce binary size + - ./striptests # Linux Docker image - name="$DOCKER_BASE" - DOCKER_BUILDS="$DOCKER_BUILDS $name" @@ -25,6 +27,8 @@ script: - id=$(docker create "$name:current") - docker cp "$id:/bin/shellcheck" "shellcheck" - docker rm "$id" + - ls -l shellcheck + - ./shellcheck myscript - for tag in $TAGS; do cp "shellcheck" "deploy/shellcheck-$tag.linux"; done # Linux Alpine based Docker image - name="$DOCKER_BASE-alpine" diff --git a/ShellCheck.cabal b/ShellCheck.cabal index 2e2bdf7..74c4d2c 100644 --- a/ShellCheck.cabal +++ b/ShellCheck.cabal @@ -86,8 +86,8 @@ executable shellcheck json >= 0.3.6, mtl >= 2.2.1, parsec >= 3.0, - regex-tdfa, - QuickCheck >= 2.7.4 + QuickCheck >= 2.7.4, + regex-tdfa main-is: shellcheck.hs test-suite test-shellcheck @@ -100,7 +100,7 @@ test-suite test-shellcheck json, mtl >= 2.2.1, parsec, - regex-tdfa, - QuickCheck >= 2.7.4 + QuickCheck >= 2.7.4, + regex-tdfa main-is: test/shellcheck.hs diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index bbf0a02..15f04b2 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -17,7 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -} -{-# LANGUAGE TemplateHaskell, FlexibleContexts #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE FlexibleContexts #-} module ShellCheck.Analytics (runAnalytics, ShellCheck.Analytics.runTests) where import ShellCheck.AST diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index 4da90f9..b887662 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -21,9 +21,7 @@ {-# LANGUAGE FlexibleContexts #-} -- This module contains checks that examine specific commands by name. -module ShellCheck.Checks.Commands (checker - , ShellCheck.Checks.Commands.runTests -) where +module ShellCheck.Checks.Commands (checker , ShellCheck.Checks.Commands.runTests) where import ShellCheck.AST import ShellCheck.ASTLib diff --git a/src/ShellCheck/Checks/ShellSupport.hs b/src/ShellCheck/Checks/ShellSupport.hs index f1c258f..63d9029 100644 --- a/src/ShellCheck/Checks/ShellSupport.hs +++ b/src/ShellCheck/Checks/ShellSupport.hs @@ -19,9 +19,7 @@ -} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleContexts #-} -module ShellCheck.Checks.ShellSupport (checker - , ShellCheck.Checks.ShellSupport.runTests -) where +module ShellCheck.Checks.ShellSupport (checker , ShellCheck.Checks.ShellSupport.runTests) where import ShellCheck.AST import ShellCheck.ASTLib diff --git a/src/ShellCheck/Parser.hs b/src/ShellCheck/Parser.hs index 84b80dc..ede919a 100644 --- a/src/ShellCheck/Parser.hs +++ b/src/ShellCheck/Parser.hs @@ -17,7 +17,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -} -{-# LANGUAGE NoMonomorphismRestriction, TemplateHaskell, FlexibleContexts #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE NoMonomorphismRestriction #-} +{-# LANGUAGE FlexibleContexts #-} module ShellCheck.Parser (parseScript, runTests) where import ShellCheck.AST diff --git a/striptests b/striptests new file mode 100755 index 0000000..11aaf79 --- /dev/null +++ b/striptests @@ -0,0 +1,77 @@ +#!/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() { + 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() { + echo "-- 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 +