aboutsummaryrefslogtreecommitdiff
path: root/Backend.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Backend.hs')
-rw-r--r--Backend.hs25
1 files changed, 19 insertions, 6 deletions
diff --git a/Backend.hs b/Backend.hs
index 9c08e1437..d5007f0f9 100644
--- a/Backend.hs
+++ b/Backend.hs
@@ -20,9 +20,11 @@ import System.Posix.Files
import Common.Annex
import qualified Annex
import Annex.CheckAttr
+import Annex.CatFile
import Types.Key
import Types.KeySource
import qualified Types.Backend as B
+import Config
-- When adding a new backend, import it here and add it to the list.
import qualified Backend.SHA
@@ -73,21 +75,32 @@ genKey' (b:bs) source = do
| otherwise = c
{- Looks up the key and backend corresponding to an annexed file,
- - by examining what the file symlinks to. -}
+ - by examining what the file symlinks to.
+ -
+ - In direct mode, there is often no symlink on disk, in which case
+ - the symlink is looked up in git instead. However, a real symlink
+ - on disk still takes precedence over what was committed to git in direct
+ - mode.
+ -}
lookupFile :: FilePath -> Annex (Maybe (Key, Backend))
lookupFile file = do
tl <- liftIO $ tryIO $ readSymbolicLink file
case tl of
- Left _ -> return Nothing
- Right l -> makekey l
+ Right l
+ | isLinkToAnnex l -> makekey l
+ | otherwise -> return Nothing
+ Left _ -> ifM isDirect
+ ( maybe (return Nothing) makeret =<< catKeyFile file
+ , return Nothing
+ )
where
- makekey l = maybe (return Nothing) (makeret l) (fileKey $ takeFileName l)
- makeret l k = let bname = keyBackendName k in
+ makekey l = maybe (return Nothing) makeret (fileKey $ takeFileName l)
+ makeret k = let bname = keyBackendName k in
case maybeLookupBackendName bname of
Just backend -> do
return $ Just (k, backend)
Nothing -> do
- when (isLinkToAnnex l) $ warning $
+ warning $
"skipping " ++ file ++
" (unknown backend " ++ bname ++ ")"
return Nothing