2012-11-19 13:59:55 +00:00
|
|
|
--------------------------------------------------------------------------------
|
2010-12-26 08:38:40 +00:00
|
|
|
-- | A module containing various file utility functions
|
|
|
|
module Hakyll.Core.Util.File
|
|
|
|
( makeDirectories
|
|
|
|
, getRecursiveContents
|
|
|
|
) where
|
|
|
|
|
2011-02-10 15:42:26 +00:00
|
|
|
|
2012-11-19 13:59:55 +00:00
|
|
|
--------------------------------------------------------------------------------
|
2012-11-25 09:45:55 +00:00
|
|
|
import Control.Applicative ((<$>))
|
|
|
|
import Control.Monad (forM)
|
|
|
|
import System.Directory (createDirectoryIfMissing,
|
|
|
|
doesDirectoryExist, getDirectoryContents)
|
|
|
|
import System.FilePath (takeDirectory, (</>))
|
2012-11-19 13:59:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
2010-12-26 08:38:40 +00:00
|
|
|
-- | Given a path to a file, try to make the path writable by making
|
|
|
|
-- all directories on the path.
|
|
|
|
makeDirectories :: FilePath -> IO ()
|
|
|
|
makeDirectories = createDirectoryIfMissing True . takeDirectory
|
|
|
|
|
2012-11-19 13:59:55 +00:00
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
2012-11-08 11:45:26 +00:00
|
|
|
-- | Get all contents of a directory.
|
2012-11-19 13:59:55 +00:00
|
|
|
getRecursiveContents :: FilePath -- ^ Directory to search
|
2011-02-10 17:59:16 +00:00
|
|
|
-> IO [FilePath] -- ^ List of files found
|
2012-11-19 13:59:55 +00:00
|
|
|
getRecursiveContents top = go ""
|
2010-12-26 08:38:40 +00:00
|
|
|
where
|
2011-04-04 10:16:38 +00:00
|
|
|
isProper = (`notElem` [".", ".."])
|
2012-11-19 13:59:55 +00:00
|
|
|
go dir = do
|
|
|
|
dirExists <- doesDirectoryExist (top </> dir)
|
|
|
|
if not dirExists
|
|
|
|
then return []
|
|
|
|
else do
|
|
|
|
names <- filter isProper <$> getDirectoryContents (top </> dir)
|
|
|
|
paths <- forM names $ \name -> do
|
|
|
|
let rel = dir </> name
|
|
|
|
isDirectory <- doesDirectoryExist (top </> rel)
|
|
|
|
if isDirectory
|
|
|
|
then go rel
|
|
|
|
else return [rel]
|
|
|
|
|
|
|
|
return $ concat paths
|