Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix test 4270 #4402

Merged
merged 8 commits into from
Nov 19, 2018
Merged
Prev Previous commit
Next Next commit
More granular file resolving function, add back warnings
  • Loading branch information
qrilka committed Nov 19, 2018

Unverified

This user has not yet uploaded their public signing key.
commit d96be328faea5b4b0b50b3e3edd6ee41157818d9
56 changes: 33 additions & 23 deletions src/Stack/Package.hs
Original file line number Diff line number Diff line change
@@ -804,14 +804,19 @@ resolveComponentFiles component build names = do
-- | Get all C sources and extra source files in a build.
buildOtherSources :: BuildInfo -> RIO Ctx [DotCabalPath]
buildOtherSources build = do
cwd <- liftIO getCurrentDir
dir <- asks (parent . ctxFile)
-- TODO: add warnMissing here too
csources <-
forMaybeM (cSources build) $ \fp ->
findCandidate [dir] (DotCabalCFile fp)
jsources <-
forMaybeM (targetJsSources build) $ \fp ->
findCandidate [dir] (DotCabalFile fp)
file <- asks ctxFile
let resolveDirFiles files toCabalPath =
forMaybeM files $ \fp -> do
result <- resolveDirFile dir fp
case result of
Nothing -> do
warnMissingFile "File" cwd fp file
return Nothing
Just p -> return $ Just (toCabalPath p)
csources <- resolveDirFiles (cSources build) DotCabalCFilePath
jsources <- resolveDirFiles (targetJsSources build) DotCabalFilePath
return (csources <> jsources)

-- | Get the target's JS sources.
@@ -1231,14 +1236,16 @@ findCandidate dirs name = do

-- Otherwise, return everything
(xs, ys) -> xs ++ ys
resolveCandidate
:: (MonadIO m, MonadThrow m)
=> Path Abs Dir -> FilePath.FilePath -> m [Path Abs File]
resolveCandidate x y = do
-- The standard canonicalizePath does not work for this case
p <- parseCollapsedAbsFile (toFilePath x FilePath.</> y)
exists <- doesFileExist p
return $ if exists then [p] else []
resolveCandidate dir = fmap maybeToList . resolveDirFile dir

resolveDirFile
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a comment explaining that symlinks will not be followed.

:: (MonadIO m, MonadThrow m)
=> Path Abs Dir -> FilePath.FilePath -> m (Maybe (Path Abs File))
resolveDirFile x y = do
-- The standard canonicalizePath does not work for this case
p <- parseCollapsedAbsFile (toFilePath x FilePath.</> y)
exists <- doesFileExist p
return $ if exists then Just p else Nothing

-- | Warn the user that multiple candidates are available for an
-- entry, but that we picked one anyway and continued.
@@ -1315,16 +1322,19 @@ resolveOrWarn subject resolver path =
file <- asks ctxFile
dir <- asks (parent . ctxFile)
result <- resolver dir path
when (isNothing result) $
prettyWarnL
[ fromString . T.unpack $ subject -- TODO: needs style?
, flow "listed in"
, maybe (pretty file) pretty (stripProperPrefix cwd file)
, flow "file does not exist:"
, style Dir . fromString $ path
]
when (isNothing result) $ warnMissingFile subject cwd path file
return result

warnMissingFile :: Text -> Path Abs Dir -> FilePath -> Path Abs File -> RIO Ctx ()
warnMissingFile subject cwd path fromFile =
prettyWarnL
[ fromString . T.unpack $ subject -- TODO: needs style?
, flow "listed in"
, maybe (pretty fromFile) pretty (stripProperPrefix cwd fromFile)
, flow "file does not exist:"
, style Dir . fromString $ path
]

-- | Resolve the file, if it can't be resolved, warn for the user
-- (purely to be helpful).
resolveFileOrWarn :: FilePath.FilePath