summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper Van der Jeugt <jaspervdj@gmail.com>2013-08-28 11:48:21 -0700
committerJasper Van der Jeugt <jaspervdj@gmail.com>2013-08-28 11:48:21 -0700
commit94d7281a2c4f21e67e2da09c6029cf60583c37e7 (patch)
treeff489fa246c50256448d380cf7d57d9a0f32b158
parent015c7c5b122080cf9150d5e879515a0a36359253 (diff)
parent866a282f19592e9ef4f0b6d3bc44be2dd2b3e08c (diff)
downloadhakyll-94d7281a2c4f21e67e2da09c6029cf60583c37e7.tar.gz
Merge pull request #177 from stoltene2/master
Adding a watch command
-rw-r--r--hakyll.cabal22
-rw-r--r--src/Hakyll/Commands.hs51
-rw-r--r--src/Hakyll/Main.hs27
3 files changed, 85 insertions, 15 deletions
diff --git a/hakyll.cabal b/hakyll.cabal
index b23763a..0e570a7 100644
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -78,6 +78,10 @@ Flag previewServer
Description: Include the preview server
Default: True
+Flag watchServer
+ Description: Include the watch server
+ Default: True
+
Flag checkExternal
Description: Include external link checking
Default: True
@@ -177,6 +181,15 @@ Library
Hakyll.Preview.Poll
Hakyll.Preview.Server
+ If flag(watchServer)
+ Build-depends:
+ fsnotify >= 0.0.6 && < 0.1,
+ system-filepath >= 0.4.6 && <= 0.5
+ Cpp-options:
+ -DWATCH_SERVER
+ Other-modules:
+ Hakyll.Preview.Poll
+
If flag(checkExternal)
Build-depends:
http-conduit >= 1.8 && < 1.10,
@@ -254,6 +267,15 @@ Test-suite hakyll-tests
Hakyll.Preview.Poll
Hakyll.Preview.Server
+ If flag(watchServer)
+ Build-depends:
+ fsnotify >= 0.0.6 && < 0.1,
+ system-filepath >= 0.4.6 && <= 0.5
+ Cpp-options:
+ -DWATCH_SERVER
+ Other-modules:
+ Hakyll.Preview.Poll
+
If flag(checkExternal)
Build-depends:
http-conduit >= 1.8 && < 1.10,
diff --git a/src/Hakyll/Commands.hs b/src/Hakyll/Commands.hs
index d86fd5c..7951f4e 100644
--- a/src/Hakyll/Commands.hs
+++ b/src/Hakyll/Commands.hs
@@ -1,4 +1,4 @@
---------------------------------------------------------------------------------
+ --------------------------------------------------------------------------------
-- | Implementation of Hakyll commands: build, preview...
{-# LANGUAGE CPP #-}
module Hakyll.Commands
@@ -9,12 +9,14 @@ module Hakyll.Commands
, rebuild
, server
, deploy
+ , watch
) where
--------------------------------------------------------------------------------
import System.Exit (exitWith, ExitCode)
import Control.Applicative
+import Control.Concurrent
--------------------------------------------------------------------------------
import qualified Hakyll.Check as Check
@@ -26,8 +28,11 @@ import Hakyll.Core.Runtime
import Hakyll.Core.Util.File
--------------------------------------------------------------------------------
+#ifdef WATCH_SERVER
+import Hakyll.Preview.Poll (watchUpdates)
+#endif
+
#ifdef PREVIEW_SERVER
-import Hakyll.Preview.Poll
import Hakyll.Preview.Server
#endif
@@ -60,18 +65,39 @@ clean conf = do
-- | Preview the site
preview :: Configuration -> Verbosity -> Rules a -> Int -> IO ()
#ifdef PREVIEW_SERVER
-preview conf verbosity rules port = do
+preview conf verbosity rules port = do
+ deprecatedMessage
+ watch conf verbosity port True rules
+ where
+ deprecatedMessage = mapM_ putStrLn [ "The preview command has been deprecated."
+ , "Use the watch command for recompilation and serving."
+ ]
+#else
+preview _ _ _ _ = previewServerDisabled
+#endif
+
+
+--------------------------------------------------------------------------------
+-- | Watch and recompile for changes
+
+watch :: Configuration -> Verbosity -> Int -> Bool -> Rules a -> IO ()
+#ifdef WATCH_SERVER
+watch conf verbosity port runServer rules = do
watchUpdates conf update
- server conf port
+ _ <- forkIO (server')
+ loop
where
update = do
(_, ruleSet) <- run conf verbosity rules
return $ rulesPattern ruleSet
+
+ loop = threadDelay 100000 >> loop
+
+ server' = if runServer then server conf port else return ()
#else
-preview _ _ _ _ = previewServerDisabled
+watch _ _ _ _ _ = watchServerDisabled
#endif
-
--------------------------------------------------------------------------------
-- | Rebuild the site
rebuild :: Configuration -> Verbosity -> Rules a -> IO ExitCode
@@ -111,3 +137,16 @@ previewServerDisabled =
, "Alternatively, use an external tool to serve your site directory."
]
#endif
+
+#ifndef WATCH_SERVER
+watchServerDisabled :: IO ()
+watchServerDisabled =
+ mapM_ putStrLn
+ [ "WATCH SERVER"
+ , ""
+ , "The watch server is not enabled in the version of Hakyll. To"
+ , "enable it, set the flag to True and recompile Hakyll."
+ , "Alternatively, use an external tool to serve your site directory."
+ ]
+#endif
+
diff --git a/src/Hakyll/Main.hs b/src/Hakyll/Main.hs
index 7e50418..4b30939 100644
--- a/src/Hakyll/Main.hs
+++ b/src/Hakyll/Main.hs
@@ -41,14 +41,15 @@ hakyllWith conf rules = do
if internal_links args' then Check.InternalLinks else Check.All
case args' of
- Build _ -> Commands.build conf verbosity' rules >>= exitWith
- Check _ _ -> Commands.check conf verbosity' check'
- Clean _ -> Commands.clean conf
- Deploy _ -> Commands.deploy conf >>= exitWith
- Help _ -> showHelp
- Preview _ p -> Commands.preview conf verbosity' rules p
- Rebuild _ -> Commands.rebuild conf verbosity' rules >>= exitWith
- Server _ _ -> Commands.server conf (port args')
+ Build _ -> Commands.build conf verbosity' rules >>= exitWith
+ Check _ _ -> Commands.check conf verbosity' check'
+ Clean _ -> Commands.clean conf
+ Deploy _ -> Commands.deploy conf >>= exitWith
+ Help _ -> showHelp
+ Preview _ p -> Commands.preview conf verbosity' rules p
+ Rebuild _ -> Commands.rebuild conf verbosity' rules >>= exitWith
+ Server _ _ -> Commands.server conf (port args')
+ Watch _ p s -> Commands.watch conf verbosity' p (not s) rules
--------------------------------------------------------------------------------
@@ -67,6 +68,7 @@ data HakyllArgs
| Preview {verbose :: Bool, port :: Int}
| Rebuild {verbose :: Bool}
| Server {verbose :: Bool, port :: Int}
+ | Watch {verbose :: Bool, port :: Int, no_server :: Bool }
deriving (Data, Typeable, Show)
@@ -80,10 +82,12 @@ hakyllArgs = modes
, (Deploy $ verboseFlag def) &= help "Upload/deploy your site"
, (Help $ verboseFlag def) &= help "Show this message" &= auto
, (Preview (verboseFlag def) (portFlag 8000)) &=
- help "Start a preview server and autocompile on changes"
+ help "[Deprecated] Please use the watch command"
, (Rebuild $ verboseFlag def) &= help "Clean and build again"
, (Server (verboseFlag def) (portFlag 8000)) &=
help "Start a preview server"
+ , (Watch (verboseFlag def) (portFlag 8000) (noServerFlag False) &=
+ help "Autocompile on changes and start a preview server. You can watch and recompile without running a server with --no-server.")
] &= help "Hakyll static site compiler" &= program progName
@@ -94,6 +98,11 @@ verboseFlag x = x &= help "Run in verbose mode"
--------------------------------------------------------------------------------
+noServerFlag :: Data a => a -> a
+noServerFlag x = x &= help "Disable the built-in web server"
+{-# INLINE noServerFlag #-}
+
+--------------------------------------------------------------------------------
portFlag :: Data a => a -> a
portFlag x = x &= help "Port to listen on"
{-# INLINE portFlag #-}