buffer json output until done when in concurrent mode

This commit is contained in:
Joey Hess 2016-09-09 13:21:38 -04:00
parent 8ef494a833
commit 089c592977
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
4 changed files with 26 additions and 4 deletions

View file

@ -4,6 +4,8 @@ git-annex (6.20160908) UNRELEASED; urgency=medium
Was updating as frequently as changes were reported, up to hundreds of
times per second, which used unncessary bandwidth when running git-annex
over ssh etc.
* Make --json and --quiet work when used with -J.
Previously, -J override the other options.
-- Joey Hess <id@joeyh.name> Thu, 08 Sep 2016 12:48:55 -0400

View file

@ -122,7 +122,7 @@ showEndFail :: Annex ()
showEndFail = showEndResult False
showEndResult :: Bool -> Annex ()
showEndResult ok = outputMessage (JSON.end ok) $ endResult ok ++ "\n"
showEndResult ok = outputMessageFinal (JSON.end ok) $ endResult ok ++ "\n"
endResult :: Bool -> String
endResult True = "ok"

View file

@ -1,6 +1,6 @@
{- git-annex output messages, including concurrent output to display regions
-
- Copyright 2010-2015 Joey Hess <id@joeyh.name>
- Copyright 2010-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@ -16,12 +16,30 @@ withMessageState :: (MessageState -> Annex a) -> Annex a
withMessageState a = Annex.getState Annex.output >>= a
outputMessage :: IO () -> String -> Annex ()
outputMessage json msg = withMessageState $ \s -> case outputType s of
outputMessage = outputMessage' False
outputMessageFinal :: IO () -> String -> Annex ()
outputMessageFinal = outputMessage' True
outputMessage' :: Bool -> IO () -> String -> Annex ()
outputMessage' endmessage json msg = withMessageState $ \s -> case outputType s of
NormalOutput
| concurrentOutputEnabled s -> concurrentMessage s False msg q
| otherwise -> liftIO $ flushed $ putStr msg
JSONOutput
| concurrentOutputEnabled s ->
-- Buffer json fragments until end is reached.
if endmessage
then do
Annex.changeState $ \st ->
st { Annex.output = s { jsonBuffer = [] } }
liftIO $ flushed $ do
sequence_ $ reverse $ jsonBuffer s
json
else Annex.changeState $ \st ->
st { Annex.output = s { jsonBuffer = json : jsonBuffer s } }
| otherwise -> liftIO $ flushed json
QuietOutput -> q
JSONOutput -> liftIO $ flushed json
outputError :: String -> Annex ()
outputError msg = withMessageState $ \s ->

View file

@ -30,6 +30,7 @@ data MessageState = MessageState
, consoleRegion :: Maybe ConsoleRegion
, consoleRegionErrFlag :: Bool
#endif
, jsonBuffer :: [IO ()]
}
instance Default MessageState
@ -43,4 +44,5 @@ instance Default MessageState
, consoleRegion = Nothing
, consoleRegionErrFlag = False
#endif
, jsonBuffer = []
}