Treat $x/ or $(x)/ as ./ when finding sourced files (fixes #1998)
This commit is contained in:
parent
1b884a17ea
commit
210cdcd01a
|
@ -8,6 +8,9 @@
|
||||||
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
||||||
is still purely cosmetic and does not allow ShellCheck to continue.
|
is still purely cosmetic and does not allow ShellCheck to continue.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- SC1090: A leading `$x/` or `$(x)/` is now treated as `./` when locating files
|
||||||
|
|
||||||
|
|
||||||
## v0.7.1 - 2020-04-04
|
## v0.7.1 - 2020-04-04
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
@ -503,6 +503,11 @@ isCommandSubstitution t = case t of
|
||||||
T_Backticked {} -> True
|
T_Backticked {} -> True
|
||||||
_ -> False
|
_ -> False
|
||||||
|
|
||||||
|
-- Is this an expansion that results in a simple string?
|
||||||
|
isStringExpansion t = isCommandSubstitution t || case t of
|
||||||
|
T_DollarArithmetic {} -> True
|
||||||
|
T_DollarBraced {} -> not (isArrayExpansion t)
|
||||||
|
_ -> False
|
||||||
|
|
||||||
-- Is this a T_Annotation that ignores a specific code?
|
-- Is this a T_Annotation that ignores a specific code?
|
||||||
isAnnotationIgnoringCode code t =
|
isAnnotationIgnoringCode code t =
|
||||||
|
|
|
@ -229,6 +229,12 @@ prop_cantSourceDynamic =
|
||||||
prop_cantSourceDynamic2 =
|
prop_cantSourceDynamic2 =
|
||||||
[1090] == checkWithIncludes [("lib", "")] "source ~/foo"
|
[1090] == checkWithIncludes [("lib", "")] "source ~/foo"
|
||||||
|
|
||||||
|
prop_canStripPrefixAndSource =
|
||||||
|
null $ checkWithIncludes [("./lib", "")] "source \"$MYDIR/lib\""
|
||||||
|
|
||||||
|
prop_canStripPrefixAndSource2 =
|
||||||
|
null $ checkWithIncludes [("./utils.sh", "")] "source \"$(dirname \"${BASH_SOURCE[0]}\")/utils.sh\""
|
||||||
|
|
||||||
prop_canSourceDynamicWhenRedirected =
|
prop_canSourceDynamicWhenRedirected =
|
||||||
null $ checkWithIncludes [("lib", "")] "#shellcheck source=lib\n. \"$1\""
|
null $ checkWithIncludes [("lib", "")] "#shellcheck source=lib\n. \"$1\""
|
||||||
|
|
||||||
|
|
|
@ -2122,7 +2122,7 @@ readSource t@(T_Redirecting _ _ (T_SimpleCommand cmdId _ (cmd:file':rest'))) = d
|
||||||
let file = getFile file' rest'
|
let file = getFile file' rest'
|
||||||
override <- getSourceOverride
|
override <- getSourceOverride
|
||||||
let literalFile = do
|
let literalFile = do
|
||||||
name <- override `mplus` getLiteralString file
|
name <- override `mplus` getLiteralString file `mplus` stripDynamicPrefix file
|
||||||
-- Hack to avoid 'source ~/foo' trying to read from literal tilde
|
-- Hack to avoid 'source ~/foo' trying to read from literal tilde
|
||||||
guard . not $ "~/" `isPrefixOf` name
|
guard . not $ "~/" `isPrefixOf` name
|
||||||
return name
|
return name
|
||||||
|
@ -2182,6 +2182,16 @@ readSource t@(T_Redirecting _ _ (T_SimpleCommand cmdId _ (cmd:file':rest'))) = d
|
||||||
SourcePath x -> Just x
|
SourcePath x -> Just x
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
|
||||||
|
-- If the word has a single expansion as the directory, try stripping it
|
||||||
|
-- This affects `$foo/bar` but not `${foo}-dir/bar` or `/foo/$file`
|
||||||
|
stripDynamicPrefix word =
|
||||||
|
case getWordParts word of
|
||||||
|
exp : rest | isStringExpansion exp -> do
|
||||||
|
str <- getLiteralString (T_NormalWord (Id 0) rest)
|
||||||
|
guard $ "/" `isPrefixOf` str
|
||||||
|
return $ "." ++ str
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
subRead name script =
|
subRead name script =
|
||||||
withContext (ContextSource name) $
|
withContext (ContextSource name) $
|
||||||
inSeparateContext $
|
inSeparateContext $
|
||||||
|
|
Loading…
Reference in New Issue