avoid smudge filter returning invalid content
authorJoey Hess <joeyh@joeyh.name>
Fri, 11 Dec 2015 21:53:37 +0000 (17:53 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 11 Dec 2015 22:01:50 +0000 (18:01 -0400)
1. git add file
2. git commit
3. modify file
4. git commit
5. git reset HEAD^

Before this fix, that resulted in git saying the file was modified. And
indeed, it didn't have the content it should in the just checked out ref,
because step 3 modified the object file for the old key.

Command/Smudge.hs

index 1353c279159519b077bc1847e1e9529226a96433..b7f18085ad1cd8a534d3abb60c94c73bce87ad15 100644 (file)
@@ -48,10 +48,19 @@ smudge file = do
        case parseLinkOrPointer b of
                Nothing -> liftIO $ B.putStr b
                Just k -> do
+                       -- A previous unlocked checkout of the file may have
+                       -- led to the annex object getting modified;
+                       -- don't provide such modified content as it
+                       -- will be confusing. inAnnex will detect
+                       -- modifications.
+                       ifM (inAnnex k)
+                               ( do
+                                       content <- calcRepo (gitAnnexLocation k)
+                                       liftIO $ B.putStr . fromMaybe b
+                                               =<< catchMaybeIO (B.readFile content)
+                               , liftIO $ B.putStr b
+                               )
                        Database.Keys.addAssociatedFile k file
-                       content <- calcRepo (gitAnnexLocation k)
-                       liftIO $ B.hPut stdout . fromMaybe b
-                               =<< catchMaybeIO (B.readFile content)
        stop
 
 -- Clean filter is fed file content on stdin, decides if a file