From 9a10f244693f4d0c17f4e758e64dbdc014299c9f Mon Sep 17 00:00:00 2001
From: Ben Sima <ben@bsima.me>
Date: Tue, 21 Dec 2021 21:12:41 -0500
Subject: Enable shellcheck lint and fix its warnings

---
 Biz/Bild/ShellHook.sh | 171 +++++++++++++++++++++++++-------------------------
 Biz/Ide/ftags.sh      |   4 +-
 Biz/Ide/hoog.sh       |   2 +-
 Biz/Lint.hs           |  15 +++--
 4 files changed, 98 insertions(+), 94 deletions(-)

diff --git a/Biz/Bild/ShellHook.sh b/Biz/Bild/ShellHook.sh
index 96c2e56..1cdb8ca 100644
--- a/Biz/Bild/ShellHook.sh
+++ b/Biz/Bild/ShellHook.sh
@@ -1,88 +1,89 @@
-function help() {
-  echo ""
-  echo "bizdev" | figlet | lolcat
-  echo ""
-  echo "   bild   compile code"
-  echo "   repl   start a repl"
-  echo "   ci     run all builds and tests"
-  echo "   deps   manage dependencies with niv"
-  echo "   help   show this message"
-  echo "   lint   auto-lint all changed files"
-  echo "   pie    product improvement engine"
-  echo "   push   send a namespace to the cloud"
-  echo "   ship   lint, bild, and push one (or all) namespace(s)"
-}
-
+#!/usr/bin/env bash
+##
+  function help() {
+    echo ""
+    echo "bizdev" | figlet | lolcat
+    echo ""
+    echo "   bild   compile code"
+    echo "   repl   start a repl"
+    echo "   ci     run all builds and tests"
+    echo "   deps   manage dependencies with niv"
+    echo "   help   show this message"
+    echo "   lint   auto-lint all changed files"
+    echo "   pie    product improvement engine"
+    echo "   push   send a namespace to the cloud"
+    echo "   ship   lint, bild, and push one (or all) namespace(s)"
+  }
+#
 # color codes for use with printf
-export RED='\033[0;31m'
-export GRN='\033[0;32m'
-export YEL='\033[0;33m'
-export NC='\033[0m' # No Color
-
-alias runghc="runghc --ghc-arg=-i$BIZ_ROOT"
-
-alias guile="guile -L $BIZ_ROOT"
-
-alias tree="tree -I _ -F"
-
+  export RED='\033[0;31m'
+  export GRN='\033[0;32m'
+  export YEL='\033[0;33m'
+  export NC='\033[0m' # No Color
+#
+  alias runghc="runghc --ghc-arg=-i\$BIZ_ROOT"
+  alias guile="guile -L \$BIZ_ROOT"
+  alias tree="tree -I _ -F"
 # link git hooks
-rm -f $BIZ_ROOT/.git/hooks/{post-checkout,post-merge,pre-commit,pre-push}
-ln -s $BIZ_ROOT/Biz/Ide/post-checkout $BIZ_ROOT/.git/hooks/post-checkout
-ln -s $BIZ_ROOT/Biz/Ide/post-merge $BIZ_ROOT/.git/hooks/post-merge
-ln -s $BIZ_ROOT/Biz/Ide/pre-commit $BIZ_ROOT/.git/hooks/pre-commit
-ln -s $BIZ_ROOT/Biz/Ide/pre-push $BIZ_ROOT/.git/hooks/pre-push
-
-function deps() {
-  niv --sources-file $BIZ_ROOT/Biz/Bild/Sources.json $@
-}
-
-function pie() {
-  runghc Biz.Pie $@
-}
-
-function run-sentry() {
-  urls=(
-    http://que.run
-    https://dragons.dev
-    https://simatime.com
-    https://tv.simatime.com
-    https://bsima.me
-    # https://herocomics.app
-  )
-  for url in ${urls[@]}
-  do
-    code=$(curl -L --max-time 10 --silent --show-error --insecure \
-      --output /dev/null \
-      --write-out "%{http_code}" "$url")
-    case "$code" in
-      2[0-9][0-9]) printf "${GRN}$code  $url${NC}\n";;
-      3[0-9][0-9]) printf "${YEL}$code  $url${NC}\n";;
-      4[0-9][0-9]) printf "${YEL}$code  $url${NC}\n";;
-      5[0-9][0-9]) printf "${RED}$code  $url${NC}\n";;
-      *)           printf "${RED}$code  $url${NC}\n";;
-    esac
-  done
-}
-
-function sentry() {
-  while true
-  do
-    clear
-    printf "%s  sentry\n\n" "$(date +%Y.%m.%d..%H.%M)"
-    run-sentry
-    sleep 120
-  done
-}
-
+  rm -f "$BIZ_ROOT/.git/hooks/{post-checkout,post-merge,pre-commit,pre-push}"
+  ln -s "$BIZ_ROOT/Biz/Ide/post-checkout" "$BIZ_ROOT/.git/hooks/post-checkout"
+  ln -s "$BIZ_ROOT/Biz/Ide/post-merge" "$BIZ_ROOT/.git/hooks/post-merge"
+  ln -s "$BIZ_ROOT/Biz/Ide/pre-commit" "$BIZ_ROOT/.git/hooks/pre-commit"
+  ln -s "$BIZ_ROOT/Biz/Ide/pre-push" "$BIZ_ROOT/.git/hooks/pre-push"
+#
+  function deps() {
+    niv --sources-file "$BIZ_ROOT/Biz/Bild/Sources.json" "$@"
+  }
+#
+  function pie() {
+    runghc Biz.Pie "$@"
+  }
+#
+  function run-sentry() {
+    urls=(
+      http://que.run
+      https://dragons.dev
+      https://simatime.com
+      https://tv.simatime.com
+      https://bsima.me
+      # https://herocomics.app
+    )
+    for url in "${urls[@]}"
+    do
+      code=$(curl -L --max-time 10 --silent --show-error --insecure \
+        --output /dev/null \
+        --write-out "%{http_code}" "$url")
+      case "$code" in
+        2[0-9][0-9]) color=${GRN};;
+        3[0-9][0-9]) color=${YEL};;
+        4[0-9][0-9]) color=${YEL};;
+        5[0-9][0-9]) color=${RED};;
+        *)           color=${RED};;
+      esac
+      printf "%b%s  %s%b\n" "$color" "$code" "$url" "$NC"
+    done
+  }
+#
+  function sentry() {
+    while true
+    do
+      clear
+      printf "%s  sentry\n\n" "$(date +%Y.%m.%d..%H.%M)"
+      run-sentry
+      sleep 120
+    done
+  }
+#
 # Poor man's ci
