summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/Content/Direct.hs5
-rw-r--r--Annex/Direct.hs6
-rw-r--r--Command/Add.hs9
-rw-r--r--Utility/InodeCache.hs10
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'