diff --git a/Command/Smudge.hs b/Command/Smudge.hs index 70a318c2d5..6cca8035e6 100644 --- a/Command/Smudge.hs +++ b/Command/Smudge.hs @@ -16,6 +16,7 @@ import Annex.FileMatcher import Types.KeySource import Backend import Logs.Location +import qualified Database.AssociatedFiles as AssociatedFiles import qualified Data.ByteString.Lazy as B @@ -42,12 +43,13 @@ seek o = commandAction $ -- Smudge filter is fed git file content, and if it's a pointer to an -- available annex object, should output its content. smudge :: FilePath -> CommandStart -smudge _file = do +smudge file = do liftIO $ fileEncoding stdin s <- liftIO $ hGetContents stdin case parsePointer s of Nothing -> liftIO $ putStr s Just k -> do + updateAssociatedFiles k file content <- calcRepo (gitAnnexLocation k) liftIO $ maybe (putStr s) @@ -62,6 +64,7 @@ clean file = do ifM (shouldAnnex file) ( do k <- ingest file + updateAssociatedFiles k file liftIO $ emitPointer k , liftIO cat ) @@ -107,3 +110,10 @@ parsePointer s where s' = take maxsz s maxsz = 81920 + +updateAssociatedFiles :: Key -> FilePath -> Annex () +updateAssociatedFiles k f = do + h <- AssociatedFiles.openDb + liftIO $ do + AssociatedFiles.addDb h k f + AssociatedFiles.closeDb h diff --git a/doc/todo/smudge.mdwn b/doc/todo/smudge.mdwn index d08d600aee..74a1435809 100644 --- a/doc/todo/smudge.mdwn +++ b/doc/todo/smudge.mdwn @@ -275,13 +275,14 @@ In particular: * Is the smudge filter called at any other time? Seems unlikely but then there could be situations with a detached work tree or such. * Does git call any useful hooks when removing a file from the work tree, - or converting it to not be annexed? + or converting it to not be annexed, or for `git mv` of an annexed file? No! From this analysis, any file map generated by the smudge/clean filters is necessary potentially innaccurate. It may list deleted files. It may or may not reflect current unstaged changes from the work tree. + Follows that any use of the file map needs to verify the info from it, and throw out bad cached info (updating the map to match reality).