From 473bb666d8e531858f621fa9574c1a6f729236fe Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Wed, 13 Nov 2013 22:39:35 -0800 Subject: [PATCH] Support for checkstyle compatible xml output --- shellcheck.hs | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/shellcheck.hs b/shellcheck.hs index 9a5bf73..04d413c 100644 --- a/shellcheck.hs +++ b/shellcheck.hs @@ -16,6 +16,7 @@ along with this program. If not, see . -} import Control.Monad +import Data.Char import GHC.Exts import GHC.IO.Device import ShellCheck.Simple @@ -65,6 +66,7 @@ parseArguments argv = formats = Map.fromList [ ("json", forJson), ("gcc", forGcc), + ("checkstyle", forCheckstyle), ("tty", forTty) ] @@ -123,7 +125,7 @@ forJson options files = do putStrLn $ encodeStrict $ comments return . null $ comments ---- Mimic GCC "file:line:col: (error|warning|note): message" format +-- Mimic GCC "file:line:col: (error|warning|note): message" format forGcc options files = do files <- mapM process files return $ and files @@ -137,7 +139,7 @@ forGcc options files = do filename, ":", show $ scLine c, ":", show $ scColumn c, ": ", - case scSeverity c of + case scSeverity c of "error" -> "error" "warning" -> "warning" _ -> "note", @@ -145,7 +147,47 @@ forGcc options files = do concat . lines $ scMessage c, " [SC", show $ scCode c, "]" ] - + +-- Checkstyle compatible output. A bit of a hack to avoid XML dependencies +forCheckstyle options files = do + putStrLn "" + putStrLn "" + statuses <- mapM (\x -> process x `catch` report) files + putStrLn "" + return $ and statuses + where + process file = do + comments <- commentsFor file + putStrLn (formatFile file comments) + return $ null comments + report error = do + printErr $ show error + return False + + severity "error" = "error" + severity "warning" = "warning" + severity _ = "info" + attr s v = concat [ s, "='", escape v, "' " ] + escape msg = concatMap escape' msg + escape' c = if isOk c then [c] else "&#" ++ (show $ ord c) ++ ";" + isOk x = any ($x) [isAsciiUpper, isAsciiLower, isDigit, (`elem` " ./")] + + formatFile name comments = concat [ + "\n", + concatMap format comments, + "" + ] + + format c = concat [ + "\n" + ] + commentsFor file = liftM shellCheck $ readContents file readContents file = if file == "-" then getContents else readFile file