Bugfix: Direct mode no longer repeatedly checksums duplicated files.

Fixed by storing a list of cached inodes for a key, instead of just one.

Backwards compatability note: An old git-annex version will fail to parse
an inode cache file that has been written by a new version, and has
multiple items. It will succees if just one. So old git-annexes will have
even worse behavior when there are duplicated files, if that is possible.
I don't think it will be a problem. (Famous last words.)

Also, note that it doesn't expire old and unused inode caches for a key.
It would be possible to add this if needed; just look through the
associated files for a key and if there are more cached inodes, throw out
any not corresponding to associated files. Unless a file is being copied
repeatedly and the old copy deleted, this lack of expiry should not be a
problem.
This commit is contained in:
Joey Hess 2013-04-06 16:01:39 -04:00
parent 54d7637b3a
commit 602baae12e
6 changed files with 56 additions and 26 deletions

View file

@ -52,8 +52,8 @@ stageDirect = do
- it really was. -}
oldcache <- recordedInodeCache key
case oldcache of
Nothing -> modifiedannexed file key cache
Just c -> unlessM (compareInodeCaches c cache) $
[] -> modifiedannexed file key cache
_ -> unlessM (elemInodeCaches cache oldcache) $
modifiedannexed file key cache
(Just key, Nothing, _) -> deletedannexed file key
(Nothing, Nothing, _) -> deletegit file
@ -87,11 +87,11 @@ addDirect file cache = do
got Nothing = do
showEndFail
return False
got (Just (key, _)) = ifM (sameInodeCache file $ Just cache)
got (Just (key, _)) = ifM (sameInodeCache file [cache])
( do
l <- inRepo $ gitAnnexLink file key
stageSymlink file =<< hashSymlink l
writeInodeCache key cache
addInodeCache key cache
void $ addAssociatedFile key file
logStatus key InfoPresent
showEndOk