module IDE.Utils.DirectoryUtils (
setModificationTimeOnOSX
) where
import Data.Time.Clock (UTCTime(..))
#ifdef darwin_HOST_OS
import Data.Tuple (swap)
import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
import System.IO.Error (modifyIOError, ioeSetLocation, ioeSetFileName)
import System.FilePath (normalise)
import System.Posix.Files as Posix (getFileStatus)
# if MIN_VERSION_unix(2, 7, 0)
import System.Posix.Files as Posix (setFileTimesHiRes, accessTimeHiRes, modificationTimeHiRes)
#endif
#endif
#ifdef darwin_HOST_OS
setModificationTimeOnOSX :: FilePath -> UTCTime -> IO ()
setModificationTimeOnOSX path =
modifyIOError (`ioeSetLocation` "setModificationTime") .
setFileTime True path
setFileTime :: Bool -> FilePath -> UTCTime -> IO ()
setFileTime isMtime path = modifyIOError (`ioeSetFileName` path) .
setTime . utcTimeToPOSIXSeconds
where
path' = normalise path
setTime time = do
stat <- Posix.getFileStatus path'
uncurry (setFileTimes path') $
swapIf isMtime (convertTime time, otherTime stat)
# if MIN_VERSION_unix(2, 7, 0)
setFileTimes = Posix.setFileTimesHiRes
convertTime = id
otherTime = if isMtime
then Posix.accessTimeHiRes
else Posix.modificationTimeHiRes
# else
setFileTimes = Posix.setFileTimes
convertTime = fromInteger . truncate
otherTime = if isMtime
then Posix.accessTime
else Posix.modificationTime
# endif
swapIf :: Bool -> (a, a) -> (a, a)
swapIf True = swap
swapIf False = id
#else
setModificationTimeOnOSX :: FilePath -> UTCTime -> IO ()
setModificationTimeOnOSX _path _time = return ()
#endif