Only write out a new generated file if it has changed
authorNeil Mitchell <ndmitchell@gmail.com>
Wed, 29 Oct 2014 09:19:18 +0000 (09:19 +0000)
committerNeil Mitchell <ndmitchell@gmail.com>
Wed, 29 Oct 2014 09:19:18 +0000 (09:19 +0000)
Generate.hs

index 0dee626..e228cbf 100755 (executable)
@@ -1,8 +1,11 @@
 
 module Generate(main) where
 
+import Control.Exception
+import Control.Monad
 import Data.Char
 import Data.List
+import System.Directory
 import System.IO
 
 
@@ -19,7 +22,7 @@ main :: IO ()
 main = do
     src <- readFile "System/FilePath/Internal.hs"
     let tests = concatMap getTest $ zip [1..] (lines src)
-    writeFileBinary "tests/TestGen.hs" (prefix ++ genTests tests)
+    writeFileBinaryChanged "tests/TestGen.hs" (prefix ++ genTests tests)
 
 prefix = unlines
     ["module TestGen(tests) where"
@@ -115,3 +118,16 @@ genTest (Test free x) = "quickSafe (\\" ++ concatMap ((' ':) . f) free ++ " -> (
 
 writeFileBinary :: FilePath -> String -> IO ()
 writeFileBinary file x = withBinaryFile file WriteMode $ \h -> hPutStr h x
+
+readFileBinary' :: FilePath -> IO String
+readFileBinary' file = withBinaryFile file ReadMode $ \h -> do
+    s <- hGetContents h
+    evaluate $ length s
+    return s
+
+writeFileBinaryChanged :: FilePath -> String -> IO ()
+writeFileBinaryChanged file x = do
+    b <- doesFileExist file
+    old <- if b then fmap Just $ readFileBinary' file else return Nothing
+    when (Just x /= old) $
+        writeFileBinary file x