Warn when using &/| between test statements
This commit is contained in:
parent
17e591233f
commit
a62d9f10c2
|
@ -4,6 +4,7 @@
|
||||||
- SC2261: Warn about multiple competing redirections
|
- SC2261: Warn about multiple competing redirections
|
||||||
- SC2262/SC2263: Warn about aliases declared and used in the same parsing unit
|
- SC2262/SC2263: Warn about aliases declared and used in the same parsing unit
|
||||||
- SC2264: Warn about wrapper functions that blatantly recurse
|
- SC2264: Warn about wrapper functions that blatantly recurse
|
||||||
|
- SC2265/SC2266: Warn when using & or | with test statements
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
||||||
|
|
|
@ -192,6 +192,7 @@ nodeChecks = [
|
||||||
,checkTranslatedStringVariable
|
,checkTranslatedStringVariable
|
||||||
,checkModifiedArithmeticInRedirection
|
,checkModifiedArithmeticInRedirection
|
||||||
,checkBlatantRecursion
|
,checkBlatantRecursion
|
||||||
|
,checkBadTestAndOr
|
||||||
]
|
]
|
||||||
|
|
||||||
optionalChecks = map fst optionalTreeChecks
|
optionalChecks = map fst optionalTreeChecks
|
||||||
|
@ -3878,5 +3879,50 @@ checkBlatantRecursion params t =
|
||||||
("This function unconditionally re-invokes itself. Missing 'command'?")
|
("This function unconditionally re-invokes itself. Missing 'command'?")
|
||||||
(fixWith [replaceStart (getId t) params 0 $ "command "])
|
(fixWith [replaceStart (getId t) params 0 $ "command "])
|
||||||
|
|
||||||
|
|
||||||
|
prop_checkBadTestAndOr1 = verify checkBadTestAndOr "[ x ] & [ y ]"
|
||||||
|
prop_checkBadTestAndOr2 = verify checkBadTestAndOr "test -e foo & [ y ]"
|
||||||
|
prop_checkBadTestAndOr3 = verify checkBadTestAndOr "[ x ] | [ y ]"
|
||||||
|
checkBadTestAndOr params t =
|
||||||
|
case t of
|
||||||
|
T_Pipeline _ seps cmds@(_:_:_) -> checkOrs seps cmds
|
||||||
|
T_Backgrounded id cmd -> checkAnds id cmd
|
||||||
|
_ -> return ()
|
||||||
|
where
|
||||||
|
checkOrs seps cmds =
|
||||||
|
let maybeSeps = map Just seps
|
||||||
|
commandWithSeps = zip3 (Nothing:maybeSeps) cmds (maybeSeps ++ [Nothing])
|
||||||
|
in
|
||||||
|
mapM_ checkTest commandWithSeps
|
||||||
|
checkTest (before, cmd, after) =
|
||||||
|
when (isTest cmd) $ do
|
||||||
|
checkPipe before
|
||||||
|
checkPipe after
|
||||||
|
|
||||||
|
checkPipe t =
|
||||||
|
case t of
|
||||||
|
Just (T_Pipe id "|") ->
|
||||||
|
warnWithFix id 2266 "Use || for logical OR. Single | will pipe." $
|
||||||
|
fixWith [replaceEnd id params 0 "|"]
|
||||||
|
_ -> return ()
|
||||||
|
|
||||||
|
checkAnds id t =
|
||||||
|
case t of
|
||||||
|
T_AndIf _ _ rhs -> checkAnds id rhs
|
||||||
|
T_OrIf _ _ rhs -> checkAnds id rhs
|
||||||
|
T_Pipeline _ _ list | not (null list) -> checkAnds id (last list)
|
||||||
|
cmd -> when (isTest cmd) $
|
||||||
|
errWithFix id 2265 "Use && for logical AND. Single & will background and return true." $
|
||||||
|
(fixWith [replaceEnd id params 0 "&"])
|
||||||
|
|
||||||
|
isTest t =
|
||||||
|
case t of
|
||||||
|
T_Condition {} -> True
|
||||||
|
T_SimpleCommand {} -> t `isCommand` "test"
|
||||||
|
T_Redirecting _ _ t -> isTest t
|
||||||
|
T_Annotation _ _ t -> isTest t
|
||||||
|
_ -> False
|
||||||
|
|
||||||
|
|
||||||
return []
|
return []
|
||||||
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
||||||
|
|
Loading…
Reference in New Issue