shake 0.15.9 → 0.15.10
raw patch · 5 files changed
+37/−10 lines, 5 files
Files
- CHANGES.txt +2/−0
- shake.cabal +1/−1
- src/Development/Shake/FileInfo.hs +13/−6
- src/Development/Shake/Rules/File.hs +15/−3
- src/Test/Basic.hs +6/−0
CHANGES.txt view
@@ -1,5 +1,7 @@ Changelog for Shake +0.15.10+ #465, fix phony names which clash with directories 0.15.9 Documentation tweaks Optimise the thread pool
shake.cabal view
@@ -1,7 +1,7 @@ cabal-version: >= 1.10 build-type: Simple name: shake-version: 0.15.9+version: 0.15.10 license: BSD3 license-file: LICENSE category: Development, Shake
src/Development/Shake/FileInfo.hs view
@@ -3,7 +3,7 @@ module Development.Shake.FileInfo( FileInfo, fileInfoEq, fileInfoNeq, FileSize, ModTime, FileHash,- getFileHash, getFileInfo+ getFileHash, getFileInfo, getFileInfoNoDirErr ) where import Control.Exception.Extra@@ -83,10 +83,17 @@ getFileInfo :: BSU -> IO (Maybe (ModTime, FileSize))+getFileInfo = getFileInfoEx True +getFileInfoNoDirErr :: BSU -> IO (Maybe (ModTime, FileSize))+getFileInfoNoDirErr = getFileInfoEx False+++getFileInfoEx :: Bool -> BSU -> IO (Maybe (ModTime, FileSize))+ #if defined(PORTABLE) -- Portable fallback-getFileInfo x = handleBool isDoesNotExistError (const $ return Nothing) $ do+getFileInfoEx direrr x = handleBool isDoesNotExistError (const $ return Nothing) $ do let file = unpackU x time <- getModificationTime file size <- withFile file ReadMode hFileSize@@ -102,14 +109,14 @@ #elif defined(mingw32_HOST_OS) -- Directly against the Win32 API, twice as fast as the portable version-getFileInfo x = BS.useAsCString (unpackU_ x) $ \file ->+getFileInfoEx direrr x = BS.useAsCString (unpackU_ x) $ \file -> alloca_WIN32_FILE_ATTRIBUTE_DATA $ \fad -> do res <- c_GetFileAttributesExA file 0 fad code <- peekFileAttributes fad let peek = do code <- peekFileAttributes fad if testBit code 4 then- errorDirectoryNotFile $ unpackU x+ (if direrr then errorDirectoryNotFile $ unpackU x else return Nothing) else join $ liftM2 result (peekLastWriteTimeLow fad) (peekFileSizeLow fad) if res then@@ -150,10 +157,10 @@ #else -- Unix version-getFileInfo x = handleBool isDoesNotExistError (const $ return Nothing) $ do+getFileInfoEx direrr x = handleBool isDoesNotExistError (const $ return Nothing) $ do s <- getFileStatus $ unpackU_ x if isDirectory s then- errorDirectoryNotFile $ unpackU x+ (if direrr then errorDirectoryNotFile $ unpackU x else return Nothing) else result (extractFileTime s) (fromIntegral $ fileSize s)
src/Development/Shake/Rules/File.hs view
@@ -61,7 +61,7 @@ instance Rule FileQ FileA where storedValue ShakeOptions{shakeChange=c} (FileQ x) = do- res <- getFileInfo x+ res <- getFileInfoNoDirErr x case res of Nothing -> return Nothing Just (time,size) | c == ChangeModtime -> return $ Just $ FileA time size fileInfoNeq@@ -79,6 +79,18 @@ where bool b = if b then EqualCheap else NotEqual +storedValueErrDir :: ShakeOptions -> FileQ -> IO (Maybe FileA)+storedValueErrDir ShakeOptions{shakeChange=c} (FileQ x) = do+ res <- getFileInfo x+ case res of+ Nothing -> return Nothing+ Just (time,size) | c == ChangeModtime -> return $ Just $ FileA time size fileInfoNeq+ Just (time,size) -> do+ hash <- unsafeInterleaveIO $ getFileHash x+ return $ Just $ FileA (if c == ChangeDigest then fileInfoNeq else time) size hash+++ -- | Arguments: options; is the file an input; a message for failure if the file does not exist; filename storedValueError :: ShakeOptions -> Bool -> String -> FileQ -> IO FileA {-@@ -87,7 +99,7 @@ whenM (isNothing <$> (storedValue opts x :: IO (Maybe FileA))) $ error $ msg ++ "\n " ++ unpackU (fromFileQ x) return $ FileA fileInfoEq fileInfoEq fileInfoEq -}-storedValueError opts input msg x = fromMaybe def <$> storedValue opts2 x+storedValueError opts input msg x = fromMaybe def <$> storedValueErrDir opts2 x where def = if shakeCreationCheck opts || input then error err else FileA fileInfoNeq fileInfoNeq fileInfoNeq err = msg ++ "\n " ++ unpackU (fromFileQ x) opts2 = if not input && shakeChange opts == ChangeModtimeAndDigestInput then opts{shakeChange=ChangeModtime} else opts@@ -144,7 +156,7 @@ neededCheck :: [BSU] -> Action () neededCheck (map (packU_ . filepathNormalise . unpackU_) -> xs) = do opts <- getShakeOptions- pre <- liftIO $ mapM (storedValue opts . FileQ) xs+ pre <- liftIO $ mapM (storedValueErrDir opts . FileQ) xs post <- apply $ map FileQ xs :: Action [FileA] let bad = [ (x, if isJust a then "File change" else "File created") | (x, a, b) <- zip3 xs pre post, maybe NotEqual (\a -> equalValue opts (FileQ x) a b) a == NotEqual]
src/Test/Basic.hs view
@@ -78,6 +78,9 @@ obj "ids/out" %> \out -> do need =<< readFileLines (obj "ids/source"); writeFile' out "" obj "ids/*" %> \out -> do alwaysRerun; trace (takeFileName out); writeFile' out $ takeFileName out + phony (obj "foo") $ do+ liftIO $ createDirectoryIfMissing True $ obj "foo"+ test build obj = do writeFile (obj "A.txt") "AAA" writeFile (obj "B.txt") "BBB"@@ -177,5 +180,8 @@ build ["ids/out","-j4"] -- if you collapse depends to [Id] then this ends up asking for the stale 'a' assertContents (obj ".log") "b"++ build ["foo"]+ build ["foo"] build [] -- should say "no want/action statements, nothing to do" (checked manually)