assistant: Make expensive transfer scan work fully in direct mode.

The expensive scan uses lookupFile, but in direct mode, that doesn't work
for files that are present. So the scan was not finding things that are
present that need to be uploaded. (It did find things not present that
needed to be downloaded.)

Now lookupFile also works in direct mode. Note that it still prefers
symlinks on disk to info committed to git, in direct mode. This is
necessary to make things like Assistant.Threads.Watcher.onAddSymlink
work correctly, when given a new symlink not yet checked into git (or
replacing a file checked into git).
This commit is contained in:
Joey Hess 2013-01-05 15:26:22 -04:00
parent 15ecce2bfd
commit 1cdf2b923d
5 changed files with 38 additions and 11 deletions

View file

@ -9,8 +9,9 @@ module Annex.CatFile (
catFile, catFile,
catObject, catObject,
catObjectDetails, catObjectDetails,
catFileHandle,
catKey, catKey,
catFileHandle catKeyFile,
) where ) where
import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy as L
@ -46,4 +47,16 @@ catFileHandle = maybe startup return =<< Annex.getState Annex.catfilehandle
{- From the Sha or Ref of a symlink back to the key. -} {- From the Sha or Ref of a symlink back to the key. -}
catKey :: Ref -> Annex (Maybe Key) catKey :: Ref -> Annex (Maybe Key)
catKey ref = fileKey . takeFileName . encodeW8 . L.unpack <$> catObject ref catKey ref = do
l <- encodeW8 . L.unpack <$> catObject ref
return $ if isLinkToAnnex l
then fileKey $ takeFileName l
else Nothing
{- From a file in git back to the key.
-
- Prefixing the file with ./ makes this work even if in a subdirectory
- of a repo.
-}
catKeyFile :: FilePath -> Annex (Maybe Key)
catKeyFile f = catKey $ Ref $ ":./" ++ f

View file

@ -138,7 +138,7 @@ onAdd file filestatus
- really been modified. -} - really been modified. -}
onAddDirect :: Handler onAddDirect :: Handler
onAddDirect file fs = do onAddDirect file fs = do
v <- liftAnnex $ catKey (Ref $ ':':file) v <- liftAnnex $ catKeyFile file
case (v, fs) of case (v, fs) of
(Just key, Just filestatus) -> (Just key, Just filestatus) ->
ifM (liftAnnex $ changedFileStatus key filestatus) ifM (liftAnnex $ changedFileStatus key filestatus)

View file

@ -20,9 +20,11 @@ import System.Posix.Files
import Common.Annex import Common.Annex
import qualified Annex import qualified Annex
import Annex.CheckAttr import Annex.CheckAttr
import Annex.CatFile
import Types.Key import Types.Key
import Types.KeySource import Types.KeySource
import qualified Types.Backend as B import qualified Types.Backend as B
import Config
-- When adding a new backend, import it here and add it to the list. -- When adding a new backend, import it here and add it to the list.
import qualified Backend.SHA import qualified Backend.SHA
@ -73,21 +75,32 @@ genKey' (b:bs) source = do
| otherwise = c | otherwise = c
{- Looks up the key and backend corresponding to an annexed file, {- 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 :: FilePath -> Annex (Maybe (Key, Backend))
lookupFile file = do lookupFile file = do
tl <- liftIO $ tryIO $ readSymbolicLink file tl <- liftIO $ tryIO $ readSymbolicLink file
case tl of case tl of
Left _ -> return Nothing Right l
Right l -> makekey l | isLinkToAnnex l -> makekey l
| otherwise -> return Nothing
Left _ -> ifM isDirect
( maybe (return Nothing) makeret =<< catKeyFile file
, return Nothing
)
where where
makekey l = maybe (return Nothing) (makeret l) (fileKey $ takeFileName l) makekey l = maybe (return Nothing) makeret (fileKey $ takeFileName l)
makeret l k = let bname = keyBackendName k in makeret k = let bname = keyBackendName k in
case maybeLookupBackendName bname of case maybeLookupBackendName bname of
Just backend -> do Just backend -> do
return $ Just (k, backend) return $ Just (k, backend)
Nothing -> do Nothing -> do
when (isLinkToAnnex l) $ warning $ warning $
"skipping " ++ file ++ "skipping " ++ file ++
" (unknown backend " ++ bname ++ ")" " (unknown backend " ++ bname ++ ")"
return Nothing return Nothing

3
debian/changelog vendored
View file

@ -1,7 +1,8 @@
git-annex (3.20130103) UNRELEASED; urgency=low git-annex (3.20130105) UNRELEASED; urgency=low
* webapp: Add UI to stop and restart assistant. * webapp: Add UI to stop and restart assistant.
* committer: Fix a file handle leak. * committer: Fix a file handle leak.
* assistant: Make expensive transfer scan work fully in direct mode.
-- Joey Hess <joeyh@debian.org> Thu, 03 Jan 2013 14:58:45 -0400 -- Joey Hess <joeyh@debian.org> Thu, 03 Jan 2013 14:58:45 -0400

View file

@ -1,5 +1,5 @@
Name: git-annex Name: git-annex
Version: 3.20130105 Version: 3.20130103
Cabal-Version: >= 1.8 Cabal-Version: >= 1.8
License: GPL License: GPL
Maintainer: Joey Hess <joey@kitenet.net> Maintainer: Joey Hess <joey@kitenet.net>