summaryrefslogtreecommitdiff
path: root/Annex/Content/Direct.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Annex/Content/Direct.hs')
-rw-r--r--Annex/Content/Direct.hs90
1 files changed, 23 insertions, 67 deletions
diff --git a/Annex/Content/Direct.hs b/Annex/Content/Direct.hs
index 9e917cf68..07edb4dd9 100644
--- a/Annex/Content/Direct.hs
+++ b/Annex/Content/Direct.hs
@@ -11,14 +11,11 @@ module Annex.Content.Direct (
addAssociatedFile,
goodContent,
changedFileStatus,
- updateCache,
- recordedCache,
- compareCache,
- writeCache,
- genCache,
- toCache,
- Cache(..),
- prop_read_show_direct
+ recordedInodeCache,
+ updateInodeCache,
+ writeInodeCache,
+ compareInodeCache,
+ toInodeCache,
) where
import Common.Annex
@@ -26,8 +23,7 @@ import Annex.Perms
import qualified Git
import Utility.TempFile
import Logs.Location
-
-import System.Posix.Types
+import Utility.InodeCache
{- Absolute FilePaths of Files in the tree that are associated with a key. -}
associatedFiles :: Key -> Annex [FilePath]
@@ -98,70 +94,30 @@ normaliseAssociatedFile file = do
-}
goodContent :: Key -> FilePath -> Annex Bool
goodContent key file = do
- old <- recordedCache key
- compareCache file old
+ old <- recordedInodeCache key
+ liftIO $ compareInodeCache file old
changedFileStatus :: Key -> FileStatus -> Annex Bool
changedFileStatus key status = do
- old <- recordedCache key
- let curr = toCache status
+ old <- recordedInodeCache key
+ let curr = toInodeCache status
return $ curr /= old
-{- Gets the recorded cache for a key. -}
-recordedCache :: Key -> Annex (Maybe Cache)
-recordedCache key = withCacheFile key $ \cachefile ->
- liftIO $ catchDefaultIO Nothing $ readCache <$> readFile cachefile
-
-{- Compares a cache with the current cache for a file. -}
-compareCache :: FilePath -> Maybe Cache -> Annex Bool
-compareCache file old = do
- curr <- liftIO $ genCache file
- return $ isJust curr && curr == old
+{- Gets the recorded inode cache for a key. -}
+recordedInodeCache :: Key -> Annex (Maybe InodeCache)
+recordedInodeCache key = withInodeCacheFile key $ \f ->
+ liftIO $ catchDefaultIO Nothing $ readInodeCache <$> readFile f
{- Stores a cache of attributes for a file that is associated with a key. -}
-updateCache :: Key -> FilePath -> Annex ()
-updateCache key file = maybe noop (writeCache key) =<< liftIO (genCache file)
+updateInodeCache :: Key -> FilePath -> Annex ()
+updateInodeCache key file = maybe noop (writeInodeCache key)
+ =<< liftIO (genInodeCache file)
{- Writes a cache for a key. -}
-writeCache :: Key -> Cache -> Annex ()
-writeCache key cache = withCacheFile key $ \cachefile -> do
- createContentDir cachefile
- liftIO $ writeFile cachefile $ showCache cache
-
-{- Cache a file's inode, size, and modification time to determine if it's
- - been changed. -}
-data Cache = Cache FileID FileOffset EpochTime
- deriving (Eq, Show)
-
-showCache :: Cache -> String
-showCache (Cache inode size mtime) = unwords
- [ show inode
- , show size
- , show mtime
- ]
-
-readCache :: String -> Maybe Cache
-readCache s = case words s of
- (inode:size:mtime:_) -> Cache
- <$> readish inode
- <*> readish size
- <*> readish mtime
- _ -> Nothing
-
--- for quickcheck
-prop_read_show_direct :: Cache -> Bool
-prop_read_show_direct c = readCache (showCache c) == Just c
-
-genCache :: FilePath -> IO (Maybe Cache)
-genCache f = catchDefaultIO Nothing $ toCache <$> getFileStatus f
-
-toCache :: FileStatus -> Maybe Cache
-toCache s
- | isRegularFile s = Just $ Cache
- (fileID s)
- (fileSize s)
- (modificationTime s)
- | otherwise = Nothing
+writeInodeCache :: Key -> InodeCache -> Annex ()
+writeInodeCache key cache = withInodeCacheFile key $ \f -> do
+ createContentDir f
+ liftIO $ writeFile f $ showInodeCache cache
-withCacheFile :: Key -> (FilePath -> Annex a) -> Annex a
-withCacheFile key a = a =<< inRepo (gitAnnexCache key)
+withInodeCacheFile :: Key -> (FilePath -> Annex a) -> Annex a
+withInodeCacheFile key a = a =<< inRepo (gitAnnexInodeCache key)