From a89403f09b34e2742786a046f25217700839641e Mon Sep 17 00:00:00 2001
From: Gandalf- <austin.voecks@gmail.com>
Date: Fri, 18 Jan 2019 19:21:17 -0800
Subject: [PATCH] Issue 1393 quiet flag

Issue https://github.com/koalaman/shellcheck/issues/1393

Provide '-q' and '--quiet' flags that suppress all normal output, but keep the
return status, similar to 'grep -q'.
---
 ShellCheck.cabal                  |  1 +
 shellcheck.1.md                   |  6 +++++
 shellcheck.hs                     |  4 +++-
 src/ShellCheck/Formatter/Quiet.hs | 37 +++++++++++++++++++++++++++++++
 4 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 src/ShellCheck/Formatter/Quiet.hs

diff --git a/ShellCheck.cabal b/ShellCheck.cabal
index 3345e32..ff612ed 100644
--- a/ShellCheck.cabal
+++ b/ShellCheck.cabal
@@ -80,6 +80,7 @@ library
       ShellCheck.Formatter.GCC
       ShellCheck.Formatter.JSON
       ShellCheck.Formatter.TTY
+      ShellCheck.Formatter.Quiet
       ShellCheck.Interface
       ShellCheck.Parser
       ShellCheck.Regex
diff --git a/shellcheck.1.md b/shellcheck.1.md
index 6600613..10f9797 100644
--- a/shellcheck.1.md
+++ b/shellcheck.1.md
@@ -137,6 +137,12 @@ not warn at all, as `ksh` supports decimals in arithmetic contexts.
           ...
         ]
 
+*quiet*
+
+:   Suppress all normal output. Exit with zero if no issues are found,
+    otherwise exit with one. Stops processing after the first issue.
+
+
 # DIRECTIVES
 ShellCheck directives can be specified as comments in the shell script
 before a command or block:
diff --git a/shellcheck.hs b/shellcheck.hs
index 84dee0a..e3487c0 100644
--- a/shellcheck.hs
+++ b/shellcheck.hs
@@ -27,6 +27,7 @@ import           ShellCheck.Formatter.Format
 import qualified ShellCheck.Formatter.GCC
 import qualified ShellCheck.Formatter.JSON
 import qualified ShellCheck.Formatter.TTY
+import qualified ShellCheck.Formatter.Quiet
 
 import           Control.Exception
 import           Control.Monad
@@ -125,7 +126,8 @@ formats options = Map.fromList [
     ("checkstyle", ShellCheck.Formatter.CheckStyle.format),
     ("gcc",  ShellCheck.Formatter.GCC.format),
     ("json", ShellCheck.Formatter.JSON.format),
-    ("tty",  ShellCheck.Formatter.TTY.format options)
+    ("tty",  ShellCheck.Formatter.TTY.format options),
+    ("quiet",  ShellCheck.Formatter.Quiet.format options)
     ]
 
 formatList = intercalate ", " names
diff --git a/src/ShellCheck/Formatter/Quiet.hs b/src/ShellCheck/Formatter/Quiet.hs
new file mode 100644
index 0000000..9ad8b97
--- /dev/null
+++ b/src/ShellCheck/Formatter/Quiet.hs
@@ -0,0 +1,37 @@
+{-
+    Copyright 2019 Austin Voecks
+
+    This file is part of ShellCheck.
+    https://www.shellcheck.net
+
+    ShellCheck is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    ShellCheck is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+-}
+module ShellCheck.Formatter.Quiet (format) where
+
+import ShellCheck.Interface
+import ShellCheck.Formatter.Format
+
+import Control.Monad
+import Data.IORef
+import System.Exit
+
+format :: FormatterOptions -> IO Formatter
+format options = do
+    topErrorRef <- newIORef []
+    return Formatter {
+        header = return (),
+        footer = return (),
+        onFailure = \ _ _ -> exitFailure,
+        onResult  = \ result _ -> unless (null $ crComments result) exitFailure
+    }