ssh exit status 255 is a connection problem
Previously, when the git config was unable to be read from a ssh remote, it would try to git fetch from it to determine if the remote was otherwise accessible. That was unnessary work, since exit status 255 indicates a connection problem. As well as avoiding the extra work of the fetch, this also improves things when a ssh remote cannot be connected to due to a problem with the git-annex ssh control socket. In that situation, ssh will also exit 255. Before, the git fetch was tried in that situation, and would succeed, since it does not use the git-annex ssh control socket. git-annex would conclude that git-annex-shell was not installed on the remote, which could be wrong. I suppose it also used to be possible for the user to need to enter a ssh password on each connection to the remote. If they entered the wrong password for the git-annex-shell call, but then the right password for the git fetch, it would also incorrectly set annex-ignore, and that situation is also now fixed.
This commit is contained in:
parent
e8e36a90c1
commit
a19a3076b5
5 changed files with 79 additions and 38 deletions
|
@ -22,7 +22,6 @@ import qualified Data.Map as M
|
|||
import qualified Data.ByteString as S
|
||||
import qualified Data.ByteString.Lazy as L
|
||||
import qualified System.FilePath.ByteString as P
|
||||
import Control.Exception
|
||||
import Data.Default
|
||||
|
||||
import Annex.Common
|
||||
|
@ -59,7 +58,6 @@ import Utility.Tmp
|
|||
import Logs.Remote
|
||||
import Utility.Gpg
|
||||
import Utility.SshHost
|
||||
import Utility.Tuple
|
||||
import Utility.Directory.Create
|
||||
import Messages.Progress
|
||||
import Types.ProposedAccepted
|
||||
|
@ -508,16 +506,25 @@ getGCryptId :: Bool -> Git.Repo -> RemoteGitConfig -> Annex (Maybe Git.GCrypt.GC
|
|||
getGCryptId fast r gc
|
||||
| Git.repoIsLocal r || Git.repoIsLocalUnknown r = extract <$>
|
||||
liftIO (catchMaybeIO $ Git.Config.read r)
|
||||
| not fast = extract . liftM fst3 <$> getM (eitherToMaybe <$>)
|
||||
[ Ssh.onRemote NoConsumeStdin r (\f p -> liftIO (Git.Config.fromPipe r f p Git.Config.ConfigList), return (Left $ giveup "configlist failed")) "configlist" [] []
|
||||
, getConfigViaRsync r gc
|
||||
| not fast = extract <$> getM id
|
||||
[ Ssh.onRemote NoConsumeStdin r (configpipe, return Nothing) "configlist" [] []
|
||||
, getconfig $ getConfigViaRsync r gc
|
||||
]
|
||||
| otherwise = return (Nothing, r)
|
||||
where
|
||||
extract Nothing = (Nothing, r)
|
||||
extract (Just r') = (fromConfigValue <$> Git.Config.getMaybe coreGCryptId r', r')
|
||||
|
||||
getConfigViaRsync :: Git.Repo -> RemoteGitConfig -> Annex (Either SomeException (Git.Repo, S.ByteString, String))
|
||||
configpipe f p = getconfig $ liftIO $
|
||||
Git.Config.fromPipe r f p Git.Config.ConfigList
|
||||
|
||||
getconfig a = do
|
||||
(r', _, exitcode, _) <- a
|
||||
if exitcode == ExitSuccess
|
||||
then return (Just r')
|
||||
else return Nothing
|
||||
|
||||
getConfigViaRsync :: Git.Repo -> RemoteGitConfig -> Annex (Git.Repo, S.ByteString, ExitCode, String)
|
||||
getConfigViaRsync r gc = do
|
||||
let (rsynctransport, rsyncurl, _) = rsyncTransport r gc
|
||||
opts <- rsynctransport
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue