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 Was updating as frequently as changes were reported, up to hundreds of
times per second, which used unncessary bandwidth when running git-annex times per second, which used unncessary bandwidth when running git-annex
over ssh etc. 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 -- Joey Hess <id@joeyh.name> Thu, 08 Sep 2016 12:48:55 -0400

View file

@ -122,7 +122,7 @@ showEndFail :: Annex ()
showEndFail = showEndResult False showEndFail = showEndResult False
showEndResult :: Bool -> Annex () 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 :: Bool -> String
endResult True = "ok" endResult True = "ok"

View file

@ -1,6 +1,6 @@
{- git-annex output messages, including concurrent output to display regions {- 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. - 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 withMessageState a = Annex.getState Annex.output >>= a
outputMessage :: IO () -> String -> Annex () 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 NormalOutput
| concurrentOutputEnabled s -> concurrentMessage s False msg q | concurrentOutputEnabled s -> concurrentMessage s False msg q
| otherwise -> liftIO $ flushed $ putStr msg | 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 QuietOutput -> q
JSONOutput -> liftIO $ flushed json
outputError :: String -> Annex () outputError :: String -> Annex ()
outputError msg = withMessageState $ \s -> outputError msg = withMessageState $ \s ->

View file

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