diff options
-rw-r--r-- | Annex/Content/Direct.hs | 5 | ||||
-rw-r--r-- | Annex/Direct.hs | 6 | ||||
-rw-r--r-- | Command/Add.hs | 9 | ||||
-rw-r--r-- | Utility/InodeCache.hs | 10 |
4 files changed, 19 insertions, 11 deletions
diff --git a/Annex/Content/Direct.hs b/Annex/Content/Direct.hs index b0d549fc6..164cb64a4 100644 --- a/Annex/Content/Direct.hs +++ b/Annex/Content/Direct.hs @@ -13,6 +13,7 @@ module Annex.Content.Direct ( recordedInodeCache, updateInodeCache, writeInodeCache, + compareInodeCaches, sameInodeCache, sameFileStatus, removeInodeCache, @@ -146,7 +147,7 @@ sameFileStatus key status = do {- If the inodes have changed, only the size and mtime are compared. -} compareInodeCaches :: InodeCache -> InodeCache -> Annex Bool compareInodeCaches x y - | x == y = return True + | x `compareStrong` y = return True | otherwise = ifM inodesChanged ( return $ compareWeak x y , return False @@ -167,7 +168,7 @@ inodesChanged = maybe calc return =<< Annex.getState Annex.inodeschanged =<< fromRepo gitAnnexInodeSentinal scached <- readInodeSentinalFile let changed = case (scache, scached) of - (Just c1, Just c2) -> c1 /= c2 + (Just c1, Just c2) -> not $ compareStrong c1 c2 _ -> True Annex.changeState $ \s -> s { Annex.inodeschanged = Just changed } return changed diff --git a/Annex/Direct.hs b/Annex/Direct.hs index c6f12a7b8..1bebb2cb7 100644 --- a/Annex/Direct.hs +++ b/Annex/Direct.hs @@ -51,8 +51,10 @@ stageDirect = do - modified, so compare the cache to see if - it really was. -} oldcache <- recordedInodeCache key - when (oldcache /= Just cache) $ - modifiedannexed file key cache + case oldcache of + Nothing -> modifiedannexed file key cache + Just c -> unlessM (compareInodeCaches c cache) $ + modifiedannexed file key cache (Just key, Nothing, _) -> deletedannexed file key (Nothing, Nothing, _) -> deletegit file (_, Just _, _) -> addgit file diff --git a/Command/Add.hs b/Command/Add.hs index d41a0baea..7100006c6 100644 --- a/Command/Add.hs +++ b/Command/Add.hs @@ -109,11 +109,10 @@ ingest (Just source) = do backend <- chooseBackend $ keyFilename source k <- genKey source backend cache <- liftIO $ genInodeCache $ contentLocation source - case inodeCache source of - Nothing -> go k cache - Just c - | (Just c == cache) -> go k cache - | otherwise -> failure + case (cache, inodeCache source) of + (_, Nothing) -> go k cache + (Just newc, Just c) | compareStrong c newc -> go k cache + _ -> failure where go k cache = ifM isDirect ( godirect k cache , goindirect k cache ) diff --git a/Utility/InodeCache.hs b/Utility/InodeCache.hs index 5b9bdebcb..1d3f17887 100644 --- a/Utility/InodeCache.hs +++ b/Utility/InodeCache.hs @@ -12,7 +12,11 @@ import System.Posix.Types import Utility.QuickCheck data InodeCache = InodeCache FileID FileOffset EpochTime - deriving (Eq, Show) + deriving (Show) + +compareStrong :: InodeCache -> InodeCache -> Bool +compareStrong (InodeCache inode1 size1 mtime1) (InodeCache inode2 size2 mtime2) = + inode1 == inode2 && size1 == size2 && mtime1 == mtime2 {- Weak comparison of the inode caches, comparing the size and mtime, but - not the actual inode. Useful when inodes have changed, perhaps @@ -54,4 +58,6 @@ instance Arbitrary InodeCache where <*> arbitrary prop_read_show_inodecache :: InodeCache -> Bool -prop_read_show_inodecache c = readInodeCache (showInodeCache c) == Just c +prop_read_show_inodecache c = case readInodeCache (showInodeCache c) of + Nothing -> False + Just c' -> compareStrong c c' |