Skip to content

Commit a0bb273

Browse files
sjakobiGabriella439
authored andcommitted
Use atomic-write for inplace file modifications (#1580)
Fixes #498.
1 parent 85645a2 commit a0bb273

File tree

3 files changed

+28
-20
lines changed

3 files changed

+28
-20
lines changed

dhall/src/Dhall/Format.hs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import qualified Control.Exception
2323
import qualified Data.Text.IO
2424
import qualified Dhall.Pretty
2525
import qualified Dhall.Util
26+
import qualified System.AtomicWrite.Writer.LazyText as AtomicWrite.LazyText
2627
import qualified System.Console.ANSI
2728
import qualified System.IO
2829

@@ -68,8 +69,9 @@ format (Format {..}) = do
6869

6970
case inplace of
7071
InputFile file -> do
71-
System.IO.withFile file System.IO.WriteMode (\handle -> do
72-
Pretty.Terminal.renderIO handle (Pretty.unAnnotateS docStream))
72+
AtomicWrite.LazyText.atomicWriteFile
73+
file
74+
(Pretty.Text.renderLazy docStream)
7375

7476
StandardInput -> do
7577
supportsANSI <- System.Console.ANSI.hSupportsANSI System.IO.stdout

dhall/src/Dhall/Freeze.hs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ import qualified Control.Exception
2626
import qualified Control.Monad.Trans.State.Strict as State
2727
import qualified Data.Text.Prettyprint.Doc as Pretty
2828
import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty
29+
import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text
2930
import qualified Dhall.Core
3031
import qualified Dhall.Import
3132
import qualified Dhall.Optics
3233
import qualified Dhall.Pretty
3334
import qualified Dhall.TypeCheck
3435
import qualified Dhall.Util
36+
import qualified System.AtomicWrite.Writer.LazyText as AtomicWrite.LazyText
3537
import qualified System.FilePath
3638
import qualified System.IO
3739

@@ -94,9 +96,10 @@ writeExpr inplace (header, expr) characterSet = do
9496
let unAnnotated = Pretty.unAnnotateS stream
9597

9698
case inplace of
97-
InputFile f ->
98-
System.IO.withFile f System.IO.WriteMode (\handle -> do
99-
Pretty.renderIO handle unAnnotated)
99+
InputFile file ->
100+
AtomicWrite.LazyText.atomicWriteFile
101+
file
102+
(Pretty.Text.renderLazy unAnnotated)
100103

101104
StandardInput -> do
102105
supportsANSI <- System.Console.ANSI.hSupportsANSI System.IO.stdout

dhall/src/Dhall/Main.hs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import qualified Data.Text
5555
import qualified Data.Text.IO
5656
import qualified Data.Text.Prettyprint.Doc as Pretty
5757
import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Pretty
58+
import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text
5859
import qualified Dhall
5960
import qualified Dhall.Binary
6061
import qualified Dhall.Core
@@ -72,6 +73,7 @@ import qualified Dhall.TypeCheck
7273
import qualified Dhall.Util
7374
import qualified GHC.IO.Encoding
7475
import qualified Options.Applicative
76+
import qualified System.AtomicWrite.Writer.LazyText as AtomicWrite.LazyText
7577
import qualified System.Console.ANSI
7678
import qualified System.Exit as Exit
7779
import qualified System.IO
@@ -500,6 +502,12 @@ command (Options {..}) = do
500502

501503
renderDoc h doc
502504

505+
let writeDocToFile :: FilePath -> Doc ann -> IO ()
506+
writeDocToFile file doc = do
507+
let stream = Dhall.Pretty.layout (doc <> "\n")
508+
509+
AtomicWrite.LazyText.atomicWriteFile file (Pretty.Text.renderLazy stream)
510+
503511
when (not $ ignoreSemanticCache mode) Dhall.Import.warnAboutMissingCaches
504512

505513
handle $ case mode of
@@ -534,8 +542,11 @@ command (Options {..}) = do
534542

535543
case output of
536544
StandardOutput -> render System.IO.stdout annotatedExpression
545+
537546
OutputFile file_ ->
538-
System.IO.withFile file_ System.IO.WriteMode $ \h -> render h annotatedExpression
547+
writeDocToFile
548+
file_
549+
(Dhall.Pretty.prettyCharacterSet characterSet annotatedExpression)
539550

540551
Resolve { resolveMode = Just Dot, ..} -> do
541552
expression <- getExpression file
@@ -666,23 +677,15 @@ command (Options {..}) = do
666677
Lint {..} -> do
667678
(Header header, expression) <- getExpressionAndHeader inplace
668679

669-
case inplace of
670-
InputFile file -> do
671-
let lintedExpression = Dhall.Lint.lint expression
680+
let lintedExpression = Dhall.Lint.lint expression
672681

673-
let doc = Pretty.pretty header
674-
<> Dhall.Pretty.prettyCharacterSet characterSet lintedExpression
682+
let doc = Pretty.pretty header
683+
<> Dhall.Pretty.prettyCharacterSet characterSet lintedExpression
675684

676-
System.IO.withFile file System.IO.WriteMode (\h -> do
677-
renderDoc h doc )
678-
679-
StandardInput -> do
680-
let lintedExpression = Dhall.Lint.lint expression
681-
682-
let doc = Pretty.pretty header
683-
<> Dhall.Pretty.prettyCharacterSet characterSet lintedExpression
685+
case inplace of
686+
InputFile file -> writeDocToFile file doc
684687

685-
renderDoc System.IO.stdout doc
688+
StandardInput -> renderDoc System.IO.stdout doc
686689

687690
Encode {..} -> do
688691
expression <- getExpression file

0 commit comments

Comments
 (0)