Skip to content

Commit 4ced806

Browse files
author
Andres Schmois
committed
Remove modtime and size from build cache
1 parent 151c39c commit 4ced806

File tree

2 files changed

+17
-45
lines changed

2 files changed

+17
-45
lines changed

src/Stack/Build/Source.hs

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ module Stack.Build.Source
1919

2020
import Stack.Prelude
2121
import qualified Pantry.SHA256 as SHA256
22-
import qualified Data.ByteString as S
2322
import Data.ByteString.Builder (toLazyByteString)
2423
import Conduit (ZipSink (..), withSourceFile)
25-
import qualified Data.Conduit.List as CL
2624
import qualified Distribution.PackageDescription as C
2725
import Data.List
2826
import qualified Data.Map as Map
@@ -40,7 +38,6 @@ import Stack.Types.Package
4038
import Stack.Types.SourceMap
4139
import System.FilePath (takeFileName)
4240
import System.IO.Error (isDoesNotExistError)
43-
import System.PosixCompat.Files (modificationTime, getFileStatus)
4441

4542
-- | loads and returns project packages
4643
projectLocalPackages :: 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
435429
addUnlistedToBuildCache
@@ -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.
507486
getPackageConfig

src/Stack/Types/Package.hs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
module Stack.Types.Package where
1212

1313
import Stack.Prelude
14-
import Foreign.C.Types (CTime)
1514
import qualified RIO.Text as T
1615
import Data.Aeson (ToJSON (..), FromJSON (..), (.=), (.:), object, withObject)
1716
import qualified Data.Map as M
@@ -342,27 +341,21 @@ instance Monoid InstallLocation where
342341
data InstalledPackageLocation = InstalledTo InstallLocation | ExtraGlobal
343342
deriving (Show, Eq)
344343

345-
data FileCacheInfo = FileCacheInfo
346-
{ fciModTime :: !CTime
347-
, fciSize :: !FileSize
348-
, fciHash :: !SHA256
344+
newtype FileCacheInfo = FileCacheInfo
345+
{ fciHash :: SHA256
349346
}
350347
deriving (Generic, Show, Eq, Typeable)
351348
instance NFData FileCacheInfo
352349

353350
-- Provided for storing the BuildCache values in a file. But maybe
354351
-- JSON/YAML isn't the right choice here, worth considering.
355352
instance ToJSON FileCacheInfo where
356-
toJSON (FileCacheInfo time size hash') = object
357-
[ "modtime" .= time
358-
, "size" .= size
359-
, "hash" .= hash'
353+
toJSON (FileCacheInfo hash') = object
354+
[ "hash" .= hash'
360355
]
361356
instance FromJSON FileCacheInfo where
362357
parseJSON = withObject "FileCacheInfo" $ \o -> FileCacheInfo
363-
<$> o .: "modtime"
364-
<*> o .: "size"
365-
<*> o .: "hash"
358+
<$> o .: "hash"
366359

367360
-- | A descriptor from a .cabal file indicating one of the following:
368361
--

0 commit comments

Comments
 (0)