module Darcs.CheckFileSystem ( can_I_use_mmap ) where
import System.Directory ( removeFile, removeDirectory, setCurrentDirectory,
createDirectory,
)
import Control.Exception ( block )
import Darcs.Utils ( withCurrentDirectory )
import Darcs.Lock ( withOpenTemp )
can_I_remove_open_files :: IO Bool
can_I_remove_open_files = block $
(withOpenTemp $ \ (_,f) ->
(do { removeFile f; return True}) `catch` \_ -> return False)
`catch` \_ -> return True
can_I_remove_directories_holding_open_files :: IO Bool
can_I_remove_directories_holding_open_files = block $
(do createDirectory "darcs_testing_for_nfs"
okay <- (withCurrentDirectory "darcs_testing_for_nfs" $
do withOpenTemp $ \ (_,f) ->
(do removeFile f
setCurrentDirectory ".."
removeDirectory "darcs_testing_for_nfs"
return True
) `catch` \_ -> return False
) `catch` \_ -> return True
removeDirectory "darcs_testing_for_nfs" `catch` \_ -> return ()
return okay
) `catch` \_ -> return True
can_I_use_mmap :: IO Bool
can_I_use_mmap = do a <- can_I_remove_open_files
if a then can_I_remove_directories_holding_open_files
else return False