Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions cabal-install/Distribution/Client/Update.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import Distribution.Client.FetchUtils
import qualified Distribution.Client.PackageIndex as PackageIndex
import Distribution.Client.IndexUtils
( getSourcePackages, updateRepoIndexCache )
import Distribution.Client.Utils
( writeFileAtomic )
import qualified Paths_cabal_install
( version )

Expand All @@ -29,12 +31,11 @@ import Distribution.Package
import Distribution.Version
( anyVersion, withinRange )
import Distribution.Simple.Utils
( warn, notice, writeFileAtomic )
( warn, notice )
import Distribution.Verbosity
( Verbosity )

import qualified Data.ByteString.Lazy as BS
import qualified Data.ByteString.Lazy.Char8 as BS.Char8
import Distribution.Client.GZipUtils (maybeDecompress)
import qualified Data.Map as Map
import System.FilePath (dropExtension)
Expand All @@ -57,8 +58,7 @@ updateRepo verbosity repo = case repoKind repo of
notice verbosity $ "Downloading the latest package list from "
++ remoteRepoName remoteRepo
indexPath <- downloadIndex verbosity remoteRepo (repoLocalDir repo)
writeFileAtomic (dropExtension indexPath) . BS.Char8.unpack
. maybeDecompress
writeFileAtomic (dropExtension indexPath) . maybeDecompress
=<< BS.readFile indexPath
updateRepoIndexCache verbosity repo

Expand Down
22 changes: 20 additions & 2 deletions cabal-install/Distribution/Client/Utils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ import Data.List
( sortBy, groupBy )
import System.Directory
( doesFileExist, getModificationTime
, getCurrentDirectory, setCurrentDirectory )
, getCurrentDirectory, setCurrentDirectory
, renameFile, removeFile )
import System.FilePath
( splitFileName, (<.>) )
import System.IO
( openBinaryTempFile, hClose )
import qualified Control.Exception as Exception
( finally )
( bracketOnError, finally )
import qualified Data.ByteString.Lazy as BS

-- | Generic merging utility. For sorted input lists this is a full outer join.
--
Expand Down Expand Up @@ -58,3 +64,15 @@ inDir (Just d) m = do
old <- getCurrentDirectory
setCurrentDirectory d
m `Exception.finally` setCurrentDirectory old

-- | Write a file atomically
writeFileAtomic :: FilePath -> BS.ByteString -> IO ()
writeFileAtomic targetPath content = do
let (targetDir, targetFile) = splitFileName targetPath
Exception.bracketOnError
(openBinaryTempFile targetDir $ targetFile <.> "tmp")
(\(tmpPath, handle) -> hClose handle >> removeFile tmpPath)
(\(tmpPath, handle) -> do
BS.hPut handle content
hClose handle
renameFile tmpPath targetPath)