packages feed

unix-compat 0.5.2 → 0.5.3

raw patch · 4 files changed

+64/−53 lines, 4 filesdep ~unixPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: unix

API changes (from Hackage documentation)

+ System.PosixCompat.Files: accessTimeHiRes :: FileStatus -> POSIXTime
+ System.PosixCompat.Files: modificationTimeHiRes :: FileStatus -> POSIXTime
+ System.PosixCompat.Files: statusChangeTimeHiRes :: FileStatus -> POSIXTime

Files

src/System/PosixCompat/Files.hsc view
@@ -59,6 +59,9 @@     , accessTime     , modificationTime     , statusChangeTime+    , accessTimeHiRes+    , modificationTimeHiRes+    , statusChangeTimeHiRes     , isBlockDevice     , isCharacterDevice     , isNamedPipe@@ -120,6 +123,7 @@ import Control.Monad (liftM, liftM2) import Data.Bits ((.|.), (.&.)) import Data.Int (Int64)+import Data.Time.Clock.POSIX (POSIXTime) import Foreign.C.Types (CTime(..)) import Prelude hiding (read) import System.Directory (Permissions, emptyPermissions)@@ -129,8 +133,7 @@ import System.Directory (executable, setOwnerExecutable) import System.Directory (searchable, setOwnerSearchable) import System.Directory (doesFileExist, doesDirectoryExist)-import System.Directory (getModificationTime, renameFile)-import System.IO (IOMode(..), openFile, hFileSize, hSetFileSize, hClose)+import System.IO (IOMode(..), openFile, hSetFileSize, hClose) import System.IO.Error import System.PosixCompat.Types import System.Win32.File hiding (getFileType)@@ -139,7 +142,6 @@  import System.PosixCompat.Internal.Time (       getClockTime, clockTimeToEpochTime-    , modificationTimeToEpochTime     )  #ifdef __GLASGOW_HASKELL__@@ -267,17 +269,20 @@ -- stat() support  data FileStatus = FileStatus-    { deviceID         :: DeviceID-    , fileID           :: FileID-    , fileMode         :: FileMode-    , linkCount        :: LinkCount-    , fileOwner        :: UserID-    , fileGroup        :: GroupID-    , specialDeviceID  :: DeviceID-    , fileSize         :: FileOffset-    , accessTime       :: EpochTime-    , modificationTime :: EpochTime-    , statusChangeTime :: EpochTime+    { deviceID              :: DeviceID+    , fileID                :: FileID+    , fileMode              :: FileMode+    , linkCount             :: LinkCount+    , fileOwner             :: UserID+    , fileGroup             :: GroupID+    , specialDeviceID       :: DeviceID+    , fileSize              :: FileOffset+    , accessTime            :: EpochTime+    , modificationTime      :: EpochTime+    , statusChangeTime      :: EpochTime+    , accessTimeHiRes       :: POSIXTime+    , modificationTimeHiRes :: POSIXTime+    , statusChangeTimeHiRes :: POSIXTime     }  isBlockDevice :: FileStatus -> Bool@@ -312,9 +317,10 @@ getFileStatus path = do     perm  <- liftM permsToMode (getPermissions path)     typ   <- getFileType path-    size  <- if typ == regularFileMode then getFileSize path else return 0-    mtime <- liftM modificationTimeToEpochTime (getModificationTime path)     info  <- bracket openPath closeHandle getFileInformationByHandle+    let atime = windowsToPosixTime (bhfiLastAccessTime info)+        mtime = windowsToPosixTime (bhfiLastWriteTime info)+        ctime = windowsToPosixTime (bhfiCreationTime info)     return $ FileStatus              { deviceID         = fromIntegral (bhfiVolumeSerialNumber info)              , fileID           = fromIntegral (bhfiFileIndex info)@@ -323,10 +329,14 @@              , fileOwner        = 0              , fileGroup        = 0              , specialDeviceID  = 0-             , fileSize         = size-             , accessTime       = mtime-             , modificationTime = mtime-             , statusChangeTime = mtime }+             , fileSize         = fromIntegral (bhfiSize info)+             , accessTime       = posixTimeToEpochTime atime+             , modificationTime = posixTimeToEpochTime mtime+             , statusChangeTime = posixTimeToEpochTime mtime+             , accessTimeHiRes       = atime+             , modificationTimeHiRes = mtime+             , statusChangeTimeHiRes = ctime+             }   where     openPath = createFile path                  gENERIC_READ@@ -336,6 +346,32 @@                  (sECURITY_ANONYMOUS .|. fILE_FLAG_BACKUP_SEMANTICS)                  Nothing +-- | Convert a 'POSIXTime' (synomym for 'Data.Time.Clock.NominalDiffTime')+-- into an 'EpochTime' (integral number of seconds since epoch). This merely+-- throws away the fractional part.+posixTimeToEpochTime :: POSIXTime -> EpochTime+posixTimeToEpochTime = fromInteger . floor++-- three function stolen from System.Directory.Internals.Windows:++-- | Difference between the Windows and POSIX epochs in units of 100ns.+windowsPosixEpochDifference :: Num a => a+windowsPosixEpochDifference = 116444736000000000++-- | Convert from Windows time to POSIX time.+windowsToPosixTime :: FILETIME -> POSIXTime+windowsToPosixTime (FILETIME t) =+  (fromIntegral t - windowsPosixEpochDifference) / 10000000++{- will be needed to /set/ high res timestamps, not yet supported++-- | Convert from POSIX time to Windows time.  This is lossy as Windows time+--   has a resolution of only 100ns.+posixToWindowsTime :: POSIXTime -> FILETIME+posixToWindowsTime t = FILETIME $+  truncate (t * 10000000 + windowsPosixEpochDifference)+-}+ permsToMode :: Permissions -> FileMode permsToMode perms = r .|. w .|. x   where@@ -353,10 +389,6 @@             else do d <- doesDirectoryExist path                     if d then return directoryMode                          else unsupported "Unknown file type."--getFileSize :: FilePath -> IO FileOffset-getFileSize path =-    bracket (openFile path ReadMode) hClose (liftM fromIntegral . hFileSize)  getFdStatus :: Fd -> IO FileStatus getFdStatus _ = unsupported "getFdStatus"
src/System/PosixCompat/Internal/Time.hs view
@@ -7,8 +7,6 @@       ClockTime     , getClockTime     , clockTimeToEpochTime-    , ModificationTime-    , modificationTimeToEpochTime     ) where  import System.Posix.Types (EpochTime)@@ -20,15 +18,9 @@ clockTimeToEpochTime :: ClockTime -> EpochTime clockTimeToEpochTime (TOD s _) = fromInteger s -type ModificationTime = ClockTime--modificationTimeToEpochTime :: ModificationTime -> EpochTime-modificationTimeToEpochTime = clockTimeToEpochTime- #else -import Data.Time.Clock (UTCTime)-import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime, utcTimeToPOSIXSeconds)+import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime)  type ClockTime = POSIXTime @@ -37,10 +29,5 @@  clockTimeToEpochTime :: ClockTime -> EpochTime clockTimeToEpochTime = fromInteger . floor--type ModificationTime = UTCTime--modificationTimeToEpochTime :: UTCTime -> EpochTime-modificationTimeToEpochTime = clockTimeToEpochTime . utcTimeToPOSIXSeconds  #endif
src/System/PosixCompat/Types.hs view
@@ -8,14 +8,11 @@ redefined by this module. -} module System.PosixCompat.Types (+      module System.Posix.Types #ifdef mingw32_HOST_OS-     module AllPosixTypesButFileID-    , FileID     , UserID     , GroupID     , LinkCount-#else-     module System.Posix.Types #endif     ) where @@ -23,15 +20,9 @@ -- Since CIno (FileID's underlying type) reflects <sys/type.h> ino_t, -- which mingw defines as short int (int16), it must be overriden to -- match the size of windows fileIndex (word64).-import System.Posix.Types as AllPosixTypesButFileID hiding (FileID)--import Data.Word (Word32, Word64)+import System.Posix.Types -newtype FileID = FileID Word64-  deriving (Eq, Ord, Enum, Bounded, Integral, Num, Real)-instance Show FileID where show (FileID x) = show x-instance Read FileID where readsPrec i s = [ (FileID x, s')-                                           | (x,s') <- readsPrec i s]+import Data.Word (Word32)  newtype UserID = UserID Word32   deriving (Eq, Ord, Enum, Bounded, Integral, Num, Real)
unix-compat.cabal view
@@ -1,5 +1,5 @@ name:           unix-compat-version:        0.5.2+version:        0.5.3 synopsis:       Portable POSIX-compatibility layer. description:    This package provides portable implementations of parts                 of the unix package. This package re-exports the unix@@ -13,7 +13,7 @@ maintainer:     Jacob Stanley <jacob@stanley.io> category:       System build-type:     Simple-cabal-version:  >= 1.6+cabal-version:  >= 1.10  source-repository head   type:     git@@ -24,6 +24,7 @@   default: False  Library+  default-language: Haskell2010   hs-source-dirs: src   ghc-options: -Wall   build-depends: base == 4.*@@ -56,7 +57,7 @@       else         build-depends: directory == 1.1.*     else-      build-depends: time >= 1.0 && < 1.9+      build-depends: time >= 1.0 && < 1.10       build-depends: directory >= 1.2 && < 1.4      other-modules: