xmonad-entryhelper-0.1.0.0: src/XMonad/Util/EntryHelper/File.hs
{-|
Copyright : (c) 2015 Javran Cheng
License : MIT
Maintainer : Javran.C@gmail.com
Stability : unstable
Portability : non-portable (requires X11)
Dealing with XMonad-related files
-}
module XMonad.Util.EntryHelper.File
( XMonadPaths(..)
, getXMonadDir
, getXMonadPaths
, getXMonadBin
, getXMonadLog
, getXMonadSrc
, getXMonadLibDir
, isSourceNewer
) where
import Control.Applicative
import System.FilePath
import qualified XMonad.Core as XC
import System.Info
import System.Directory
import XMonad.Util.EntryHelper.Util
-- | XMonad default file paths
data XMonadPaths = XMonadPaths
{ dirPath :: FilePath -- ^ directory path
, binPath :: FilePath -- ^ compiled binary path
, logPath :: FilePath -- ^ error log path
, srcPath :: FilePath -- ^ source file path (the path to "xmonad.hs")
, libDirPath :: FilePath -- ^ directory path for library files
} deriving (Show)
-- | gets information about XMonad-related paths
getXMonadPaths :: IO XMonadPaths
getXMonadPaths = (XMonadPaths
<$> id -- dir
<*> (</> "xmonad-"++arch++"-"++os) -- bin
<*> (</> "xmonad.errors") -- log
<*> (</> "xmonad.hs") -- src
<*> (</> "lib")) <$> getXMonadDir -- lib
-- | gets information about XMonad-related paths, see also: 'XMonadPaths'
getXMonadBin, getXMonadLog, getXMonadSrc, getXMonadLibDir, getXMonadDir :: IO FilePath
getXMonadDir = XC.getXMonadDir
getXMonadBin = binPath <$> getXMonadPaths
getXMonadLog = logPath <$> getXMonadPaths
getXMonadSrc = srcPath <$> getXMonadPaths
getXMonadLibDir = libDirPath <$> getXMonadPaths
-- | returns true only when any of the followings is true:
--
-- * any of the source files under xmonad's default directory is newer than the binary
-- * the binary does not exist
isSourceNewer :: IO Bool
isSourceNewer = do
paths <- getXMonadPaths
let bin = binPath paths
src = srcPath paths
lib = libDirPath paths
libTs <- mapM getModTime . filter isHaskellSourceFile =<< allFiles lib
srcT <- getModTime src
binT <- getModTime bin
-- should be at least one element in (srcT: libTs)
-- and "Just _" is always greater than "Nothing"
-- therefore, this procedure returns true when one of the following happens:
-- - when the binary file doesn't exist
-- - when there are some source files newer than the binary
return $ any (binT <) (srcT : libTs)
where
getModTime = safeIO' . getModificationTime