summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-03-11 02:57:48 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-03-11 02:57:48 -0400
commita41051e59143824921a7e6e3d60bc2b50881d4b4 (patch)
treefcf1f3cadedd053b2ee2206d600350a763526228
parent9b5b4d3df90eee8e6a9a25bda22f41e82adeaf18 (diff)
remove Eq instance for InodeCache
There are two types of equality here, and which one is right varies, so this forces me to consider and choose between them. Based on this, I learned that the commit in git anex sync was always doing a strong comparison, even when in a repository where the inodes had changed. Fixed that.
-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'