fix nested exception bug

Fix reversion introduced in version 6.20180316 that caused git-annex to
stop processing files when unable to contact a ssh remote.

The bug was not in any of the changed lines, but this one in inAnnex:

P2PHelper.checkpresent (Ssh.runProto rmt connpool (cantCheck rmt) fallback) key

cantCheck throws an exception, but that parameter to runProto expects a
value, which it returns. So, inAnnex is returning a Bool containing an
exception. This defeats the usual checks for checkPresent throwing an
exception, crashing git-annex.

Fixed by making runProto take an `Annex a` instead of an `a`, so
passing cantCheck to it doesn't nest exceptions.

This commit was sponsored by andrea rota.
This commit is contained in:
Joey Hess 2018-07-03 13:09:04 -04:00
parent edd257dcfb
commit 9f3a346f25
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 19 additions and 6 deletions

View file

@ -8,6 +8,8 @@ git-annex (6.20180627) UNRELEASED; urgency=medium
still check if the url is one that it supports, and fail downloading still check if the url is one that it supports, and fail downloading
it, instead of downloading the raw web page. it, instead of downloading the raw web page.
* git-annex.cabal: Fix network version. * git-annex.cabal: Fix network version.
* Fix reversion introduced in version 6.20180316 that caused git-annex to
stop processing files when unable to contact a ssh remote.
-- Joey Hess <id@joeyh.name> Fri, 22 Jun 2018 10:36:22 -0400 -- Joey Hess <id@joeyh.name> Fri, 22 Jun 2018 10:36:22 -0400

View file

@ -395,7 +395,7 @@ dropKey' repo r (State connpool duc _) key
| Git.repoIsHttp repo = giveup "dropping from http remote not supported" | Git.repoIsHttp repo = giveup "dropping from http remote not supported"
| otherwise = commitOnCleanup repo r $ do | otherwise = commitOnCleanup repo r $ do
let fallback = Ssh.dropKey repo key let fallback = Ssh.dropKey repo key
P2PHelper.remove (Ssh.runProto r connpool False fallback) key P2PHelper.remove (Ssh.runProto r connpool (return False) fallback) key
lockKey :: Remote -> State -> Key -> (VerifiedCopy -> Annex r) -> Annex r lockKey :: Remote -> State -> Key -> (VerifiedCopy -> Annex r) -> Annex r
lockKey r st key callback = do lockKey r st key callback = do
@ -493,7 +493,7 @@ copyFromRemote'' repo forcersync r (State connpool _ _) key file dest meterupdat
| Git.repoIsSsh repo = if forcersync | Git.repoIsSsh repo = if forcersync
then fallback meterupdate then fallback meterupdate
else P2PHelper.retrieve else P2PHelper.retrieve
(\p -> Ssh.runProto r connpool (False, UnVerified) (fallback p)) (\p -> Ssh.runProto r connpool (return (False, UnVerified)) (fallback p))
key file dest meterupdate key file dest meterupdate
| otherwise = giveup "copying from non-ssh, non-http remote not supported" | otherwise = giveup "copying from non-ssh, non-http remote not supported"
where where
@ -605,7 +605,7 @@ copyToRemote' repo r (State connpool duc _) key file meterupdate
) )
| Git.repoIsSsh repo = commitOnCleanup repo r $ | Git.repoIsSsh repo = commitOnCleanup repo r $
P2PHelper.store P2PHelper.store
(\p -> Ssh.runProto r connpool False (copyremotefallback p)) (\p -> Ssh.runProto r connpool (return False) (copyremotefallback p))
key file meterupdate key file meterupdate
| otherwise = giveup "copying to non-ssh repo not supported" | otherwise = giveup "copying to non-ssh repo not supported"

View file

@ -321,8 +321,8 @@ newStderrHandler errh = do
-- Runs a P2P Proto action on a remote when it supports that, -- Runs a P2P Proto action on a remote when it supports that,
-- otherwise the fallback action. -- otherwise the fallback action.
runProto :: Remote -> P2PSshConnectionPool -> a -> Annex a -> P2P.Proto a -> Annex (Maybe a) runProto :: Remote -> P2PSshConnectionPool -> Annex a -> Annex a -> P2P.Proto a -> Annex (Maybe a)
runProto r connpool bad fallback proto = Just <$> runProto r connpool badproto fallback proto = Just <$>
(getP2PSshConnection r connpool >>= maybe fallback go) (getP2PSshConnection r connpool >>= maybe fallback go)
where where
go c = do go c = do
@ -333,7 +333,7 @@ runProto r connpool bad fallback proto = Just <$>
return res return res
-- Running the proto failed, either due to a protocol -- Running the proto failed, either due to a protocol
-- error or a network error. -- error or a network error.
Nothing -> return bad Nothing -> badproto
runProtoConn :: P2P.Proto a -> P2PSshConnection -> Annex (P2PSshConnection, Maybe a) runProtoConn :: P2P.Proto a -> P2PSshConnection -> Annex (P2PSshConnection, Maybe a)
runProtoConn _ P2P.ClosedConnection = return (P2P.ClosedConnection, Nothing) runProtoConn _ P2P.ClosedConnection = return (P2P.ClosedConnection, Nothing)

View file

@ -0,0 +1,11 @@
[[!comment format=mdwn
username="joey"
subject="""comment 1"""
date="2018-07-03T17:00:26Z"
content="""
Thanks for reporting, I've reproduced and fixed the bug.
Please file bugs in the bug tracker in the future,
that will prevent me missing them or responding as slowly as I did with
this one.
"""]]