diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd8135..64780a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: New features: +- Add `lstat` (#66 by @artemisSystem) Bugfixes: diff --git a/src/Node/FS/Async.js b/src/Node/FS/Async.js index 1ed7423..3248975 100644 --- a/src/Node/FS/Async.js +++ b/src/Node/FS/Async.js @@ -4,6 +4,7 @@ export { chown as chownImpl, chmod as chmodImpl, stat as statImpl, + lstat as lstatImpl, link as linkImpl, symlink as symlinkImpl, readlink as readlinkImpl, diff --git a/src/Node/FS/Async.purs b/src/Node/FS/Async.purs index cd713c8..ded95f5 100644 --- a/src/Node/FS/Async.purs +++ b/src/Node/FS/Async.purs @@ -4,6 +4,7 @@ module Node.FS.Async , truncate , chown , chmod + , lstat , stat , link , symlink @@ -70,6 +71,7 @@ foreign import truncateImpl :: Fn3 FilePath Int (JSCallback Unit) Unit foreign import chownImpl :: Fn4 FilePath Int Int (JSCallback Unit) Unit foreign import chmodImpl :: Fn3 FilePath String (JSCallback Unit) Unit foreign import statImpl :: Fn2 FilePath (JSCallback StatsObj) Unit +foreign import lstatImpl :: Fn2 FilePath (JSCallback StatsObj) Unit foreign import linkImpl :: Fn3 FilePath FilePath (JSCallback Unit) Unit foreign import symlinkImpl :: Fn4 FilePath FilePath String (JSCallback Unit) Unit foreign import readlinkImpl :: Fn2 FilePath (JSCallback FilePath) Unit @@ -130,7 +132,16 @@ stat :: FilePath -> Effect Unit stat file cb = mkEffect $ \_ -> runFn2 - statImpl file (handleCallback $ cb <<< (<$>) Stats) + statImpl file (handleCallback $ cb <<< map Stats) + +-- | Gets file or symlink statistics. `lstat` is identical to `stat`, except +-- | that if theĀ `FilePath` is a symbolic link, then the link itself is stat-ed, +-- | not the file that it refers to. +lstat :: FilePath + -> Callback Stats + -> Effect Unit +lstat file cb = mkEffect $ \_ -> runFn2 + lstatImpl file (handleCallback $ cb <<< map Stats) -- | Creates a link to an existing file. link :: FilePath diff --git a/src/Node/FS/Sync.js b/src/Node/FS/Sync.js index bd93b52..43e4d79 100644 --- a/src/Node/FS/Sync.js +++ b/src/Node/FS/Sync.js @@ -4,6 +4,7 @@ export { chownSync as chownSyncImpl, chmodSync as chmodSyncImpl, statSync as statSyncImpl, + lstatSync as lstatSyncImpl, linkSync as linkSyncImpl, symlinkSync as symlinkSyncImpl, readlinkSync as readlinkSyncImpl, diff --git a/src/Node/FS/Sync.purs b/src/Node/FS/Sync.purs index 66f186a..93b8ffa 100644 --- a/src/Node/FS/Sync.purs +++ b/src/Node/FS/Sync.purs @@ -4,6 +4,7 @@ module Node.FS.Sync , chown , chmod , stat + , lstat , link , symlink , readlink @@ -57,6 +58,7 @@ foreign import truncateSyncImpl :: Fn2 FilePath Int Unit foreign import chownSyncImpl :: Fn3 FilePath Int Int Unit foreign import chmodSyncImpl :: Fn2 FilePath String Unit foreign import statSyncImpl :: Fn1 FilePath StatsObj +foreign import lstatSyncImpl :: Fn1 FilePath StatsObj foreign import linkSyncImpl :: Fn2 FilePath FilePath Unit foreign import symlinkSyncImpl :: Fn3 FilePath FilePath String Unit foreign import readlinkSyncImpl :: Fn1 FilePath FilePath @@ -116,6 +118,15 @@ stat :: FilePath stat file = map Stats $ mkEffect $ \_ -> runFn1 statSyncImpl file +-- | Gets file or symlink statistics. `lstat` is identical to `stat`, except +-- | that if theĀ `FilePath` is a symbolic link, then the link itself is stat-ed, +-- | not the file that it refers to. +lstat :: FilePath + -> Effect Stats + +lstat file = map Stats $ mkEffect $ \_ -> runFn1 + lstatSyncImpl file + -- | Creates a link to an existing file. link :: FilePath -> FilePath diff --git a/test/Test.purs b/test/Test.purs index c7eeb36..c58ff50 100644 --- a/test/Test.purs +++ b/test/Test.purs @@ -10,7 +10,7 @@ import Effect.Console (log) import Effect.Exception (Error, error, throwException, catchException) import Node.Buffer as Buffer import Node.Encoding (Encoding(..)) -import Node.FS (FileFlags(..)) +import Node.FS (FileFlags(..), SymlinkType(..)) import Node.FS.Async as A import Node.FS.Stats (statusChangedTime, accessedTime, modifiedTime, isSymbolicLink, isSocket, isFIFO, isCharacterDevice, isBlockDevice, isDirectory, isFile) import Node.FS.Sync as S @@ -74,6 +74,15 @@ main = do log "statusChangedTime:" log $ show $ statusChangedTime stats + S.symlink (fp ["tmp", "Test1.js"]) (fp ["tmp", "TestSymlink.js"]) FileLink + + lstats <- S.lstat (fp ["tmp", "TestSymlink.js"]) + log "\n\nS.lstat:" + log "isSymbolicLink:" + log $ show $ isSymbolicLink lstats + + S.unlink (fp ["tmp", "TestSymlink.js"]) + A.rename (fp ["tmp", "Test1.js"]) (fp ["tmp", "Test.js"]) $ \x -> do log "\n\nrename result:" either (log <<< show) (log <<< show) x @@ -92,7 +101,7 @@ main = do either (log <<< show) log x A.stat (fp ["test", "Test.purs"]) $ \x -> do - log "\n\nstat:" + log "\n\nA.stat:" case x of Left err -> log $ "Error:" <> show err Right x' -> do @@ -117,6 +126,21 @@ main = do log "statusChangedTime:" log $ show $ statusChangedTime x' + A.symlink (fp ["tmp", "Test.js"]) (fp ["tmp", "TestSymlink.js"]) FileLink \u -> + case u of + Left err -> log $ "Error:" <> show err + Right _ -> A.lstat (fp ["tmp", "TestSymlink.js"]) \s -> do + log "\n\nA.lstat:" + case s of + Left err -> log $ "Error:" <> show err + Right s' -> do + log "isSymbolicLink:" + log $ show $ isSymbolicLink s' + + A.unlink (fp ["tmp", "TestSymlink.js"]) \result -> do + log "\n\nA.unlink result:" + either (log <<< show) (\_ -> log "Success") result + let fdFile = fp ["tmp", "FD.json"] fd0 <- S.fdOpen fdFile W (Just 420) buf0 <- Buffer.fromString "[ 42 ]" UTF8