external crash fixes

When the external special remote program crashed, a newline
could be output, which messed up the expected output for --batch mode.

Avoid checking EXPORTSUPPORTED for special remotes that are
not configured to use exports. The datalad special remote apparently is/was
buggy and crashed on EXPORTSUPPORTED. Anyway, there's no need to send
it when the configuration doesn't need it.

This commit was supported by the NSF-funded DataLad project.
This commit is contained in:
Joey Hess 2017-09-28 15:44:45 -04:00
parent e8c9a5c515
commit e9e5613e94
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 12 additions and 4 deletions

View file

@ -7,6 +7,10 @@ git-annex (6.20170926) UNRELEASED; urgency=medium
to avoid the user being surprised in cases where that behavior is not
desired or expected.
* sync: Added --cleanup, which removes local and remote synced/ branches.
* external: When the external special remote program crashed, a newline
could be output, which messed up the expected output for --batch mode.
* external: Avoid checking EXPORTSUPPORTED for special remotes that are
not configured to use exports.
-- Joey Hess <id@joeyh.name> Thu, 28 Sep 2017 12:01:39 -0400

View file

@ -20,6 +20,7 @@ import Git.Config (isTrue, boolConfig)
import Git.Env
import Remote.Helper.Special
import Remote.Helper.Export
import Annex.Export
import Remote.Helper.ReadOnly
import Remote.Helper.Messages
import Utility.Metered
@ -69,7 +70,9 @@ gen r u c gc
Annex.addCleanup (RemoteCleanup u) $ stopExternal external
cst <- getCost external r gc
avail <- getAvailability external r gc
exportsupported <- checkExportSupported' external
exportsupported <- if exportTree c
then checkExportSupported' external
else return False
let exportactions = if exportsupported
then return $ ExportActions
{ storeExport = storeExportM external
@ -165,8 +168,9 @@ checkExportSupported c gc = do
=<< newExternal externaltype NoUUID c gc
checkExportSupported' :: External -> Annex Bool
checkExportSupported' external = safely $
handleRequest external EXPORTSUPPORTED Nothing $ \resp -> case resp of
checkExportSupported' external = go `catchNonAsync` (const (return False))
where
go = handleRequest external EXPORTSUPPORTED Nothing $ \resp -> case resp of
EXPORTSUPPORTED_SUCCESS -> Just $ return True
EXPORTSUPPORTED_FAILURE -> Just $ return False
UNSUPPORTED_REQUEST -> Just $ return False
@ -313,7 +317,7 @@ safely a = go =<< tryNonAsync a
where
go (Right r) = return r
go (Left e) = do
warning $ show e
toplevelWarning False (show e)
return False
{- Sends a Request to the external remote, and waits for it to generate