@@ -19,6 +19,7 @@ import Data.Set (Set)
1919import qualified Data.Set as Set
2020import Data.String (fromString )
2121import Data.Traversable (forM )
22+ import Ignore
2223import Path
2324import System.FSNotify
2425import System.IO (stderr )
@@ -32,11 +33,20 @@ printExceptionStderr e =
3233--
3334-- The action provided takes a callback that is used to set the files to be
3435-- watched. When any of those files are changed, we rerun the action again.
35- fileWatch :: ((Set (Path Abs File ) -> IO () ) -> IO () )
36+ fileWatch :: IO (Path Abs Dir )
37+ -> ((Set (Path Abs File ) -> IO () ) -> IO () )
3638 -> IO ()
37- fileWatch inner = withManager $ \ manager -> do
39+ fileWatch getProjectRoot inner = withManager $ \ manager -> do
3840 dirtyVar <- newTVarIO True
3941 watchVar <- newTVarIO Map. empty
42+ projRoot <- getProjectRoot
43+ mChecker <- findIgnoreFiles [VCSGit , VCSMercurial , VCSDarcs ] projRoot >>= buildChecker
44+ (FileIgnoredChecker isFileIgnored) <-
45+ case mChecker of
46+ Left err ->
47+ do putStrLn $ " Failed to parse VCS's ignore file: " ++ err
48+ return $ FileIgnoredChecker (const False )
49+ Right chk -> return chk
4050
4151 let onChange = atomically $ writeTVar dirtyVar True
4252
@@ -67,7 +77,7 @@ fileWatch inner = withManager $ \manager -> do
6777 return Nothing
6878 startListening = Map. mapWithKey $ \ dir () -> do
6979 let dir' = fromString $ toFilePath dir
70- listen <- watchDir manager dir' (const True ) (const onChange)
80+ listen <- watchDir manager dir' (not . isFileIgnored . eventPath ) (const onChange)
7181 return $ Just listen
7282
7383 let watchInput = do
0 commit comments