Skip to content

Commit 3b222cd

Browse files
sjakobimergify[bot]
authored andcommitted
Write cache files atomically (#1544)
Fixes #1540.
1 parent a41be1a commit 3b222cd

File tree

5 files changed

+31
-10
lines changed

5 files changed

+31
-10
lines changed

dhall/dhall.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ Library
405405
aeson >= 1.0.0.0 && < 1.5 ,
406406
aeson-pretty < 0.9 ,
407407
ansi-terminal >= 0.6.3.1 && < 0.11,
408+
atomic-write >= 0.2.0.7 && < 0.3 ,
408409
bytestring < 0.11,
409410
case-insensitive < 1.3 ,
410411
cborg >= 0.2.0.0 && < 0.3 ,

dhall/src/Dhall/Import.hs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,18 +179,18 @@ import Dhall.Import.Types
179179
import Dhall.Parser (Parser(..), ParseError(..), Src(..), SourcedException(..))
180180
import Lens.Family.State.Strict (zoom)
181181

182-
import qualified Codec.CBOR.Encoding as Encoding
183-
import qualified Codec.CBOR.Write as Write
182+
import qualified Codec.CBOR.Encoding as Encoding
183+
import qualified Codec.CBOR.Write as Write
184184
import qualified Codec.Serialise
185-
import qualified Control.Monad.Trans.Maybe as Maybe
186-
import qualified Control.Monad.Trans.State.Strict as State
185+
import qualified Control.Monad.Trans.Maybe as Maybe
186+
import qualified Control.Monad.Trans.State.Strict as State
187187
import qualified Data.ByteString
188188
import qualified Data.ByteString.Lazy
189189
import qualified Data.CaseInsensitive
190190
import qualified Data.Foldable
191-
import qualified Data.List.NonEmpty as NonEmpty
191+
import qualified Data.List.NonEmpty as NonEmpty
192192
import qualified Data.Text.Encoding
193-
import qualified Data.Text as Text
193+
import qualified Data.Text as Text
194194
import qualified Data.Text.IO
195195
import qualified Dhall.Binary
196196
import qualified Dhall.Core
@@ -199,11 +199,12 @@ import qualified Dhall.Map
199199
import qualified Dhall.Parser
200200
import qualified Dhall.Pretty.Internal
201201
import qualified Dhall.TypeCheck
202+
import qualified System.AtomicWrite.Writer.ByteString.Binary as AtomicWrite.Binary
202203
import qualified System.Environment
203204
import qualified System.Info
204205
import qualified System.IO
205-
import qualified System.Directory as Directory
206-
import qualified System.FilePath as FilePath
206+
import qualified System.Directory as Directory
207+
import qualified System.FilePath as FilePath
207208
import qualified Text.Megaparsec
208209
import qualified Text.Parser.Combinators
209210
import qualified Text.Parser.Token
@@ -554,7 +555,7 @@ writeToSemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteString
554555
writeToSemanticCache hash bytes = do
555556
_ <- Maybe.runMaybeT $ do
556557
cacheFile <- getCacheFile "dhall" hash
557-
liftIO (Data.ByteString.writeFile cacheFile bytes)
558+
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
558559
return ()
559560

560561
-- Check the "semi-semantic" disk cache, otherwise typecheck and normalise from
@@ -669,7 +670,7 @@ writeToSemisemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteStr
669670
writeToSemisemanticCache semisemanticHash bytes = do
670671
_ <- Maybe.runMaybeT $ do
671672
cacheFile <- getCacheFile "dhall-haskell" semisemanticHash
672-
liftIO (Data.ByteString.writeFile cacheFile bytes)
673+
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
673674
return ()
674675

675676
-- Fetch source code directly from disk/network

nix/atomic-write.nix

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{ mkDerivation, base, bytestring, directory, filepath, hspec
2+
, stdenv, temporary, text, unix-compat
3+
}:
4+
mkDerivation {
5+
pname = "atomic-write";
6+
version = "0.2.0.7";
7+
sha256 = "b5f5c77884bc0332306fab89acf1c8a8582d76eabaa303c91b1c4072621c960d";
8+
libraryHaskellDepends = [
9+
base bytestring directory filepath temporary text unix-compat
10+
];
11+
testHaskellDepends = [
12+
base bytestring filepath hspec temporary text unix-compat
13+
];
14+
homepage = "https://github.com/stackbuilders/atomic-write";
15+
description = "Atomically write to a file";
16+
license = stdenv.lib.licenses.mit;
17+
}

stack-lts-6.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ extra-deps:
1212
- aeson-pretty-0.8.7
1313
- ansi-terminal-0.9.1
1414
- ansi-wl-pprint-0.6.8.2
15+
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
1516
- attoparsec-0.13.2.2
1617
- base-compat-0.10.5
1718
- base-orphans-0.8.1

stack.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ extra-deps:
2424
- lsp-test-0.6.1.0@sha256:df0fc403c03b6d036be13de3ff23d9951ae2506080135cd6862eded2c969a6da,3483
2525
- aeson-yaml-1.0.4.0@sha256:72d91a4a2ade87b8a4bdf73937d2c62bd2c60053df1841f8bf1e6204387959b8,1975
2626
- prettyprinter-1.5.1@sha256:fca87c3e2611d3499a0341a59857e9b424a23f31646e4737d535a18582284f96,5375
27+
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
2728
nix:
2829
packages:
2930
- ncurses

0 commit comments

Comments
 (0)