summaryrefslogtreecommitdiff
path: root/Utility/RawFilePath.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/RawFilePath.hs')
-rw-r--r--Utility/RawFilePath.hs48
1 files changed, 44 insertions, 4 deletions
diff --git a/Utility/RawFilePath.hs b/Utility/RawFilePath.hs
index 6a5f704..f32b226 100644
--- a/Utility/RawFilePath.hs
+++ b/Utility/RawFilePath.hs
@@ -1,4 +1,4 @@
-{- Portability shim around System.Posix.Files.ByteString
+{- Portability shim for basic operations on RawFilePaths.
-
- On unix, this makes syscalls using RawFilesPaths as efficiently as
- possible.
@@ -7,38 +7,69 @@
- decoded. So this library will work, but less efficiently than using
- FilePath would.
-
- - Copyright 2019 Joey Hess <id@joeyh.name>
+ - Copyright 2019-2020 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.RawFilePath (
RawFilePath,
readSymbolicLink,
+ createSymbolicLink,
+ createLink,
+ removeLink,
getFileStatus,
getSymbolicLinkStatus,
doesPathExist,
+ getCurrentDirectory,
+ createDirectory,
+ setFileMode,
) where
#ifndef mingw32_HOST_OS
import Utility.FileSystemEncoding (RawFilePath)
import System.Posix.Files.ByteString
+import qualified System.Posix.Directory.ByteString as D
+-- | Checks if a file or directory exists. Note that a dangling symlink
+-- will be false.
doesPathExist :: RawFilePath -> IO Bool
doesPathExist = fileExist
+getCurrentDirectory :: IO RawFilePath
+getCurrentDirectory = D.getWorkingDirectory
+
+createDirectory :: RawFilePath -> IO ()
+createDirectory p = D.createDirectory p 0o777
+
#else
-import qualified Data.ByteString as B
-import System.PosixCompat (FileStatus)
+import System.PosixCompat (FileStatus, FileMode)
import qualified System.PosixCompat as P
+import qualified System.PosixCompat.Files as F
import qualified System.Directory as D
import Utility.FileSystemEncoding
readSymbolicLink :: RawFilePath -> IO RawFilePath
readSymbolicLink f = toRawFilePath <$> P.readSymbolicLink (fromRawFilePath f)
+createSymbolicLink :: RawFilePath -> RawFilePath -> IO ()
+createSymbolicLink a b = P.createSymbolicLink
+ (fromRawFilePath a)
+ (fromRawFilePath b)
+
+createLink :: RawFilePath -> RawFilePath -> IO ()
+createLink a b = P.createLink
+ (fromRawFilePath a)
+ (fromRawFilePath b)
+
+{- On windows, removeLink is not available, so only remove files,
+ - not symbolic links. -}
+removeLink :: RawFilePath -> IO ()
+removeLink = D.removeFile . fromRawFilePath
+
getFileStatus :: RawFilePath -> IO FileStatus
getFileStatus = P.getFileStatus . fromRawFilePath
@@ -47,4 +78,13 @@ getSymbolicLinkStatus = P.getSymbolicLinkStatus . fromRawFilePath
doesPathExist :: RawFilePath -> IO Bool
doesPathExist = D.doesPathExist . fromRawFilePath
+
+getCurrentDirectory :: IO RawFilePath
+getCurrentDirectory = toRawFilePath <$> D.getCurrentDirectory
+
+createDirectory :: RawFilePath -> IO ()
+createDirectory = D.createDirectory . fromRawFilePath
+
+setFileMode :: RawFilePath -> FileMode -> IO ()
+setFileMode = F.setFileMode . fromRawFilePath
#endif