From 53d179a7da994bd45eff1363269c6e1cb533dfd7 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Sun, 26 Dec 2010 09:38:40 +0100 Subject: Add file utility module --- .../Core/ResourceProvider/FileResourceProvider.hs | 25 +------- src/Hakyll/Core/Util/File.hs | 66 ++++++++++++++++++++++ 2 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 src/Hakyll/Core/Util/File.hs (limited to 'src/Hakyll') diff --git a/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs b/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs index b682634..442ae9a 100644 --- a/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs +++ b/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs @@ -5,13 +5,10 @@ module Hakyll.Core.ResourceProvider.FileResourceProvider ) where import Control.Applicative ((<$>)) -import Control.Monad (forM) - -import System.Directory (doesDirectoryExist, getDirectoryContents) -import System.FilePath ((), normalise) import Hakyll.Core.ResourceProvider import Hakyll.Core.Identifier +import Hakyll.Core.Util.File -- | Create a filesystem-based 'ResourceProvider' -- @@ -22,23 +19,3 @@ fileResourceProvider = do { resourceList = list , resourceString = readFile . toFilePath } - --- | Get all contents of a directory. Note that files starting with a dot (.) --- will be ignored. --- -getRecursiveContents :: FilePath -> IO [FilePath] -getRecursiveContents topdir = do - topdirExists <- doesDirectoryExist topdir - if topdirExists - then do names <- getDirectoryContents topdir - let properNames = filter isProper names - paths <- forM properNames $ \name -> do - let path = topdir name - isDirectory <- doesDirectoryExist path - if isDirectory - then getRecursiveContents path - else return [normalise path] - return (concat paths) - else return [] - where - isProper = not . (== '.') . head diff --git a/src/Hakyll/Core/Util/File.hs b/src/Hakyll/Core/Util/File.hs new file mode 100644 index 0000000..355eafb --- /dev/null +++ b/src/Hakyll/Core/Util/File.hs @@ -0,0 +1,66 @@ +-- | A module containing various file utility functions +-- +module Hakyll.Core.Util.File + ( makeDirectories + , getRecursiveContents + , isFileObsolete + ) where + +import System.FilePath (normalise, takeDirectory, ()) +import System.Time (ClockTime) +import Control.Monad (forM) +import System.Directory ( createDirectoryIfMissing, doesDirectoryExist + , doesFileExist, getModificationTime + , getDirectoryContents + ) + +-- | 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 + +-- | Get all contents of a directory. Note that files starting with a dot (.) +-- will be ignored. +-- +getRecursiveContents :: FilePath -> IO [FilePath] +getRecursiveContents topdir = do + topdirExists <- doesDirectoryExist topdir + if topdirExists + then do names <- getDirectoryContents topdir + let properNames = filter isProper names + paths <- forM properNames $ \name -> do + let path = topdir name + isDirectory <- doesDirectoryExist path + if isDirectory + then getRecursiveContents path + else return [normalise path] + return (concat paths) + else return [] + where + isProper = not . (== ".") . take 1 + +-- | Check if a timestamp is obsolete compared to the timestamps of a number of +-- files. When they are no files, it is never obsolete. +-- +isObsolete :: ClockTime -- ^ The time to check. + -> [FilePath] -- ^ Dependencies of the cached file. + -> IO Bool +isObsolete _ [] = return False +isObsolete timeStamp depends = do + dependsModified <- mapM getModificationTime depends + return (timeStamp < maximum dependsModified) + +-- | Check if a file is obsolete, given it's dependencies. When the file does +-- not exist, it is always obsolete. Other wise, it is obsolete if any of it's +-- dependencies has a more recent modification time than the file. +-- +isFileObsolete :: FilePath -- ^ The cached file + -> [FilePath] -- ^ Dependencies of the cached file + -> IO Bool +isFileObsolete file depends = do + exists <- doesFileExist file + if not exists + then return True + else do timeStamp <- getModificationTime file + isObsolete timeStamp depends -- cgit v1.2.3