summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-12-07 14:35:46 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-12-07 14:41:22 -0400
commit42a370de0544e65fc1f150d3b2406b6683b7e5e1 (patch)
tree036b3f66c983a33f3dc2915892cf0821eff65010
parentd71bdba6009d522db726121b17980a3d32919f74 (diff)
update associated files database on smudge and clean
-rw-r--r--Command/Smudge.hs12
-rw-r--r--doc/todo/smudge.mdwn3
2 files changed, 13 insertions, 2 deletions
diff --git a/Command/Smudge.hs b/Command/Smudge.hs
index 70a318c2d..6cca8035e 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 d08d600ae..74a143580 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).