compiler: Disable atomic renaming on Windows
authorBen Gamari <ben@smart-cactus.org>
Sat, 16 Mar 2019 12:57:43 +0000 (08:57 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sat, 16 Mar 2019 23:13:36 +0000 (19:13 -0400)
As discussed in #16450, this feature regresses CI on Windows, causing
non-deterministic failures due to missing files.

compiler/utils/Util.hs

index 41f63f2..6730881 100644 (file)
@@ -1314,7 +1314,8 @@ modificationTimeIfExists f = do
 -- also results in a skip.
 
 withAtomicRename :: (MonadIO m) => FilePath -> (FilePath -> m a) -> m a
-withAtomicRename targetFile f = do
+withAtomicRename targetFile f
+  | enableAtomicRename = do
   -- The temp file must be on the same file system (mount) as the target file
   -- to result in an atomic move on most platforms.
   -- The standard way to ensure that is to place it into the same directory.
@@ -1325,6 +1326,17 @@ withAtomicRename targetFile f = do
   liftIO $ renameFile temp targetFile
   return res
 
+  | otherwise = f targetFile
+  where
+    -- As described in #16450, enabling this causes spurious build failures due
+    -- to apparently missing files.
+    enableAtomicRename :: Bool
+#if defined(mingw32_BUILD_OS)
+    enableAtomicRename = False
+#else
+    enableAtomicRename = True
+#endif
+
 -- --------------------------------------------------------------
 -- split a string at the last character where 'pred' is True,
 -- returning a pair of strings. The first component holds the string