diff options
author | Joey Hess <joey@kitenet.net> | 2012-03-04 03:17:03 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-03-04 03:17:25 -0400 |
commit | 9856c24a5996f2d493c559cd9ea6b27b8127694a (patch) | |
tree | de50fea60e3e0eeb0cb8303cbf25bb2a0415034b /Messages.hs | |
parent | 8fc533643d0acd5cddbdfede1a438a84c57329ba (diff) |
Add progress bar display to the directory special remote.
So far I've only written progress bars for sending files, not yet
receiving.
No longer uses external cp at all. ByteString IO is fast enough.
Diffstat (limited to 'Messages.hs')
-rw-r--r-- | Messages.hs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/Messages.hs b/Messages.hs index 1b51cf23e..e8bbfed13 100644 --- a/Messages.hs +++ b/Messages.hs @@ -10,6 +10,8 @@ module Messages ( showNote, showAction, showProgress, + metered, + MeterUpdate, showSideAction, showOutput, showLongNote, @@ -29,9 +31,13 @@ module Messages ( ) where import Text.JSON +import Data.Progress.Meter +import Data.Progress.Tracker +import Data.Quantity import Common import Types +import Types.Key import qualified Annex import qualified Messages.JSON as JSON @@ -46,10 +52,29 @@ showNote s = handle (JSON.note s) $ showAction :: String -> Annex () showAction s = showNote $ s ++ "..." +{- Progress dots. -} showProgress :: Annex () showProgress = handle q $ flushed $ putStr "." +{- Shows a progress meter while performing a transfer of a key. + - The action is passed a callback to use to update the meter. -} +type MeterUpdate = Integer -> IO () +metered :: Key -> (MeterUpdate -> Annex a) -> Annex a +metered key a = Annex.getState Annex.output >>= go (keySize key) + where + go (Just size) Annex.NormalOutput = do + progress <- liftIO $ newProgress "" size + meter <- liftIO $ newMeter progress "B" 20 (renderNums binaryOpts 1) + showOutput + liftIO $ displayMeter stdout meter + r <- a $ \n -> liftIO $ do + incrP progress n + displayMeter stdout meter + liftIO $ clearMeter stdout meter + return r + go _ _ = a (const $ return ()) + showSideAction :: String -> Annex () showSideAction s = handle q $ putStrLn $ "(" ++ s ++ "...)" |