diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-12-11 17:53:37 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-12-11 18:01:50 -0400 |
commit | d0e5d276fa98ad6be7370556555c0f49a4838466 (patch) | |
tree | e09636bf95ee811440b0e02c7d587029a3e04570 /Command/Smudge.hs | |
parent | f9e50ee7922068a2400dc9ddf4b30b059268981b (diff) |
avoid smudge filter returning invalid content
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.
Diffstat (limited to 'Command/Smudge.hs')
-rw-r--r-- | Command/Smudge.hs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/Command/Smudge.hs b/Command/Smudge.hs index 1353c2791..b7f18085a 100644 --- a/Command/Smudge.hs +++ b/Command/Smudge.hs @@ -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 |