on master help sign in
Throw an error in case of duplicate compilers
ffbce96Jasper Van der Jeugt
src/Hakyll/Core/Rules/Internal.hs+17−5
@@ -16,6 +16,7 @@ import Control.Applicative (Applicative, (<$>))
16import Control.Monad.Reader (ask)
16import Control.Monad.Reader (ask)
17import Control.Monad.RWS (RWST, runRWST)
17import Control.Monad.RWS (RWST, runRWST)
18import Control.Monad.Trans (liftIO)
18import Control.Monad.Trans (liftIO)
19+import Data.Map (Map)
19import qualified Data.Map as M
20import qualified Data.Map as M
20import Data.Monoid (Monoid, mappend, mempty)
21import Data.Monoid (Monoid, mappend, mempty)
21import Data.Set (Set)
22import Data.Set (Set)
@@ -97,15 +98,26 @@ runRules rules provider = do
97 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
98 (_, _, ruleSet) <- runRWST (unRules rules) env emptyRulesState
98
99
99 -- Ensure compiler uniqueness
100 -- Ensure compiler uniqueness
100− let ruleSet' = ruleSet
101+ uniqueCompilers <- case fromListUnique (rulesCompilers ruleSet) of
101− { rulesCompilers = M.toList $
102+ Right m -> return m
102− M.fromListWith (flip const) (rulesCompilers ruleSet)
103+ Left id' -> error $
103− }
104+ "Hakyll.Core.Rules.Internal.runRules: duplicate compiler for " ++
105+ show id'
104
106
105− return ruleSet'
107+ return ruleSet {rulesCompilers = M.toList uniqueCompilers}
106 where
108 where
107 env = RulesRead
109 env = RulesRead
108 { rulesProvider = provider
110 { rulesProvider = provider
109 , rulesMatches = []
111 , rulesMatches = []
110 , rulesVersion = Nothing
112 , rulesVersion = Nothing
111 }
113 }
114+
115+
116+--------------------------------------------------------------------------------
117+fromListUnique :: Ord k => [(k, v)] -> Either k (Map k v)
118+fromListUnique = go M.empty
119+ where
120+ go m [] = Right m
121+ go m ((k, v) : zs) = case M.lookup k m of
122+ Nothing -> go (M.insert k v m) zs
123+ Just _ -> Left k
src/Hakyll/Core/Runtime.hs+2−1
@@ -53,7 +53,8 @@ run config verbosity rules = do
53 provider <- newProvider store (shouldIgnoreFile config) $
53 provider <- newProvider store (shouldIgnoreFile config) $
54 providerDirectory config
54 providerDirectory config
55 Logger.message logger "Running rules..."
55 Logger.message logger "Running rules..."
56+ Logger.flush logger
56− ruleSet <- runRules rules provider
57+ ruleSet <- runRules rules provider
57
58
58 -- Get old facts
59 -- Get old facts
59 mOldFacts <- Store.get store factsKey
60 mOldFacts <- Store.get store factsKey