followup and display rsync exit status
This commit is contained in:
parent
007892739d
commit
69cefe8190
4 changed files with 88 additions and 9 deletions
|
@ -210,7 +210,14 @@ type ProgressParser = String -> (Maybe BytesProcessed, String)
|
|||
- to update a meter.
|
||||
-}
|
||||
commandMeter :: ProgressParser -> OutputHandler -> MeterUpdate -> FilePath -> [CommandParam] -> IO Bool
|
||||
commandMeter progressparser oh meterupdate cmd params =
|
||||
commandMeter progressparser oh meterupdate cmd params = do
|
||||
ret <- commandMeter' progressparser oh meterupdate cmd params
|
||||
return $ case ret of
|
||||
Just ExitSuccess -> True
|
||||
_ -> False
|
||||
|
||||
commandMeter' :: ProgressParser -> OutputHandler -> MeterUpdate -> FilePath -> [CommandParam] -> IO (Maybe ExitCode)
|
||||
commandMeter' progressparser oh meterupdate cmd params =
|
||||
outputFilter cmd params Nothing
|
||||
(feedprogress zeroBytesProcessed [])
|
||||
handlestderr
|
||||
|
@ -245,9 +252,13 @@ demeterCommand :: OutputHandler -> FilePath -> [CommandParam] -> IO Bool
|
|||
demeterCommand oh cmd params = demeterCommandEnv oh cmd params Nothing
|
||||
|
||||
demeterCommandEnv :: OutputHandler -> FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO Bool
|
||||
demeterCommandEnv oh cmd params environ = outputFilter cmd params environ
|
||||
(\outh -> avoidProgress True outh stdouthandler)
|
||||
(\errh -> avoidProgress True errh $ stderrHandler oh)
|
||||
demeterCommandEnv oh cmd params environ = do
|
||||
ret <- outputFilter cmd params environ
|
||||
(\outh -> avoidProgress True outh stdouthandler)
|
||||
(\errh -> avoidProgress True errh $ stderrHandler oh)
|
||||
return $ case ret of
|
||||
Just ExitSuccess -> True
|
||||
_ -> False
|
||||
where
|
||||
stdouthandler l =
|
||||
unless (quietMode oh) $
|
||||
|
@ -270,16 +281,15 @@ outputFilter
|
|||
-> Maybe [(String, String)]
|
||||
-> (Handle -> IO ())
|
||||
-> (Handle -> IO ())
|
||||
-> IO Bool
|
||||
outputFilter cmd params environ outfilter errfilter = catchBoolIO $ do
|
||||
-> IO (Maybe ExitCode)
|
||||
outputFilter cmd params environ outfilter errfilter = catchMaybeIO $ do
|
||||
(_, Just outh, Just errh, pid) <- createProcess p
|
||||
{ std_out = CreatePipe
|
||||
, std_err = CreatePipe
|
||||
}
|
||||
void $ async $ tryIO (outfilter outh) >> hClose outh
|
||||
void $ async $ tryIO (errfilter errh) >> hClose errh
|
||||
ret <- checkSuccessProcess pid
|
||||
return ret
|
||||
waitForProcess pid
|
||||
where
|
||||
p = (proc cmd (toCommand params))
|
||||
{ env = environ }
|
||||
|
|
|
@ -103,7 +103,16 @@ rsyncUrlIsPath s
|
|||
- The params must enable rsync's --progress mode for this to work.
|
||||
-}
|
||||
rsyncProgress :: OutputHandler -> MeterUpdate -> [CommandParam] -> IO Bool
|
||||
rsyncProgress oh meter = commandMeter parseRsyncProgress oh meter "rsync" . rsyncParamsFixup
|
||||
rsyncProgress oh meter ps =
|
||||
commandMeter' parseRsyncProgress oh meter "rsync" (rsyncParamsFixup ps) >>= \case
|
||||
Just ExitSuccess -> return True
|
||||
Just (ExitFailure exitcode) -> do
|
||||
when (exitcode /= 1) $
|
||||
hPutStrLn stderr $ "rsync exited " ++ show exitcode
|
||||
return False
|
||||
Nothing -> do
|
||||
hPutStrLn stderr $ "unable to run rsync"
|
||||
return False
|
||||
|
||||
{- Strategy: Look for chunks prefixed with \r (rsync writes a \r before
|
||||
- the first progress output, and each thereafter). The first number
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue