@@ -19,10 +19,8 @@ module Stack.Build.Source
1919
2020import Stack.Prelude
2121import qualified Pantry.SHA256 as SHA256
22- import qualified Data.ByteString as S
2322import Data.ByteString.Builder (toLazyByteString )
2423import Conduit (ZipSink (.. ), withSourceFile )
25- import qualified Data.Conduit.List as CL
2624import qualified Distribution.PackageDescription as C
2725import Data.List
2826import qualified Data.Map as Map
@@ -40,7 +38,6 @@ import Stack.Types.Package
4038import Stack.Types.SourceMap
4139import System.FilePath (takeFileName )
4240import System.IO.Error (isDoesNotExistError )
43- import System.PosixCompat.Files (modificationTime , getFileStatus )
4441
4542-- | loads and returns project packages
4643projectLocalPackages :: HasEnvConfig env
@@ -415,21 +412,18 @@ checkBuildCache oldCache files = do
415412 fileTimes
416413 oldCache
417414 where
418- go :: FilePath -> Maybe ( FileSize , SHA256 ) -> Maybe FileCacheInfo -> m (Set FilePath , Map FilePath FileCacheInfo )
415+ go :: FilePath -> Maybe SHA256 -> Maybe FileCacheInfo -> m (Set FilePath , Map FilePath FileCacheInfo )
419416 -- Filter out the cabal_macros file to avoid spurious recompilations
420417 go fp _ _ | takeFileName fp == " cabal_macros.h" = return (Set. empty, Map. empty)
421418 -- Common case where it's in the cache and on the filesystem.
422- go fp (Just (size, digest') ) (Just fci)
419+ go fp (Just digest') (Just fci)
423420 | fciHash fci == digest' = return (Set. empty, Map. singleton fp fci)
424- | otherwise = do
425- newFci <- calcFci (size,digest') fp
426- return (Set. singleton fp, Map. singleton fp newFci)
421+ | otherwise = return (Set. singleton fp, Map. singleton fp $ FileCacheInfo digest')
427422 -- Missing file. Add it to dirty files, but no FileCacheInfo.
428423 go fp Nothing _ = return (Set. singleton fp, Map. empty)
429424 -- Missing cache. Add it to dirty files and compute FileCacheInfo.
430- go fp (Just (size, digest')) Nothing = do
431- newFci <- calcFci (size,digest') fp
432- return (Set. singleton fp, Map. singleton fp newFci)
425+ go fp (Just digest') Nothing =
426+ return (Set. singleton fp, Map. singleton fp $ FileCacheInfo digest')
433427
434428-- | Returns entries to add to the build cache for any newly found unlisted modules
435429addUnlistedToBuildCache
@@ -454,7 +448,7 @@ addUnlistedToBuildCache pkg cabalFP nonLibComponents buildCaches = do
454448 mdigest <- getFileDigestMaybe fp
455449 case mdigest of
456450 Nothing -> return Map. empty
457- Just digest' -> Map. singleton fp <$> calcFci digest' fp
451+ Just digest' -> return . Map. singleton fp $ FileCacheInfo digest'
458452
459453-- | Gets list of Paths for files relevant to a set of components in a package.
460454-- Note that the library component, if any, is always automatically added to the
@@ -475,33 +469,18 @@ getPackageFilesForTargets pkg cabalFP nonLibComponents = do
475469 M. filterWithKey (\ component _ -> component `elem` components) compFiles
476470 return (componentsFiles, warnings)
477471
478- -- | Get file digest
479- getFileDigestMaybe :: MonadIO m => FilePath -> m (Maybe ( FileSize , SHA256 ) )
480- getFileDigestMaybe fp =
472+ -- | Get file digest, if it exists
473+ getFileDigestMaybe :: MonadIO m => FilePath -> m (Maybe SHA256 )
474+ getFileDigestMaybe fp = do
481475 liftIO
482476 (catch
483- (liftM
484- (\ (size, digest) -> Just (FileSize size, digest))
485- (withSourceFile fp $ \ src -> runConduit $ src .| getZipSink
486- ((,)
487- <$> ZipSink (CL. fold
488- (\ x y -> x + fromIntegral (S. length y))
489- 0 )
490- <*> ZipSink SHA256. sinkHash)))
477+ (liftM Just . withSourceFile fp $ getDigest)
491478 (\ e ->
492479 if isDoesNotExistError e
493480 then return Nothing
494481 else throwM e))
495-
496- -- | Create FileCacheInfo for a file.
497- calcFci :: MonadIO m => (FileSize ,SHA256 ) -> FilePath -> m FileCacheInfo
498- calcFci (size, digest) fp = liftIO $ do
499- modTime' <- modificationTime <$> getFileStatus fp
500- return FileCacheInfo
501- { fciModTime = modTime'
502- , fciSize = size
503- , fciHash = digest
504- }
482+ where
483+ getDigest src = runConduit $ src .| getZipSink (ZipSink SHA256. sinkHash)
505484
506485-- | Get 'PackageConfig' for package given its name.
507486getPackageConfig
0 commit comments