a2f17146fa
This is possible now that we build-depend on QuickCheck.
58 lines
1.6 KiB
Haskell
58 lines
1.6 KiB
Haskell
{- Caching a file's inode, size, and modification time to see when it's changed.
|
|
-
|
|
- Copyright 2013 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Utility.InodeCache where
|
|
|
|
import Common
|
|
import System.Posix.Types
|
|
import Test.QuickCheck
|
|
import Utility.QuickCheck ()
|
|
|
|
data InodeCache = InodeCache FileID FileOffset EpochTime
|
|
deriving (Eq, Show)
|
|
|
|
{- Weak comparison of the inode caches, comparing the size and mtime, but
|
|
- not the actual inode. Useful when inodes have changed, perhaps
|
|
- due to some filesystems being remounted. -}
|
|
compareWeak :: InodeCache -> InodeCache -> Bool
|
|
compareWeak (InodeCache _ size1 mtime1) (InodeCache _ size2 mtime2) =
|
|
size1 == size2 && mtime1 == mtime2
|
|
|
|
showInodeCache :: InodeCache -> String
|
|
showInodeCache (InodeCache inode size mtime) = unwords
|
|
[ show inode
|
|
, show size
|
|
, show mtime
|
|
]
|
|
|
|
readInodeCache :: String -> Maybe InodeCache
|
|
readInodeCache s = case words s of
|
|
(inode:size:mtime:_) -> InodeCache
|
|
<$> readish inode
|
|
<*> readish size
|
|
<*> readish mtime
|
|
_ -> Nothing
|
|
|
|
genInodeCache :: FilePath -> IO (Maybe InodeCache)
|
|
genInodeCache f = catchDefaultIO Nothing $ toInodeCache <$> getFileStatus f
|
|
|
|
toInodeCache :: FileStatus -> Maybe InodeCache
|
|
toInodeCache s
|
|
| isRegularFile s = Just $ InodeCache
|
|
(fileID s)
|
|
(fileSize s)
|
|
(modificationTime s)
|
|
| otherwise = Nothing
|
|
|
|
instance Arbitrary InodeCache where
|
|
arbitrary = InodeCache
|
|
<$> arbitrary
|
|
<*> arbitrary
|
|
<*> arbitrary
|
|
|
|
prop_read_show_inodecache :: InodeCache -> Bool
|
|
prop_read_show_inodecache c = readInodeCache (showInodeCache c) == Just c
|