on master help sign in
Move modified cache to resource provider

Currently, it's kept twice: in Run and in the Provider. On the long term, it should be migrated entirely to the Provider, this can be done when the new dependency manager is finished.

commit3d2b2506d040546d74e83f6d9b8b4e0c45026f09 authorJasper Van der Jeugt <jaspervdj@gmail.com> dateWed 6 Apr 2011, 09:30 (16 years ago) parent0156636
3 files changed+31−4
src/Hakyll/Core/Resource/Provider.hs+24−1 src/Hakyll/Core/Resource/Provider/File.hs+6 src/Hakyll/Core/Run.hs+1−3
src/Hakyll/Core/Resource/Provider.hs+24−1
@@ -17,8 +17,11 @@ module Hakyll.Core.Resource.Provider
1717 , resourceModified
1818 ) where
1919
20+import Control.Concurrent (MVar, readMVar, modifyMVar_)
2021import Control.Monad ((<=<))
2122import Data.Word (Word8)
23+import Data.Map (Map)
24+import qualified Data.Map as M
2225
2326import qualified Data.ByteString.Lazy as LB
2427import OpenSSL.Digest.ByteString.Lazy (digest)
@@ -37,6 +40,8 @@ data ResourceProvider = ResourceProvider
3740 resourceString :: Resource -> IO String
3841 , -- | Retrieve a certain resource as lazy bytestring
3942 resourceLazyByteString :: Resource -> IO LB.ByteString
43+ , -- | Cache keeping track of modified items
44+ resourceModifiedCache :: MVar (Map Resource Bool)
4045 }
4146
4247-- | Check if a given identifier has a resource
@@ -53,6 +58,24 @@ resourceDigest provider = digest MD5 <=< resourceLazyByteString provider
5358--
5459resourceModified :: ResourceProvider -> Resource -> Store -> IO Bool
5560resourceModified provider resource store = do
61+ cache <- readMVar mvar
62+ case M.lookup resource cache of
63+ -- Already in the cache
64+ Just m -> return m
65+ -- Not yet in the cache, check digests (if it exists)
66+ Nothing -> do
67+ m <- if resourceExists provider (unResource resource)
68+ then digestModified provider resource store
69+ else return False
70+ modifyMVar_ mvar (return . M.insert resource m)
71+ return m
72+ where
73+ mvar = resourceModifiedCache provider
74+
75+-- | Check if a resource digest was modified
76+--
77+digestModified :: ResourceProvider -> Resource -> Store -> IO Bool
78+digestModified provider resource store = do
5679 -- Get the latest seen digest from the store
5780 lastDigest <- storeGet store itemName $ unResource resource
5881 -- Calculate the digest for the resource
@@ -65,4 +88,4 @@ resourceModified provider resource store = do
6588 else do storeSet store itemName (unResource resource) newDigest
6689 return True
6790 where
68− itemName = "Hakyll.Core.ResourceProvider.resourceModified"
91+ itemName = "Hakyll.Core.ResourceProvider.digestModified"
src/Hakyll/Core/Resource/Provider/File.hs+6
@@ -5,6 +5,8 @@ module Hakyll.Core.Resource.Provider.File
55 ) where
66
77import Control.Applicative ((<$>))
8+import Control.Concurrent (newMVar)
9+import qualified Data.Map as M
810
911import qualified Data.ByteString.Lazy as LB
1012
@@ -22,9 +24,13 @@ fileResourceProvider configuration = do
2224 list <- map parseIdentifier . filter (not . ignoreFile configuration) <$>
2325 getRecursiveContents False "."
2426
27+ -- MVar for the cache
28+ mvar <- newMVar M.empty
29+
2530 -- Construct a resource provider
2631 return ResourceProvider
2732 { resourceList = map Resource list
2833 , resourceString = readFile . toFilePath . unResource
2934 , resourceLazyByteString = LB.readFile . toFilePath . unResource
35+ , resourceModifiedCache = mvar
3036 }
src/Hakyll/Core/Run.hs+1−3
@@ -100,9 +100,7 @@ modified :: ResourceProvider -- ^ Resource provider
100100 -> [Identifier] -- ^ Identifiers to check
101101 -> IO (Set Identifier) -- ^ Modified resources
102102modified provider store ids = fmap S.fromList $ flip filterM ids $ \id' ->
103− if resourceExists provider id'
104− then resourceModified provider (Resource id') store
105− else return False
103+ resourceModified provider (Resource id') store
106104
107105-- | Add a number of compilers and continue using these compilers
108106--