aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/Direct.hs22
-rw-r--r--debian/changelog2
2 files changed, 18 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]
diff --git a/debian/changelog b/debian/changelog
index f744f09e0..fa4c5cfb7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -21,6 +21,8 @@ git-annex (4.20130418) UNRELEASED; urgency=low
* assistant: When built with git before 1.8.0, use `git remote rm`
to delete a remote. Newer git uses `git remote remove`.
* rmurl: New command, removes one of the recorded urls for a file.
+ * sync: Bug fix, avoid adding to the annex the
+ dummy symlinks used on crippled filesystems.
-- Joey Hess <joeyh@debian.org> Thu, 18 Apr 2013 16:22:48 -0400