summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJasper Van der Jeugt <m@jaspervdj.be>2017-02-09 11:46:55 -0500
committerJasper Van der Jeugt <m@jaspervdj.be>2017-02-09 11:46:55 -0500
commiteded57b49def0231c9646b2977227b75ae04b51a (patch)
tree0d17cdb38ffb24b310a80d38f0e02cca3dc02b9c /src
parent1549dcc81b980df9a45372bfbf0db8d10f0d0582 (diff)
downloadhakyll-eded57b49def0231c9646b2977227b75ae04b51a.tar.gz
Revert "Move hakyll-init to https://github.com/jaspervdj/hakyll-init"
This reverts commit e46adb860c2548db519940a36768482d7b49f0ef.
Diffstat (limited to 'src')
-rw-r--r--src/Hakyll/Init.hs96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/Hakyll/Init.hs b/src/Hakyll/Init.hs
new file mode 100644
index 0000000..71055f0
--- /dev/null
+++ b/src/Hakyll/Init.hs
@@ -0,0 +1,96 @@
+--------------------------------------------------------------------------------
+module Main
+ ( main
+ ) where
+
+
+--------------------------------------------------------------------------------
+import Control.Arrow (first)
+import Control.Monad (forM_)
+import Data.Char (isAlphaNum, isNumber)
+import Data.List (foldl')
+import Data.List (intercalate, isPrefixOf)
+import Data.Version (Version (..))
+import System.Directory (canonicalizePath, copyFile)
+import System.Environment (getArgs, getProgName)
+import System.Exit (exitFailure)
+import System.FilePath (splitDirectories, (</>))
+
+
+--------------------------------------------------------------------------------
+import Hakyll.Core.Util.File
+import Paths_hakyll
+
+
+--------------------------------------------------------------------------------
+main :: IO ()
+main = do
+ progName <- getProgName
+ args <- getArgs
+ srcDir <- getDataFileName "example"
+ files <- getRecursiveContents (const $ return False) srcDir
+
+ case args of
+ -- When the argument begins with hyphens, it's more likely that the user
+ -- intends to attempt some arguments like ("--help", "-h", "--version", etc.)
+ -- rather than create directory with that name.
+ -- If dstDir begins with hyphens, the guard will prevent it from creating
+ -- directory with that name so we can fall to the second alternative
+ -- which prints a usage info for user.
+ [dstDir] | not ("-" `isPrefixOf` dstDir) -> do
+ forM_ files $ \file -> do
+ let dst = dstDir </> file
+ src = srcDir </> file
+ putStrLn $ "Creating " ++ dst
+ makeDirectories dst
+ copyFile src dst
+
+ name <- makeName dstDir
+ let cabalPath = dstDir </> name ++ ".cabal"
+ putStrLn $ "Creating " ++ cabalPath
+ createCabal cabalPath name
+ _ -> do
+ putStrLn $ "Usage: " ++ progName ++ " <directory>"
+ exitFailure
+
+-- | Figure out a good cabal package name from the given (existing) directory
+-- name
+makeName :: FilePath -> IO String
+makeName dstDir = do
+ canonical <- canonicalizePath dstDir
+ return $ case safeLast (splitDirectories canonical) of
+ Nothing -> fallbackName
+ Just "/" -> fallbackName
+ Just x -> repair (fallbackName ++) id x
+ where
+ -- Package name repair code comes from
+ -- cabal-install.Distribution.Client.Init.Heuristics
+ repair invalid valid x = case dropWhile (not . isAlphaNum) x of
+ "" -> repairComponent ""
+ x' -> let (c, r) = first repairComponent $ break (not . isAlphaNum) x'
+ in c ++ repairRest r
+ where repairComponent c | all isNumber c = invalid c
+ | otherwise = valid c
+ repairRest = repair id ('-' :)
+ fallbackName = "site"
+
+ safeLast = foldl' (\_ x -> Just x) Nothing
+
+createCabal :: FilePath -> String -> IO ()
+createCabal path name = do
+ writeFile path $ unlines [
+ "name: " ++ name
+ , "version: 0.1.0.0"
+ , "build-type: Simple"
+ , "cabal-version: >= 1.10"
+ , ""
+ , "executable site"
+ , " main-is: site.hs"
+ , " build-depends: base == 4.*"
+ , " , hakyll == " ++ version' ++ ".*"
+ , " ghc-options: -threaded"
+ , " default-language: Haskell2010"
+ ]
+ where
+ -- Major hakyll version
+ version' = intercalate "." . take 2 . map show $ versionBranch version