aboutsummaryrefslogtreecommitdiff
path: root/Remote/Git.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2018-03-07 14:13:02 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2018-03-07 14:23:52 -0400
commit599258b9442b776dc4079d3e42f4794fa8345c80 (patch)
tree185957a33baee91c7073c5c3db82d1383004b0b7 /Remote/Git.hs
parent0b98b883e40d1019ff9cdcd6c9ff58079ffe68b6 (diff)
make sure that lockContentShared is always paired with an inAnnex check
lockContentShared had a screwy caveat that it didn't verify that the content was present when locking it, but in the most common case, eg indirect mode, it failed to lock when the content is not present. That led to a few callers forgetting to check inAnnex when using it, but the potential data loss was unlikely to be noticed because it only affected direct mode I think. Fix data loss bug when the local repository uses direct mode, and a locally modified file is dropped from a remote repsitory. The bug caused the modified file to be counted as a copy of the original file. (This is not a severe bug because in such a situation, dropping from the remote and then modifying the file is allowed and has the same end result.) And, in content locking over tor, when the remote repository is in direct mode, it neglected to check that the content was actually present when locking it. This could cause git annex drop to remove the only copy of a file when it thought the tor remote had a copy. So, make lockContentShared do its own inAnnex check. This could perhaps be optimised for direct mode, to avoid the check then, since locking the content necessarily verifies it exists there, but I have not bothered with that. This commit was sponsored by Jeff Goeke-Smith on Patreon.
Diffstat (limited to 'Remote/Git.hs')
-rw-r--r--Remote/Git.hs7
1 files changed, 2 insertions, 5 deletions
diff --git a/Remote/Git.hs b/Remote/Git.hs
index 2cebcce4a..caa677464 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -391,11 +391,8 @@ lockKey r duc key callback
-- and then run the callback in the original
-- annex monad, not the remote's.
onLocalFast r $
- Annex.Content.lockContentShared key $ \vc ->
- ifM (Annex.Content.inAnnex key)
- ( liftIO $ inorigrepo $ callback vc
- , failedlock
- )
+ Annex.Content.lockContentShared key $
+ liftIO . inorigrepo . callback
, failedlock
)
| Git.repoIsSsh (repo r) = do