summaryrefslogtreecommitdiff
path: root/hadrian/src/Hadrian/Utilities.hs
diff options
context:
space:
mode:
Diffstat (limited to 'hadrian/src/Hadrian/Utilities.hs')
-rw-r--r--hadrian/src/Hadrian/Utilities.hs13
1 files changed, 12 insertions, 1 deletions
diff --git a/hadrian/src/Hadrian/Utilities.hs b/hadrian/src/Hadrian/Utilities.hs
index bbb61f68f1..a7d8bacc15 100644
--- a/hadrian/src/Hadrian/Utilities.hs
+++ b/hadrian/src/Hadrian/Utilities.hs
@@ -18,7 +18,7 @@ module Hadrian.Utilities (
-- * File system operations
copyFile, copyFileUntracked, createFileLink, fixFile,
makeExecutable, moveFile, removeFile, createDirectory, copyDirectory,
- moveDirectory, removeDirectory,
+ moveDirectory, removeDirectory, removeFile_,
-- * Diagnostic info
Colour (..), ANSIColour (..), putColoured, shouldUseColor,
@@ -54,6 +54,7 @@ import qualified Data.HashMap.Strict as Map
import qualified System.Directory.Extra as IO
import qualified System.Info.Extra as IO
import qualified System.IO as IO
+import System.IO.Error (isPermissionError)
-- | Extract a value from a singleton list, or terminate with an error message
-- if the list does not contain exactly one value.
@@ -322,6 +323,15 @@ copyFile source target = do
putProgressInfo =<< renderAction "Copy file" source target
quietly $ copyFileChanged source target
+-- | Remove a file or a link, but don't worry if it fails
+removeFile_ :: FilePath -> IO ()
+removeFile_ x =
+ (IO.removeFile x >> IO.removeDirectoryLink x) `IO.catch` \e ->
+ when (isPermissionError e) $ IO.handle (\(_ :: IO.IOException) -> pure ()) $ do
+ perms <- IO.getPermissions x
+ IO.setPermissions x perms{IO.readable = True, IO.searchable = True, IO.writable = True}
+ IO.removeFile x
+
-- | Copy a file without tracking the source. Create the target directory if missing.
copyFileUntracked :: FilePath -> FilePath -> Action ()
copyFileUntracked source target = do
@@ -347,6 +357,7 @@ makeExecutable file = do
putProgressInfo $ "| Make " ++ quote file ++ " executable."
quietly $ cmd "chmod +x " [file]
+
-- | Move a file. Note that we cannot track the source, because it is moved.
moveFile :: FilePath -> FilePath -> Action ()
moveFile source target = do