2012-12-29 08:53:59 +00:00
|
|
|
module Hakyll.Preview.Poll
|
2011-02-21 12:35:20 +00:00
|
|
|
( previewPoll
|
|
|
|
) where
|
|
|
|
|
2012-12-29 08:53:59 +00:00
|
|
|
--------------------------------------------------------------------------------
|
2013-03-30 14:28:23 +00:00
|
|
|
import Control.Monad (void)
|
|
|
|
import Data.List (isPrefixOf)
|
|
|
|
import Filesystem.Path.CurrentOS (decodeString, encodeString)
|
|
|
|
import System.Directory (canonicalizePath)
|
2013-03-30 15:24:20 +00:00
|
|
|
import System.FSNotify (startManagerConf, watchTree,
|
|
|
|
Event(..), WatchConfig(..))
|
2013-03-30 14:28:23 +00:00
|
|
|
import System.IO.Error (catchIOError)
|
2012-12-29 08:53:59 +00:00
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
import Hakyll.Core.Configuration
|
2011-02-21 12:35:20 +00:00
|
|
|
|
|
|
|
|
2013-03-30 14:28:23 +00:00
|
|
|
|
2012-12-29 08:53:59 +00:00
|
|
|
--------------------------------------------------------------------------------
|
2013-03-30 14:28:23 +00:00
|
|
|
-- | A preview thread that recompiles the site when files change.
|
2012-11-13 14:10:01 +00:00
|
|
|
previewPoll :: Configuration -- ^ Configuration
|
|
|
|
-> IO [FilePath] -- ^ Updating action
|
|
|
|
-> IO () -- ^ Can block forever
|
2013-03-30 16:07:16 +00:00
|
|
|
previewPoll conf update = do
|
|
|
|
_ <- update
|
|
|
|
manager <- startManagerConf (Debounce 0.1)
|
|
|
|
ignore <- mapM getPath [destinationDirectory, storeDirectory, tmpDirectory]
|
|
|
|
watchTree manager path (predicate ignore) (\_ -> void update)
|
2011-02-21 12:35:20 +00:00
|
|
|
where
|
2013-03-30 14:28:23 +00:00
|
|
|
path = decodeString $ providerDirectory conf
|
|
|
|
getPath fn = catchIOError (canonicalizePath $ fn conf)
|
|
|
|
(const $ return $ fn conf)
|
|
|
|
predicate ignore evt
|
|
|
|
| isRemove evt = False
|
|
|
|
| any (flip isPrefixOf $ eventPath evt) ignore == True = False
|
2013-03-30 16:07:16 +00:00
|
|
|
| otherwise = not $ shouldIgnoreFile conf (eventPath evt)
|
2013-03-30 14:28:23 +00:00
|
|
|
|
|
|
|
eventPath :: Event -> FilePath
|
|
|
|
eventPath (Added p _) = encodeString p
|
|
|
|
eventPath (Modified p _) = encodeString p
|
|
|
|
eventPath (Removed p _) = encodeString p
|
|
|
|
|
|
|
|
isRemove :: Event -> Bool
|
|
|
|
isRemove (Removed _ _) = True
|
|
|
|
isRemove _ = False
|