build assistant and watcher on windows (doesn't work yet)

This commit is contained in:
Joey Hess 2013-11-12 14:54:02 -04:00
parent 472d9376b6
commit b9b5e3370d
7 changed files with 118 additions and 22 deletions

View file

@ -10,7 +10,9 @@
module Utility.Batch where
import Common
#ifndef mingw32_HOST_OS
import qualified Build.SysConfig
#endif
#if defined(linux_HOST_OS) || defined(__ANDROID__)
import Control.Concurrent.Async

64
Utility/Win32Notify.hs Normal file
View file

@ -0,0 +1,64 @@
{- Win32-notify interface
-
- Copyright 2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Utility.Win32Notify where
import Common hiding (isDirectory)
import Utility.DirWatcher.Types
import System.Win32.Notify
watchDir :: FilePath -> (FilePath -> Bool) -> WatchHooks -> IO WatchManager
watchDir dir ignored hooks = do
scan dir
wm <- initWatchManager
void $ watchDirectory wm dir True [Create, Delete, Modify, Move] handle
retufn wm
where
handle evt
| ignoredPath ignored (filePath evt) = noop
| otherwise = case eventToVariety evt of
Delete
| isDirectory evt -> runhook delDirHook Nothing
| otherwise -> runhook delHook Nothing
Create
| isDirectory evt -> noop
| otherwise -> runhook addHook Nothing
Modify
| isDirectory evt -> noop
{- Add hooks are run when a file is modified for
- compatability with INotify, which calls the add
- hook when a file is closed, and so tends to call
- both add and modify for file modifications. -}
| otherwise -> do
runHook addHook Nothing
runHook modifyHook Nothing
where
runhook h s = maybe noop (\a -> a (filePath evt) s) (h hooks)
scan d = unless (ignoredPath ignored d) $
mapM_ go =<< dirContentsRecursive d
where
go f
| ignoredPath ignored f = noop
| otherwise = do
ms <- getstatus f
case ms of
Nothing -> noop
Just s
| Files.isRegularFile s ->
runhook addHook ms
| otherwise ->
noop
where
runhook h s = maybe noop (\a -> a f s) (h hooks)
getstatus = catchMaybeIO . getFileStatus
{- Check each component of the path to see if it's ignored. -}
ignoredPath :: (FilePath -> Bool) -> FilePath -> Bool
ignoredPath ignored = any ignored . map dropTrailingPathSeparator . splitPath