aboutsummaryrefslogtreecommitdiff
path: root/Annex/Direct.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-04-23 17:13:09 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-04-23 17:14:28 -0400
commit7b3dee7e718e8b19fb9b2458fc507ffb5f4fbcba (patch)
tree8c990068677b4a32b9ee12b40967036023229f34 /Annex/Direct.hs
parent32f77d97001aa52561bc35060027839bbd184972 (diff)
sync: Bug fix, avoid adding to the annex the dummy symlinks used on crippled filesystems.
The root of the problem is that toInodeCache sees a non-symlink, and so goes on and generates a new inode cache for the dummy symlink. Any place that toInodeCache, or sameFileStatus, or genInodeCache are called may need to deal with this case. Although many of them are ok. For example, prepSendAnnex calls sameInodeCache, which calls genInodeCache.. but if the file content is not present, the InodeCache generated for its standin file is appropriately not the same, and so it returns Nothing. I've audited some, but have to say I'm not happy with this; it should be handled at the type level somehow, or a toInodeCache wrapper be used that is aware of dummy symlinks. (The Watcher already dealt with it, via the guardSymlinkStandin function.)
Diffstat (limited to 'Annex/Direct.hs')
-rw-r--r--Annex/Direct.hs22
1 files changed, 16 insertions, 6 deletions
diff --git a/Annex/Direct.hs b/Annex/Direct.hs
index a0388017e..68da12a22 100644
--- a/Annex/Direct.hs
+++ b/Annex/Direct.hs
@@ -43,10 +43,15 @@ stageDirect = do
- efficiently as we can, by getting any key that's associated
- with it in git, as well as its stat info. -}
go (file, Just sha) = do
- mkey <- catKey sha
+ shakey <- catKey sha
mstat <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file
- case (mkey, mstat, toInodeCache =<< mstat) of
- (Just key, _, Just cache) -> do
+ filekey <- isAnnexLink file
+ case (shakey, filekey, mstat, toInodeCache =<< mstat) of
+ (_, Just key, _, _)
+ | shakey == filekey -> noop
+ {- A changed symlink. -}
+ | otherwise -> stageannexlink file key
+ (Just key, _, _, Just cache) -> do
{- All direct mode files will show as
- modified, so compare the cache to see if
- it really was. -}
@@ -55,9 +60,9 @@ stageDirect = do
[] -> modifiedannexed file key cache
_ -> unlessM (elemInodeCaches cache oldcache) $
modifiedannexed file key cache
- (Just key, Nothing, _) -> deletedannexed file key
- (Nothing, Nothing, _) -> deletegit file
- (_, Just _, _) -> addgit file
+ (Just key, _, Nothing, _) -> deletedannexed file key
+ (Nothing, _, Nothing, _) -> deletegit file
+ (_, _, Just _, _) -> addgit file
go _ = noop
modifiedannexed file oldkey cache = do
@@ -68,6 +73,11 @@ stageDirect = do
void $ removeAssociatedFile key file
deletegit file
+ stageannexlink file key = do
+ l <- inRepo $ gitAnnexLink file key
+ stageSymlink file =<< hashSymlink l
+ void $ addAssociatedFile key file
+
addgit file = Annex.Queue.addCommand "add" [Param "-f"] [file]
deletegit file = Annex.Queue.addCommand "rm" [Param "-f"] [file]