diff --git a/bin/snack b/bin/snack new file mode 100755 index 0000000..295163d --- /dev/null +++ b/bin/snack @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +set -euo pipefail + +## Defaults + +NIX_BUILD=nix-build +SNACK_NIX=snack.nix +COMMAND= + +## Functions + +log_error() { + echo "ERROR: $*" >&2 +} + +show_usage() { + cat < + +Snack is a Haskell build tool + +Options: + -f | --snack-nix : sets the path ot the "snack.nix" file. Default: "./snack.nix" + -h | --help: Shows this help + +Commands: + run: builds and executes + build: builds + ghci: builds and loads in ghci +USAGE +} + +## Main + +while [[ $# -gt 0 ]]; do + key="$1" + + case $key in + -f | --snack-nix) + SNACK_NIX="$2" + shift + shift + ;; + -h | --help) + show_usage + exit 0 + ;; + run | build | ghci) + COMMAND="$1" + shift # past argument + ;; + *) # unknown option + echo "unknown option: $1" + exit 1 + ;; + esac +done + +if [[ -z "$COMMAND" ]]; then + log_error "missing \n" + show_usage + exit 1 +fi + +echo "snack nix: $SNACK_NIX" +echo "command: $COMMAND" + +case $COMMAND in + build) + "$NIX_BUILD" --no-out-link -A build "$SNACK_NIX" + ;; + ghci) + res=$("$NIX_BUILD" --no-out-link -A ghci "$SNACK_NIX") + "$res/bin/ghci" + ;; + run) + res=$("$NIX_BUILD" --no-out-link -A build "$SNACK_NIX") + echo "running $res" + "$res/out" + ;; +esac diff --git a/default.nix b/default.nix index 09d3868..11c7f08 100644 --- a/default.nix +++ b/default.nix @@ -1,49 +1,11 @@ { pkgs ? import ./nix {} }: { snack-lib = import ./snack/default.nix { inherit pkgs; }; - snack-exe = pkgs.writeScriptBin "snack" - '' - set -euo pipefail - - SNACK_NIX=snack.nix - - while [[ $# -gt 0 ]] - do - key="$1" - - case $key in - -f|--snack-nix) - SNACK_NIX="$2" - shift - shift - ;; - run|build|ghci) - COMMAND="$1" - shift # past argument - ;; - *) # unknown option - echo "unknown option: $1" - exit 1 - ;; - esac - done - echo "snack nix: $SNACK_NIX" - echo "command: $COMMAND" - - case $COMMAND in - build) - ${pkgs.nix}/bin/nix-build --no-out-link -A build $SNACK_NIX - ;; - ghci) - res=$(${pkgs.nix}/bin/nix-build --no-out-link -A ghci $SNACK_NIX) - $res/bin/ghci - ;; - run) - res=$(${pkgs.nix}/bin/nix-build --no-out-link -A build $SNACK_NIX) - echo "running $res" - $res/out - ;; - esac - ''; + snack-exe = pkgs.writeScriptBin + "snack" + (builtins.replaceStrings + ["NIX_BUILD=nix-build"] + ["NIX_BUILD=${pkgs.nix}/bin/nix-build"] + (builtins.readFile ./bin/snack)); } diff --git a/script/snack-fmt b/script/snack-fmt new file mode 100755 index 0000000..4a024cc --- /dev/null +++ b/script/snack-fmt @@ -0,0 +1,4 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p shfmt -i bash +cd "$(dirname "$0")/.." +shfmt -i 2 -w bin/snack diff --git a/script/test b/script/test index 61ba479..c7ef6ed 100755 --- a/script/test +++ b/script/test @@ -2,23 +2,50 @@ #!nix-shell -i bash #!nix-shell -I nixpkgs=./nix #!nix-shell -p snack.snack-exe +#!nix-shell -p shfmt #!nix-shell --pure # vim: ft=sh sw=2 et -set -eux +set -euo pipefail +## Functions + +banner() { + echo "--- $*" +} + +fail() { + echo "ERROR: $*" + exit 1 +} + +## Main + +cd "$(dirname "$0")/.." + +banner "Test packages" pushd tests/packages snack build popd +banner "Test Template Haskell" pushd tests/template-haskell snack build popd +banner "Test Template Haskell 2" pushd tests/template-haskell-2 snack build -f code/snack.nix popd +banner "Test Template Haskell 3" pushd tests/template-haskell-3 snack build popd + +banner "Test stack-exe formatting" +list=$(shfmt -i 2 -l bin/snack) +if [[ -n "$list" ]]; then + fail "Please apply script/snack-fmt to format bin/snack" +fi +echo OK