summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Provider
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/Provider')
-rw-r--r--src/Hakyll/Core/Provider/Internal.hs38
-rw-r--r--src/Hakyll/Core/Provider/Metadata.hs8
-rw-r--r--src/Hakyll/Core/Provider/MetadataCache.hs2
-rw-r--r--src/Hakyll/Core/Provider/Modified.hs21
4 files changed, 40 insertions, 29 deletions
diff --git a/src/Hakyll/Core/Provider/Internal.hs b/src/Hakyll/Core/Provider/Internal.hs
index 54332a9..1360ef5 100644
--- a/src/Hakyll/Core/Provider/Internal.hs
+++ b/src/Hakyll/Core/Provider/Internal.hs
@@ -7,32 +7,35 @@ module Hakyll.Core.Provider.Internal
, resourceExists
, resourceMetadataResource
+ , resourceFilePath
, resourceString
, resourceLBS
) where
--------------------------------------------------------------------------------
-import Control.Applicative ((<$>))
-import qualified Data.ByteString.Lazy as BL
+import Control.Applicative ((<$>))
+import qualified Data.ByteString.Lazy as BL
import Data.IORef
-import Data.Map (Map)
-import qualified Data.Map as M
-import Data.Set (Set)
-import qualified Data.Set as S
-import System.FilePath (addExtension)
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Set (Set)
+import qualified Data.Set as S
+import System.FilePath (addExtension, (</>))
--------------------------------------------------------------------------------
+import Hakyll.Core.Identifier
import Hakyll.Core.Store
import Hakyll.Core.Util.File
-import Hakyll.Core.Identifier
--------------------------------------------------------------------------------
-- | Responsible for retrieving and listing resources
data Provider = Provider
- { -- | A list of all files found
+ { -- Top of the provided directory
+ providerDirectory :: FilePath
+ , -- | A list of all files found
providerSet :: Set Identifier
, -- | Cache keeping track of modified files
providerModifiedCache :: IORef (Map Identifier Bool)
@@ -49,9 +52,9 @@ newProvider :: Store -- ^ Store to use
-> IO Provider -- ^ Resulting provider
newProvider store ignore directory = do
list <- map fromFilePath . filter (not . ignore) <$>
- getRecursiveContents False directory
+ getRecursiveContents directory
cache <- newIORef M.empty
- return $ Provider (S.fromList list) cache store
+ return $ Provider directory (S.fromList list) cache store
--------------------------------------------------------------------------------
@@ -75,12 +78,17 @@ resourceMetadataResource =
--------------------------------------------------------------------------------
+resourceFilePath :: Provider -> Identifier -> FilePath
+resourceFilePath p i = providerDirectory p </> toFilePath i
+
+
+--------------------------------------------------------------------------------
-- | Get the raw body of a resource as string
-resourceString :: Identifier -> IO String
-resourceString = readFile . toFilePath
+resourceString :: Provider -> Identifier -> IO String
+resourceString p i = readFile $ resourceFilePath p i
--------------------------------------------------------------------------------
-- | Get the raw body of a resource of a lazy bytestring
-resourceLBS :: Identifier -> IO BL.ByteString
-resourceLBS = BL.readFile . toFilePath
+resourceLBS :: Provider -> Identifier -> IO BL.ByteString
+resourceLBS p i = BL.readFile $ resourceFilePath p i
diff --git a/src/Hakyll/Core/Provider/Metadata.hs b/src/Hakyll/Core/Provider/Metadata.hs
index 18536f4..52c07cb 100644
--- a/src/Hakyll/Core/Provider/Metadata.hs
+++ b/src/Hakyll/Core/Provider/Metadata.hs
@@ -25,19 +25,19 @@ import Hakyll.Core.Util.String
--------------------------------------------------------------------------------
loadMetadata :: Provider -> Identifier -> IO (Metadata, Maybe String)
-loadMetadata rp identifier = do
+loadMetadata p identifier = do
hasHeader <- probablyHasMetadataHeader fp
(md, body) <- if hasHeader
then second Just <$> loadMetadataHeader fp
else return (M.empty, Nothing)
- emd <- if resourceExists rp mi then loadMetadataFile mfp else return M.empty
+ emd <- if resourceExists p mi then loadMetadataFile mfp else return M.empty
return (M.union md emd, body)
where
- fp = toFilePath identifier
+ fp = resourceFilePath p identifier
mi = resourceMetadataResource identifier
- mfp = toFilePath mi
+ mfp = resourceFilePath p mi
--------------------------------------------------------------------------------
diff --git a/src/Hakyll/Core/Provider/MetadataCache.hs b/src/Hakyll/Core/Provider/MetadataCache.hs
index cd67370..03652e7 100644
--- a/src/Hakyll/Core/Provider/MetadataCache.hs
+++ b/src/Hakyll/Core/Provider/MetadataCache.hs
@@ -29,7 +29,7 @@ resourceBody p r = do
load p r
Store.Found bd <- Store.get (providerStore p)
[name, toFilePath r, "body"]
- maybe (resourceString r) return bd
+ maybe (resourceString p r) return bd
--------------------------------------------------------------------------------
diff --git a/src/Hakyll/Core/Provider/Modified.hs b/src/Hakyll/Core/Provider/Modified.hs
index 166019d..08bb66a 100644
--- a/src/Hakyll/Core/Provider/Modified.hs
+++ b/src/Hakyll/Core/Provider/Modified.hs
@@ -15,6 +15,7 @@ import Data.IORef
import qualified Data.Map as M
import Data.Time (UTCTime)
import System.Directory (getModificationTime)
+import System.FilePath ((</>))
--------------------------------------------------------------------------------
@@ -28,7 +29,7 @@ import qualified Hakyll.Core.Store as Store
--------------------------------------------------------------------------------
-- | A resource is modified if it or its metadata has changed
resourceModified :: Provider -> Identifier -> IO Bool
-resourceModified rp r
+resourceModified p r
| not exists = return False
| otherwise = do
cache <- readIORef cacheRef
@@ -38,19 +39,20 @@ resourceModified rp r
-- Check if the actual file was modified, and do a recursive
-- call to check if the metadata file was modified
m <- (||)
- <$> fileDigestModified store (toFilePath r)
- <*> resourceModified rp (resourceMetadataResource r)
+ <$> fileDigestModified store filePath
+ <*> resourceModified p (resourceMetadataResource r)
modifyIORef cacheRef (M.insert normalized m)
-- Important! (But ugly)
- when m $ resourceInvalidateMetadataCache rp r
+ when m $ resourceInvalidateMetadataCache p r
return m
where
normalized = setVersion Nothing r
- exists = resourceExists rp r
- store = providerStore rp
- cacheRef = providerModifiedCache rp
+ exists = resourceExists p r
+ store = providerStore p
+ cacheRef = providerModifiedCache p
+ filePath = resourceFilePath p r
--------------------------------------------------------------------------------
@@ -79,5 +81,6 @@ fileDigest = fmap MD5.hashlazy . BL.readFile
--------------------------------------------------------------------------------
-resourceModificationTime :: Identifier -> IO UTCTime
-resourceModificationTime = getModificationTime . toFilePath
+resourceModificationTime :: Provider -> Identifier -> IO UTCTime
+resourceModificationTime p i =
+ getModificationTime $ providerDirectory p </> toFilePath i