summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Run.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/Run.hs')
-rw-r--r--src/Hakyll/Core/Run.hs80
1 files changed, 47 insertions, 33 deletions
diff --git a/src/Hakyll/Core/Run.hs b/src/Hakyll/Core/Run.hs
index b4c69f1..54c22c2 100644
--- a/src/Hakyll/Core/Run.hs
+++ b/src/Hakyll/Core/Run.hs
@@ -10,7 +10,7 @@ import Control.Monad (filterM)
import Control.Monad.Trans (liftIO)
import Control.Applicative (Applicative, (<$>))
import Control.Monad.Reader (ReaderT, runReaderT, ask)
-import Control.Monad.State (StateT, evalStateT, get, modify)
+import Control.Monad.State.Strict (StateT, evalStateT, get, modify)
import Control.Arrow ((&&&))
import qualified Data.Map as M
import Data.Monoid (mempty, mappend)
@@ -31,25 +31,36 @@ import Hakyll.Core.DirectedGraph.DependencySolver
import Hakyll.Core.Writable
import Hakyll.Core.Store
import Hakyll.Core.Configuration
+import Hakyll.Core.Logger
-- | Run all rules needed, return the rule set used
--
run :: HakyllConfiguration -> Rules -> IO RuleSet
run configuration rules = do
- store <- makeStore $ storeDirectory configuration
- provider <- fileResourceProvider configuration
+ logger <- makeLogger
+
+ section logger "Initialising"
+ store <- timed logger "Creating store" $
+ makeStore $ storeDirectory configuration
+ provider <- timed logger "Creating provider" $
+ fileResourceProvider configuration
+
let ruleSet = runRules rules provider
compilers = rulesCompilers ruleSet
-- Extract the reader/state
reader = unRuntime $ addNewCompilers [] compilers
- state' = runReaderT reader $ env ruleSet provider store
+ state' = runReaderT reader $ env logger ruleSet provider store
evalStateT state' state
+
+ -- Flush and return
+ flushLogger logger
return ruleSet
where
- env ruleSet provider store = RuntimeEnvironment
- { hakyllConfiguration = configuration
+ env logger ruleSet provider store = RuntimeEnvironment
+ { hakyllLogger = logger
+ , hakyllConfiguration = configuration
, hakyllRoutes = rulesRoutes ruleSet
, hakyllResourceProvider = provider
, hakyllStore = store
@@ -61,7 +72,8 @@ run configuration rules = do
}
data RuntimeEnvironment = RuntimeEnvironment
- { hakyllConfiguration :: HakyllConfiguration
+ { hakyllLogger :: Logger
+ , hakyllConfiguration :: HakyllConfiguration
, hakyllRoutes :: Routes
, hakyllResourceProvider :: ResourceProvider
, hakyllStore :: Store
@@ -96,6 +108,8 @@ addNewCompilers :: [(Identifier, Compiler () CompileRule)]
-> Runtime ()
addNewCompilers oldCompilers newCompilers = Runtime $ do
-- Get some information
+ logger <- hakyllLogger <$> ask
+ section logger "Adding new compilers"
provider <- hakyllResourceProvider <$> ask
store <- hakyllStore <$> ask
@@ -115,31 +129,31 @@ addNewCompilers oldCompilers newCompilers = Runtime $ do
-- Find the old graph and append the new graph to it. This forms the
-- complete graph
- completeGraph <- mappend currentGraph . hakyllGraph <$> get
-
- -- Check which items are up-to-date. This only needs to happen for the new
- -- compilers
- oldModified <- hakyllModified <$> get
- newModified <- liftIO $ modified provider store $ map fst newCompilers
+ completeGraph <- timed logger "Creating graph" $
+ mappend currentGraph . hakyllGraph <$> get
- let modified' = oldModified `S.union` newModified
-
- -- Find obsolete items. Every item that is reachable from a modified
- -- item is considered obsolete. From these obsolete items, we are only
- -- interested in ones that are in the current subgraph.
- obsolete = S.filter (`member` currentGraph)
- $ reachableNodes modified' $ reverse completeGraph
+ orderedCompilers <- timed logger "Solving dependencies" $ do
+ -- Check which items are up-to-date. This only needs to happen for the new
+ -- compilers
+ oldModified <- hakyllModified <$> get
+ newModified <- liftIO $ modified provider store $ map fst newCompilers
- -- Solve the graph and retain only the obsolete items
- ordered = filter (`S.member` obsolete) $ solveDependencies currentGraph
+ let modified' = oldModified `S.union` newModified
+
+ -- Find obsolete items. Every item that is reachable from a modified
+ -- item is considered obsolete. From these obsolete items, we are only
+ -- interested in ones that are in the current subgraph.
+ obsolete = S.filter (`member` currentGraph)
+ $ reachableNodes modified' $ reverse completeGraph
- -- Join the order with the compilers again
- orderedCompilers = map (id &&& (compilerMap M.!)) ordered
+ -- Solve the graph and retain only the obsolete items
+ ordered = filter (`S.member` obsolete) $ solveDependencies currentGraph
- liftIO $ putStrLn "Adding compilers..."
- liftIO $ putStrLn $ "Added: " ++ show (map fst orderedCompilers)
+ -- Update the state
+ modify $ updateState modified' completeGraph
- modify $ updateState modified' completeGraph
+ -- Join the order with the compilers again
+ return $ map (id &&& (compilerMap M.!)) ordered
-- Now run the ordered list of compilers
unRuntime $ runCompilers orderedCompilers
@@ -157,33 +171,33 @@ runCompilers :: [(Identifier, Compiler () CompileRule)]
runCompilers [] = return ()
runCompilers ((id', compiler) : compilers) = Runtime $ do
-- Obtain information
+ logger <- hakyllLogger <$> ask
routes <- hakyllRoutes <$> ask
provider <- hakyllResourceProvider <$> ask
store <- hakyllStore <$> ask
modified' <- hakyllModified <$> get
+ section logger $ "Compiling " ++ show id'
+
let -- Check if the resource was modified
isModified = id' `S.member` modified'
-- Run the compiler
- result <- liftIO $ runCompiler compiler id' provider routes store isModified
- liftIO $ putStrLn $ "Generated target: " ++ show id'
+ result <- timed logger "Compiling item" $
+ liftIO $ runCompiler compiler id' provider routes store isModified
case result of
-- Compile rule for one item, easy stuff
CompileRule compiled -> do
case runRoutes routes id' of
Nothing -> return ()
- Just url -> do
- liftIO $ putStrLn $ "Routing " ++ show id' ++ " to " ++ url
+ Just url -> timed logger ("Routing to " ++ url) $ do
destination <-
destinationDirectory . hakyllConfiguration <$> ask
let path = destination </> url
liftIO $ makeDirectories path
liftIO $ write path compiled
- liftIO $ putStrLn ""
-
-- Continue for the remaining compilers
unRuntime $ runCompilers compilers