diff --git a/shellcheck.1.md b/shellcheck.1.md index eb417ef..3e026cb 100644 --- a/shellcheck.1.md +++ b/shellcheck.1.md @@ -44,6 +44,13 @@ not warn at all, as `ksh` supports decimals in arithmetic contexts. is *auto*. **--color** without an argument is equivalent to **--color=always**. +**-i**\ *CODE1*[,*CODE2*...],\ **--include=***CODE1*[,*CODE2*...] + +: Explicitly include only the specified codes in the report. Subsequent **-i** + options are cumulative, but all the codes can be specified at once, + comma-separated as a single argument. Include options override any provided + exclude options. + **-e**\ *CODE1*[,*CODE2*...],\ **--exclude=***CODE1*[,*CODE2*...] : Explicitly exclude the specified codes from the report. Subsequent **-e** diff --git a/shellcheck.hs b/shellcheck.hs index e3487c0..a93da2a 100644 --- a/shellcheck.hs +++ b/shellcheck.hs @@ -88,6 +88,8 @@ options = [ Option "C" ["color"] (OptArg (maybe (Flag "color" "always") (Flag "color")) "WHEN") "Use color (auto, always, never)", + Option "i" ["include"] + (ReqArg (Flag "include") "CODE1,CODE2..") "Consider only given types of warnings", Option "e" ["exclude"] (ReqArg (Flag "exclude") "CODE1,CODE2..") "Exclude types of warnings", Option "f" ["format"] @@ -272,6 +274,18 @@ parseOption flag options = } } + Flag "include" str -> do + new <- mapM parseNum $ filter (not . null) $ split ',' str + let old = csIncludedWarnings . checkSpec $ options + return options { + checkSpec = (checkSpec options) { + csIncludedWarnings = + if null new + then old + else Just new `mappend` old + } + } + Flag "version" _ -> do liftIO printVersion throwError NoProblems diff --git a/src/ShellCheck/Checker.hs b/src/ShellCheck/Checker.hs index b92cad3..1efb073 100644 --- a/src/ShellCheck/Checker.hs +++ b/src/ShellCheck/Checker.hs @@ -94,11 +94,13 @@ checkScript sys spec = do (parseMessages ++ map translator analysisMessages) shouldInclude pc = - let code = cCode (pcComment pc) + severity <= csMinSeverity spec && + case csIncludedWarnings spec of + Nothing -> code `notElem` csExcludedWarnings spec + Just includedWarnings -> code `elem` includedWarnings + where + code = cCode (pcComment pc) severity = cSeverity (pcComment pc) - in - code `notElem` csExcludedWarnings spec && - severity <= csMinSeverity spec sortMessages = sortBy (comparing order) order pc = @@ -137,6 +139,13 @@ checkRecursive includes src = csCheckSourced = True } +checkOptionIncludes includes src = + checkWithSpec [] emptyCheckSpec { + csScript = src, + csIncludedWarnings = includes, + csCheckSourced = True + } + prop_findsParseIssue = check "echo \"$12\"" == [1037] prop_commentDisablesParseIssue1 = @@ -274,6 +283,21 @@ prop_sourcedFileUsesOriginalShellExtension = result == [2079] csCheckSourced = True } +prop_optionIncludes1 = + -- expect 2086, but not included, so not reported + null $ checkOptionIncludes (Just [2080]) "#!/bin/sh\n var='a b'\n echo $var" + +prop_optionIncludes2 = + -- expect 2086, included, so its reported + [2086] == checkOptionIncludes (Just [2086]) "#!/bin/sh\n var='a b'\n echo $var" + +prop_optionIncludes3 = + -- expect 2086, no inclusions provided, so its reported + [2086] == checkOptionIncludes Nothing "#!/bin/sh\n var='a b'\n echo $var" + +prop_optionIncludes4 = + -- expect 2086 & 2154, only 2154 included, so only its reported + [2154] == checkOptionIncludes (Just [2154]) "#!/bin/sh\n var='a b'\n echo $var\n echo $bar" return [] runTests = $quickCheckAll diff --git a/src/ShellCheck/Interface.hs b/src/ShellCheck/Interface.hs index 285042f..b492b3f 100644 --- a/src/ShellCheck/Interface.hs +++ b/src/ShellCheck/Interface.hs @@ -21,7 +21,7 @@ module ShellCheck.Interface ( SystemInterface(..) - , CheckSpec(csFilename, csScript, csCheckSourced, csExcludedWarnings, csShellTypeOverride, csMinSeverity) + , CheckSpec(csFilename, csScript, csCheckSourced, csIncludedWarnings, csExcludedWarnings, csShellTypeOverride, csMinSeverity) , CheckResult(crFilename, crComments) , ParseSpec(psFilename, psScript, psCheckSourced, psShellTypeOverride) , ParseResult(prComments, prTokenPositions, prRoot) @@ -80,6 +80,7 @@ data CheckSpec = CheckSpec { csScript :: String, csCheckSourced :: Bool, csExcludedWarnings :: [Integer], + csIncludedWarnings :: Maybe [Integer], csShellTypeOverride :: Maybe Shell, csMinSeverity :: Severity } deriving (Show, Eq) @@ -101,6 +102,7 @@ emptyCheckSpec = CheckSpec { csScript = "", csCheckSourced = False, csExcludedWarnings = [], + csIncludedWarnings = Nothing, csShellTypeOverride = Nothing, csMinSeverity = StyleC }