packages feed

fsnotify 0.2.1.1 → 0.2.1.2

raw patch · 3 files changed

+47/−13 lines, 3 filesdep +bytestringdep ~hinotifyPVP ok

version bump matches the API change (PVP)

Dependencies added: bytestring

Dependency ranges changed: hinotify

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,6 +1,11 @@ Changes ======= +Version 0.2.1.2+---------------++Update to the new hinotify API (v0.3.10)+ Version 0.2.1.1 --------------- 
fsnotify.cabal view
@@ -1,5 +1,5 @@ Name:                   fsnotify-Version:                0.2.1.1+Version:                0.2.1.2 Author:                 Mark Dittmer <mark.s.dittmer@gmail.com> Maintainer:             Greg Weber <greg@gregweber.info>, Roman Cheplyaka <roma@ro-che.info> License:                BSD3@@ -22,6 +22,7 @@  Library   Build-Depends:          base >= 4.3.1 && < 5+                        , bytestring >= 0.10.2                         , containers >= 0.4                         , directory >= 1.1.0.0                         , filepath >= 1.3.0.0@@ -40,7 +41,7 @@   if os(linux)     CPP-Options:        -DOS_Linux     Other-Modules:      System.FSNotify.Linux-    Build-Depends:      hinotify >= 0.3.7+    Build-Depends:      hinotify >= 0.3.10   else     if os(windows)       CPP-Options:      -DOS_Win32
src/System/FSNotify/Linux.hs view
@@ -18,10 +18,13 @@ import Control.Concurrent.MVar import Control.Exception as E import Control.Monad (when)+import qualified Data.ByteString as BS import Data.IORef (atomicModifyIORef, readIORef) import Data.Time.Clock (UTCTime, getCurrentTime) import Data.Typeable -- import Debug.Trace (trace)+import qualified GHC.Foreign as F+import GHC.IO.Encoding (getFileSystemEncoding) import System.FilePath import System.FSNotify.Listener import System.FSNotify.Path (findDirs, canonicalizeDirPath)@@ -33,21 +36,43 @@ data EventVarietyMismatchException = EventVarietyMismatchException deriving (Show, Typeable) instance Exception EventVarietyMismatchException +toRawFilePath :: FilePath -> IO BS.ByteString+toRawFilePath fp = do+  enc <- getFileSystemEncoding+  F.withCString enc fp BS.packCString++fromRawFilePath :: BS.ByteString -> IO FilePath+fromRawFilePath bs = do+  enc <- getFileSystemEncoding+  BS.useAsCString bs (F.peekCString enc)+ -- Note that INo.Closed in this context is "modified" because we listen to -- CloseWrite events.-fsnEvent :: FilePath -> UTCTime -> INo.Event -> Maybe Event-fsnEvent basePath timestamp (INo.Created  False       name   ) = Just (Added    (basePath </> name) timestamp)-fsnEvent basePath timestamp (INo.Closed   False (Just name) _) = Just (Modified (basePath </> name) timestamp)-fsnEvent basePath timestamp (INo.MovedOut False       name  _) = Just (Removed  (basePath </> name) timestamp)-fsnEvent basePath timestamp (INo.MovedIn  False       name  _) = Just (Added    (basePath </> name) timestamp)-fsnEvent basePath timestamp (INo.Deleted  False       name   ) = Just (Removed  (basePath </> name) timestamp)-fsnEvent _        _         _                                  = Nothing+fsnEvent :: FilePath -> UTCTime -> INo.Event -> IO (Maybe Event)+fsnEvent basePath timestamp event = case event of+  INo.Created  False       raw    -> do+    name <- fromRawFilePath raw+    return $ Just (Added    (basePath </> name) timestamp)+  INo.Closed   False (Just raw) _ -> do+    name <- fromRawFilePath raw+    return $ Just (Modified (basePath </> name) timestamp)+  INo.MovedOut False       raw  _ -> do+    name <- fromRawFilePath raw+    return $ Just (Removed  (basePath </> name) timestamp)+  INo.MovedIn  False       raw  _ -> do+    name <- fromRawFilePath raw+    return $ Just (Added    (basePath </> name) timestamp)+  INo.Deleted  False       raw    -> do+    name <- fromRawFilePath raw+    return $ Just (Removed  (basePath </> name) timestamp)+  _                               ->+    return Nothing  handleInoEvent :: ActionPredicate -> EventChannel -> FilePath -> DebouncePayload -> INo.Event -> IO () -- handleInoEvent _       _    basePath _   inoEvent | trace ("Linux: handleInoEvent " ++ show basePath ++ " " ++ show inoEvent) False = undefined handleInoEvent actPred chan basePath dbp inoEvent = do   currentTime <- getCurrentTime-  let maybeFsnEvent = fsnEvent basePath currentTime inoEvent+  maybeFsnEvent <- fsnEvent basePath currentTime inoEvent   handleEvent actPred chan dbp maybeFsnEvent  handleEvent :: ActionPredicate -> EventChannel -> DebouncePayload -> Maybe Event -> IO ()@@ -75,7 +100,8 @@   listen conf iNotify path actPred chan = do     path' <- canonicalizeDirPath path     dbp <- newDebouncePayload $ confDebounce conf-    wd <- INo.addWatch iNotify varieties path' (handler path' dbp)+    rawPath <- toRawFilePath path'+    wd <- INo.addWatch iNotify varieties rawPath (handler path' dbp)     return $ INo.removeWatch wd     where       handler :: FilePath -> DebouncePayload -> INo.Event -> IO ()@@ -112,17 +138,19 @@       pathHandler :: MVar (Maybe [INo.WatchDescriptor]) -> FilePath -> IO ()       pathHandler wdVar filePath = do         dbp <- newDebouncePayload $ confDebounce conf+        rawFilePath <- toRawFilePath filePath         modifyMVar_ wdVar $ \mbWds ->           -- Atomically add a watch and record its descriptor. Also, check           -- if the listening task is cancelled, in which case do nothing.           case mbWds of             Nothing -> return mbWds             Just wds -> do-              wd <- INo.addWatch iNotify varieties filePath (handler filePath dbp)+              wd <- INo.addWatch iNotify varieties rawFilePath (handler filePath dbp)               return $ Just (wd:wds)         where           handler :: FilePath -> DebouncePayload -> INo.Event -> IO ()-          handler baseDir _   (INo.Created True dirPath) = do+          handler baseDir _   (INo.Created True rawDirPath) = do+            dirPath <- fromRawFilePath rawDirPath             listenRec (baseDir </> dirPath) wdVar           handler baseDir dbp event                      =             handleInoEvent actPred chan baseDir dbp event