diff options
author | ich@christoph-bauer.net <unknown> | 2010-07-25 16:26:06 +0000 |
---|---|---|
committer | ich@christoph-bauer.net <unknown> | 2010-07-25 16:26:06 +0000 |
commit | 7e25751e8ba0704e23fcf6fff1c23af3ac5af696 (patch) | |
tree | 0b06f6472f4f54187f3dca37dfcb35a304eee8b2 /utils/ghc-pkg | |
parent | ccc1989726c3f4b94cf18f6a13aba2b5d339d077 (diff) | |
download | haskell-7e25751e8ba0704e23fcf6fff1c23af3ac5af696.tar.gz |
ghc-pkg: don't fail, if a file is already removed
Diffstat (limited to 'utils/ghc-pkg')
-rw-r--r-- | utils/ghc-pkg/Main.hs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs index 940e4043a4..bb836f08cb 100644 --- a/utils/ghc-pkg/Main.hs +++ b/utils/ghc-pkg/Main.hs @@ -38,7 +38,7 @@ import System.Directory ( doesDirectoryExist, getDirectoryContents, import System.Exit ( exitWith, ExitCode(..) ) import System.Environment ( getArgs, getProgName, getEnv ) import System.IO -import System.IO.Error (try) +import System.IO.Error (try, isDoesNotExistError) import Data.List import Control.Concurrent @@ -719,7 +719,7 @@ changeDBDir verbosity cmds db = do do_cmd (RemovePackage p) = do let file = location db </> display (installedPackageId p) <.> "conf" when (verbosity > Normal) $ putStrLn ("removing " ++ file) - removeFile file + removeFileSafe file do_cmd (AddPackage p) = do let file = location db </> display (installedPackageId p) <.> "conf" when (verbosity > Normal) $ putStrLn ("writing " ++ file) @@ -1584,7 +1584,7 @@ withFileAtomic targetFile write_content = do `catchIO` \err -> do exists <- doesFileExist targetFile if exists - then do removeFile targetFile + then do removeFileSafe targetFile -- Big fat hairy race condition renameFile newFile targetFile -- If the removeFile succeeds and the renameFile fails @@ -1594,7 +1594,7 @@ withFileAtomic targetFile write_content = do renameFile newFile targetFile #endif `Exception.onException` do hClose newHandle - removeFile newFile + removeFileSafe newFile where template = targetName <.> "tmp" targetDir | null targetDir_ = "." @@ -1693,3 +1693,9 @@ readUTF8File file = do hSetEncoding h utf8 #endif hGetContents h + +-- removeFileSave doesn't throw an exceptions, if the file is already deleted +removeFileSafe :: FilePath -> IO () +removeFileSafe fn = + removeFile fn `catch` \ e -> + when (not $ isDoesNotExistError e) $ ioError e
\ No newline at end of file |