2012-12-05 22:29:42 +00:00
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
module Main
|
|
|
|
( main
|
|
|
|
) where
|
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
2014-06-13 09:52:08 +00:00
|
|
|
import Control.Arrow (first)
|
2012-12-06 12:41:16 +00:00
|
|
|
import Control.Monad (forM_)
|
2014-06-13 09:52:08 +00:00
|
|
|
import Data.Char (isAlphaNum, isNumber)
|
2015-01-06 13:11:20 +00:00
|
|
|
import Data.List (foldl')
|
2014-06-13 09:52:08 +00:00
|
|
|
import Data.List (intercalate)
|
2015-01-06 13:11:20 +00:00
|
|
|
import Data.Version (Version (..))
|
|
|
|
import System.Directory (canonicalizePath, copyFile)
|
2012-12-06 12:41:16 +00:00
|
|
|
import System.Environment (getArgs, getProgName)
|
|
|
|
import System.Exit (exitFailure)
|
2015-01-06 13:11:20 +00:00
|
|
|
import System.FilePath (splitDirectories, (</>))
|
2012-12-05 22:29:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
import Hakyll.Core.Util.File
|
|
|
|
import Paths_hakyll
|
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
main :: IO ()
|
|
|
|
main = do
|
2012-12-06 12:41:16 +00:00
|
|
|
progName <- getProgName
|
|
|
|
args <- getArgs
|
|
|
|
srcDir <- getDataFileName "example"
|
2013-04-03 10:02:06 +00:00
|
|
|
files <- getRecursiveContents (const $ return False) srcDir
|
2012-12-06 12:41:16 +00:00
|
|
|
|
|
|
|
case args of
|
2014-06-13 09:52:08 +00:00
|
|
|
[dstDir] -> do
|
|
|
|
forM_ files $ \file -> do
|
|
|
|
let dst = dstDir </> file
|
|
|
|
src = srcDir </> file
|
|
|
|
putStrLn $ "Creating " ++ dst
|
|
|
|
makeDirectories dst
|
|
|
|
copyFile src dst
|
2015-01-06 13:11:20 +00:00
|
|
|
|
|
|
|
name <- makeName dstDir
|
|
|
|
let cabalPath = dstDir </> name ++ ".cabal"
|
|
|
|
putStrLn $ "Creating " ++ cabalPath
|
|
|
|
createCabal cabalPath name
|
2012-12-06 12:41:16 +00:00
|
|
|
_ -> do
|
|
|
|
putStrLn $ "Usage: " ++ progName ++ " <directory>"
|
|
|
|
exitFailure
|
2014-06-13 09:52:08 +00:00
|
|
|
|
2015-01-06 13:11:20 +00:00
|
|
|
-- | 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
|
2014-06-13 09:52:08 +00:00
|
|
|
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"
|
2015-01-06 13:11:20 +00:00
|
|
|
|
|
|
|
safeLast = foldl' (\_ x -> Just x) Nothing
|
|
|
|
|
|
|
|
createCabal :: FilePath -> String -> IO ()
|
|
|
|
createCabal path name = do
|
|
|
|
writeFile (path ++ ".cabal") $ 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
|