on master help sign in
Add modification time access for resources
6808c53Jasper Van der Jeugt
src/Hakyll/Core/Resource/Provider.hs+9−5
@@ -23,6 +23,7 @@ import Control.Concurrent (MVar, readMVar, modifyMVar_, newMVar)
23import Data.Map (Map)
23import Data.Map (Map)
24import qualified Data.Map as M
24import qualified Data.Map as M
25
25
26+import Data.Time (UTCTime)
26import qualified Crypto.Hash.MD5 as MD5
27import qualified Crypto.Hash.MD5 as MD5
27import qualified Data.ByteString as B
28import qualified Data.ByteString as B
28import qualified Data.ByteString.Lazy as LB
29import qualified Data.ByteString.Lazy as LB
@@ -34,13 +35,15 @@ import Hakyll.Core.Resource
34--
35--
35data ResourceProvider = ResourceProvider
36data ResourceProvider = ResourceProvider
36 { -- | A list of all resources this provider is able to provide
37 { -- | A list of all resources this provider is able to provide
37− resourceList :: [Resource]
38+ resourceList :: [Resource]
38 , -- | Retrieve a certain resource as string
39 , -- | Retrieve a certain resource as string
39− resourceString :: Resource -> IO String
40+ resourceString :: Resource -> IO String
40 , -- | Retrieve a certain resource as lazy bytestring
41 , -- | Retrieve a certain resource as lazy bytestring
41− resourceLBS :: Resource -> IO LB.ByteString
42+ resourceLBS :: Resource -> IO LB.ByteString
43+ , -- | Check when a resource was last modified
44+ resourceModificationTime :: Resource -> IO UTCTime
42 , -- | Cache keeping track of modified items
45 , -- | Cache keeping track of modified items
43− resourceModifiedCache :: MVar (Map Resource Bool)
46+ resourceModifiedCache :: MVar (Map Resource Bool)
44 }
47 }
45
48
46-- | Create a resource provider
49-- | Create a resource provider
@@ -48,8 +51,9 @@ data ResourceProvider = ResourceProvider
48makeResourceProvider :: [Resource] -- ^ Resource list
51makeResourceProvider :: [Resource] -- ^ Resource list
49 -> (Resource -> IO String) -- ^ String reader
52 -> (Resource -> IO String) -- ^ String reader
50 -> (Resource -> IO LB.ByteString) -- ^ ByteString reader
53 -> (Resource -> IO LB.ByteString) -- ^ ByteString reader
54+ -> (Resource -> IO UTCTime) -- ^ Time checker
51 -> IO ResourceProvider -- ^ Resulting provider
55 -> IO ResourceProvider -- ^ Resulting provider
52−makeResourceProvider l s b = ResourceProvider l s b <$> newMVar M.empty
56+makeResourceProvider l s b t = ResourceProvider l s b t <$> newMVar M.empty
53
57
54-- | Check if a given identifier has a resource
58-- | Check if a given identifier has a resource
55--
59--
src/Hakyll/Core/Resource/Provider/Dummy.hs+3−1
@@ -7,9 +7,10 @@ module Hakyll.Core.Resource.Provider.Dummy
7import Data.Map (Map)
7import Data.Map (Map)
8import qualified Data.Map as M
8import qualified Data.Map as M
9
9
10+import Data.Time (getCurrentTime)
11+import Data.ByteString.Lazy (ByteString)
10import qualified Data.Text.Lazy as TL
12import qualified Data.Text.Lazy as TL
11import qualified Data.Text.Lazy.Encoding as TL
13import qualified Data.Text.Lazy.Encoding as TL
12−import Data.ByteString.Lazy (ByteString)
13
14
14import Hakyll.Core.Resource
15import Hakyll.Core.Resource
15import Hakyll.Core.Resource.Provider
16import Hakyll.Core.Resource.Provider
@@ -21,3 +22,4 @@ dummyResourceProvider vfs = makeResourceProvider
21 (map Resource (M.keys vfs))
22 (map Resource (M.keys vfs))
22 (return . TL.unpack . TL.decodeUtf8 . (vfs M.!) . unResource)
23 (return . TL.unpack . TL.decodeUtf8 . (vfs M.!) . unResource)
23 (return . (vfs M.!) . unResource)
24 (return . (vfs M.!) . unResource)
25+ (const getCurrentTime)
src/Hakyll/Core/Resource/Provider/File.hs+10
@@ -6,6 +6,10 @@ module Hakyll.Core.Resource.Provider.File
6
6
7import Control.Applicative ((<$>))
7import Control.Applicative ((<$>))
8
8
9+import Data.Time (readTime)
10+import System.Directory (getModificationTime)
11+import System.Locale (defaultTimeLocale)
12+import System.Time (formatCalendarTime, toCalendarTime)
9import qualified Data.ByteString.Lazy as LB
13import qualified Data.ByteString.Lazy as LB
10
14
11import Hakyll.Core.Resource
15import Hakyll.Core.Resource
@@ -22,3 +26,9 @@ fileResourceProvider configuration = do
22 getRecursiveContents False "."
26 getRecursiveContents False "."
23 makeResourceProvider list (readFile . unResource)
27 makeResourceProvider list (readFile . unResource)
24 (LB.readFile . unResource)
28 (LB.readFile . unResource)
29+ mtime
30+ where
31+ mtime (Resource r) = do
32+ ct <- toCalendarTime =<< getModificationTime r
33+ let str = formatCalendarTime defaultTimeLocale "%s" ct
34+ return $ readTime defaultTimeLocale "%s" str