Plain source file: base/lib/DirUtils.hs (2005-06-24)

DirUtils is imported by: PfeAlfaCmds, PFE0, PFE2, PFE4, PFE_HTML, PFEdeps, Pfe0Cmds, PfeChase, PFE_Certs, PfePropCmds.

module DirUtils where
import Prelude hiding (catch,ioError)
import MUtils
import List(isSuffixOf,nub)
import AbstractIO

optCreateDirectory d = unlessM (doesDirectoryExist d) (createDirectory d)

getModificationTimeMaybe path = maybeM (getModificationTime path)
  do ifM (doesFileExist path)
         (Just # getModificationTime path)
	 (return Nothing)

-- GHC deficiency workaround:
getModificationTime' path = getModificationTime path `catch` handle
    handle err = if isDoesNotExistError err
		 then fail $ "Missing: "++path
		 else ioError err

latestModTime paths = maximum # mapM getModificationTime' paths

-- Remove a directory and its contents:
rmR dir = system . unwords . ("rm -rf":) $ dir

-- Expand directory names to all the Haskell files (.hs & .lhs) in that
-- directory:
expand fs = concat # mapM expand1 (nub fs)
expand1 f =
  do isdir <- doesDirectoryExist f
     if isdir
      then do fs <- getDirectoryContents f
              return [f++"/"++f'|f'<-fs,haskellSuffix f']
      else return [f]

haskellSuffix f = ".hs" `isSuffixOf` f || ".lhs" `isSuffixOf` f

-- Recursively collect Haskell files from subdirectories:
recurse = recurse' "" . nub

recurse' path fs = concat # mapM (recurse1 path) fs

recurse1 path f =
  do let path' = extend path f
     isdir <- doesDirectoryExist path'
     if isdir
      then if okDir f
           then do fs <- getDirectoryContents path'
	           recurse' path' [f|f<-fs,f `notElem` [".",".."]]
	   else return []
      else if haskellSuffix f
	   then return [path']
	   else return []

okDir f = f `notElem` ["objs","CVS","hi","tests","old","spec"]

extend "" f = f
extend "." f = f
extend d f = d++"/"++f


(HTML for this module was generated on 2006-08-12. About the conversion tool.)