Windows: Improve handling of shebang in external special remote program, searching for the program in the PATH.
findShellCommand needs a full path to a file in order to check it for a shebang on Windows. It was being run with only the base name of the external special remote program, which would only work when it was in the current directory. This is why users in https://github.com/DanielDent/git-annex-remote-rclone/pull/10 and elsewhere were complaining that the previous improvements to git-annex didn't make git-remote-rclone work on Windows. Also, reworked checkearlytermination, which while it worked, seemed to rely on a race condition. And, improved its error messages. This commit was sponsored by Shane-o on Patreon.
This commit is contained in:
parent
0d1a1838c5
commit
5358fb992a
5 changed files with 28 additions and 12 deletions
|
@ -375,7 +375,8 @@ startExternal external = do
|
|||
return st
|
||||
where
|
||||
start errrelayer g = liftIO $ do
|
||||
(cmd, ps) <- findShellCommand basecmd
|
||||
cmdpath <- searchPath basecmd
|
||||
(cmd, ps) <- maybe (pure (basecmd, [])) findShellCommand cmdpath
|
||||
let basep = (proc cmd (toCommand ps))
|
||||
{ std_in = CreatePipe
|
||||
, std_out = CreatePipe
|
||||
|
@ -383,9 +384,8 @@ startExternal external = do
|
|||
}
|
||||
p <- propgit g basep
|
||||
(Just hin, Just hout, Just herr, ph) <-
|
||||
createProcess p `catchIO` runerr
|
||||
createProcess p `catchIO` runerr cmdpath
|
||||
stderrelay <- async $ errrelayer herr
|
||||
checkearlytermination =<< getProcessExitCode ph
|
||||
cv <- newTVarIO $ externalDefaultConfig external
|
||||
pv <- newTVarIO Unprepared
|
||||
pid <- atomically $ do
|
||||
|
@ -409,15 +409,11 @@ startExternal external = do
|
|||
environ <- propGitEnv g
|
||||
return $ p { env = Just environ }
|
||||
|
||||
runerr _ = giveup ("Cannot run " ++ basecmd ++ " -- Make sure it's in your PATH and is executable.")
|
||||
|
||||
checkearlytermination Nothing = noop
|
||||
checkearlytermination (Just exitcode) = ifM (inPath basecmd)
|
||||
( giveup $ unwords [ "failed to run", basecmd, "(" ++ show exitcode ++ ")" ]
|
||||
, do
|
||||
path <- intercalate ":" <$> getSearchPath
|
||||
giveup $ basecmd ++ " is not installed in PATH (" ++ path ++ ")"
|
||||
)
|
||||
runerr (Just cmd) _ =
|
||||
giveup $ "Cannot run " ++ cmd ++ " -- Make sure it's executable and that its dependencies are installed."
|
||||
runerr Nothing _ = do
|
||||
path <- intercalate ":" <$> getSearchPath
|
||||
giveup $ "Cannot run " ++ basecmd ++ " -- It is not installed in PATH (" ++ path ++ ")"
|
||||
|
||||
stopExternal :: External -> Annex ()
|
||||
stopExternal external = liftIO $ do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue