Write cache files atomically (#1544)

Fixes https://github.com/dhall-lang/dhall-haskell/issues/1540.
This commit is contained in:
Simon Jakobi 2019-11-22 01:49:46 +01:00 committed by mergify[bot]
parent a41be1a742
commit 3b222cda91
5 changed files with 31 additions and 10 deletions

View File

@ -405,6 +405,7 @@ Library
aeson >= 1.0.0.0 && < 1.5 ,
aeson-pretty < 0.9 ,
ansi-terminal >= 0.6.3.1 && < 0.11,
atomic-write >= 0.2.0.7 && < 0.3 ,
bytestring < 0.11,
case-insensitive < 1.3 ,
cborg >= 0.2.0.0 && < 0.3 ,

View File

@ -179,18 +179,18 @@ import Dhall.Import.Types
import Dhall.Parser (Parser(..), ParseError(..), Src(..), SourcedException(..))
import Lens.Family.State.Strict (zoom)
import qualified Codec.CBOR.Encoding as Encoding
import qualified Codec.CBOR.Write as Write
import qualified Codec.CBOR.Encoding as Encoding
import qualified Codec.CBOR.Write as Write
import qualified Codec.Serialise
import qualified Control.Monad.Trans.Maybe as Maybe
import qualified Control.Monad.Trans.State.Strict as State
import qualified Control.Monad.Trans.Maybe as Maybe
import qualified Control.Monad.Trans.State.Strict as State
import qualified Data.ByteString
import qualified Data.ByteString.Lazy
import qualified Data.CaseInsensitive
import qualified Data.Foldable
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.Text.Encoding
import qualified Data.Text as Text
import qualified Data.Text as Text
import qualified Data.Text.IO
import qualified Dhall.Binary
import qualified Dhall.Core
@ -199,11 +199,12 @@ import qualified Dhall.Map
import qualified Dhall.Parser
import qualified Dhall.Pretty.Internal
import qualified Dhall.TypeCheck
import qualified System.AtomicWrite.Writer.ByteString.Binary as AtomicWrite.Binary
import qualified System.Environment
import qualified System.Info
import qualified System.IO
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified Text.Megaparsec
import qualified Text.Parser.Combinators
import qualified Text.Parser.Token
@ -554,7 +555,7 @@ writeToSemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteString
writeToSemanticCache hash bytes = do
_ <- Maybe.runMaybeT $ do
cacheFile <- getCacheFile "dhall" hash
liftIO (Data.ByteString.writeFile cacheFile bytes)
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
return ()
-- Check the "semi-semantic" disk cache, otherwise typecheck and normalise from
@ -669,7 +670,7 @@ writeToSemisemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteStr
writeToSemisemanticCache semisemanticHash bytes = do
_ <- Maybe.runMaybeT $ do
cacheFile <- getCacheFile "dhall-haskell" semisemanticHash
liftIO (Data.ByteString.writeFile cacheFile bytes)
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
return ()
-- Fetch source code directly from disk/network

17
nix/atomic-write.nix Normal file
View File

@ -0,0 +1,17 @@
{ mkDerivation, base, bytestring, directory, filepath, hspec
, stdenv, temporary, text, unix-compat
}:
mkDerivation {
pname = "atomic-write";
version = "0.2.0.7";
sha256 = "b5f5c77884bc0332306fab89acf1c8a8582d76eabaa303c91b1c4072621c960d";
libraryHaskellDepends = [
base bytestring directory filepath temporary text unix-compat
];
testHaskellDepends = [
base bytestring filepath hspec temporary text unix-compat
];
homepage = "https://github.com/stackbuilders/atomic-write";
description = "Atomically write to a file";
license = stdenv.lib.licenses.mit;
}

View File

@ -12,6 +12,7 @@ extra-deps:
- aeson-pretty-0.8.7
- ansi-terminal-0.9.1
- ansi-wl-pprint-0.6.8.2
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
- attoparsec-0.13.2.2
- base-compat-0.10.5
- base-orphans-0.8.1

View File

@ -24,6 +24,7 @@ extra-deps:
- lsp-test-0.6.1.0@sha256:df0fc403c03b6d036be13de3ff23d9951ae2506080135cd6862eded2c969a6da,3483
- aeson-yaml-1.0.4.0@sha256:72d91a4a2ade87b8a4bdf73937d2c62bd2c60053df1841f8bf1e6204387959b8,1975
- prettyprinter-1.5.1@sha256:fca87c3e2611d3499a0341a59857e9b424a23f31646e4737d535a18582284f96,5375
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
nix:
packages:
- ncurses