From 48cf675cff3dea1f295a76199429ba0be07a6d94 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 28 Sep 2017 15:44:45 -0400 Subject: 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. --- CHANGELOG | 4 ++++ Remote/External.hs | 12 ++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9b3c090ae..8ae15e404 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 Thu, 28 Sep 2017 12:01:39 -0400 diff --git a/Remote/External.hs b/Remote/External.hs index 63f58204a..4220c47d7 100644 --- a/Remote/External.hs +++ b/Remote/External.hs @@ -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 -- cgit v1.2.3