on master help sign in
Better errors for redirects
83a95b3Jasper Van der Jeugt
lib/Hakyll/Web/Redirect.hs+11−4
@@ -9,7 +9,7 @@ module Hakyll.Web.Redirect
9import Control.Applicative ((<$>))
9import Control.Applicative ((<$>))
10import Control.Monad (forM_, when)
10import Control.Monad (forM_, when)
11import Data.Binary (Binary (..))
11import Data.Binary (Binary (..))
12−import Data.List (nub)
12+import Data.List (sort, group)
13import Hakyll.Core.Compiler
13import Hakyll.Core.Compiler
14import Hakyll.Core.Identifier
14import Hakyll.Core.Identifier
15import Hakyll.Core.Routes
15import Hakyll.Core.Routes
@@ -57,9 +57,16 @@ import Hakyll.Core.Writable (Writable (..))
57createRedirects :: [(Identifier, String)] -> Rules ()
57createRedirects :: [(Identifier, String)] -> Rules ()
58createRedirects redirects =
58createRedirects redirects =
59 do -- redirects are many-to-fewer; keys must be unique, and must point somewhere else:
59 do -- redirects are many-to-fewer; keys must be unique, and must point somewhere else:
60− let keys = map fst redirects
60+ let gkeys = group $ sort $ map fst redirects
61− when (length keys /= length (nub keys)) $ error "Overlapping 301 redirects; check your mapping for redundant keys"
61+ forM_ gkeys $ \gkey -> case gkey of
62+ (k : _ : _) -> fail $
63+ "Duplicate 301 redirects; " ++ show k ++ " is ambiguous."
64+ _ -> return ()
65+
66+ forM_ redirects $ \(r, t) ->
67+ when (toFilePath r == t) $ fail $
62− when (or $ map (\(r,t) -> toFilePath r == t) redirects) $ error "Self-redirect detected: at least one redirect's target points to itself."
68+ "Self-redirect detected: " ++ show r ++ " points to itself."
69+
63 forM_ redirects $ \(ident, to) ->
70 forM_ redirects $ \(ident, to) ->
64 create [ident] $ do
71 create [ident] $ do
65 route idRoute
72 route idRoute