-function run-ci() {
-  lint **/* && bild --test **/*
-}
-
-function ci() {
-  time run-ci
-}
-
-export PS1='\n$(r=$? && [ $r -eq 0 ] && printf "biz" || printf "%3.*s" $r $r)> '
-
-help
+  function run-ci() {
+    lint ./**/* && bild --test ./**/*
+  }
+#
+  function ci() {
+    time run-ci
+  }
+# shellcheck disable=SC2154
+  export PS1='\n$(r=$? && [ $r -eq 0 ] && printf "biz" || printf "%3.*s" $r $r)> '
+#
+  help
+##
diff --git a/Biz/Ide/ftags.sh b/Biz/Ide/ftags.sh
index 4b8396b..77646da 100755
--- a/Biz/Ide/ftags.sh
+++ b/Biz/Ide/ftags.sh
@@ -5,7 +5,7 @@
   set -euo pipefail
   tags=$BIZ_ROOT/tags
   tag_search=$(
-    awk 'BEGIN { FS="\t" } !/^!/ {print toupper($4)"\t"$1"\t"$2"\t"$3}' $tags \
+    awk 'BEGIN { FS="\t" } !/^!/ {print toupper($4)"\t"$1"\t"$2"\t"$3}' "$tags" \
       | cut -c1-80 \
       | fzf \
         --nth=1,2 \
@@ -13,7 +13,7 @@
         --preview "rg --ignore-case --pretty --context 2 --word-regexp {+2}"
   )
   ${EDITOR:-vim} \
-    $(cut -f3 <<< "$tag_search") \
+    "$(cut -f3 <<< "$tag_search")" \
     -c "set nocst" \
     -c "silent tag $(cut -f2 <<< "$tag_search")"
 ##
diff --git a/Biz/Ide/hoog.sh b/Biz/Ide/hoog.sh
index 5379e54..3945f90 100755
--- a/Biz/Ide/hoog.sh
+++ b/Biz/Ide/hoog.sh
@@ -4,7 +4,7 @@
 #
   set -euo pipefail
   HOOG="hoogle search --count=200"
-  export FZF_DEFAULT_COMMAND="$HOOG $@"
+  export FZF_DEFAULT_COMMAND="$HOOG $*"
   fzf \
     --preview-window=down \
     --preview "hoogle search --link --info {+2}" \
diff --git a/Biz/Lint.hs b/Biz/Lint.hs
index 38c7403..8d5a757 100644
--- a/Biz/Lint.hs
+++ b/Biz/Lint.hs
@@ -87,13 +87,13 @@ printResult r@(NoOp path_) =
     >> pure r
 
 changedFiles :: IO [FilePath]
-changedFiles = mergeBase +> changed
+changedFiles =
+  git ["merge-base", "HEAD", "origin/master"]
+    /> filter (/= '\n')
+    +> (\mb -> git ["diff", "--name-only", "--diff-filter=d", mb])
+    /> String.lines
   where
     git args = Process.readProcess "git" args ""
-    mergeBase = git ["merge-base", "HEAD", "origin/master"] /> filter (/= '\n')
-    changed mb =
-      String.lines
-        </ git ["diff", "--name-only", "--diff-filter=d", mb]
 
 data Linter = Linter
   { exe :: Text,
@@ -126,6 +126,9 @@ pylint =
       fixArgs = Nothing
     }
 
+shellcheck :: Linter
+shellcheck = Linter {exe = "shellcheck", args = [], fixArgs = Nothing}
+
 data Status = Good | Bad String
   deriving (Show)
 
@@ -152,7 +155,7 @@ runOne shouldFix root cwd path_ = results +> traverse_ printResult >> results
             lint shouldFix hlint path_
           ]
         Just (Namespace _ Py) -> [lint shouldFix pylint path_]
-        Just (Namespace _ Sh) -> [pure <| NoOp path_] -- [lint "shellcheck" [] path_]
+        Just (Namespace _ Sh) -> [lint shouldFix shellcheck path_]
         Just (Namespace _ Nix) -> [pure <| NoOp path_]
         Just (Namespace _ Scm) -> [pure <| NoOp path_]
         Just _ -> [pure <. Warn <| "no linter for " <> Text.pack path_]
-- 
cgit v1.2.3