use TotalSize more extensively
This commit is contained in:
parent
263fd1d459
commit
94b323a8e8
6 changed files with 48 additions and 35 deletions
|
@ -134,7 +134,7 @@ complete v _ = add v (Just (HM.empty, True))
|
||||||
|
|
||||||
-- Show JSON formatted progress, including the current state of the JSON
|
-- Show JSON formatted progress, including the current state of the JSON
|
||||||
-- object for the action being performed.
|
-- object for the action being performed.
|
||||||
progress :: Maybe Object -> Maybe Integer -> BytesProcessed -> IO ()
|
progress :: Maybe Object -> Maybe TotalSize -> BytesProcessed -> IO ()
|
||||||
progress maction msize bytesprocessed =
|
progress maction msize bytesprocessed =
|
||||||
case j of
|
case j of
|
||||||
Object o -> emit $ case maction of
|
Object o -> emit $ case maction of
|
||||||
|
@ -144,7 +144,7 @@ progress maction msize bytesprocessed =
|
||||||
where
|
where
|
||||||
n = fromBytesProcessed bytesprocessed :: Integer
|
n = fromBytesProcessed bytesprocessed :: Integer
|
||||||
j = case msize of
|
j = case msize of
|
||||||
Just size -> object
|
Just (TotalSize size) -> object
|
||||||
[ "byte-progress" .= n
|
[ "byte-progress" .= n
|
||||||
, "percent-progress" .= showPercentage 2 (percentage size n)
|
, "percent-progress" .= showPercentage 2 (percentage size n)
|
||||||
, "total-size" .= size
|
, "total-size" .= size
|
||||||
|
|
|
@ -29,20 +29,20 @@ import Control.Monad.IO.Class (MonadIO)
|
||||||
{- Class of things from which a size can be gotten to display a progress
|
{- Class of things from which a size can be gotten to display a progress
|
||||||
- meter. -}
|
- meter. -}
|
||||||
class MeterSize t where
|
class MeterSize t where
|
||||||
getMeterSize :: t -> Annex (Maybe FileSize)
|
getMeterSize :: t -> Annex (Maybe TotalSize)
|
||||||
|
|
||||||
instance MeterSize t => MeterSize (Maybe t) where
|
instance MeterSize t => MeterSize (Maybe t) where
|
||||||
getMeterSize Nothing = pure Nothing
|
getMeterSize Nothing = pure Nothing
|
||||||
getMeterSize (Just t) = getMeterSize t
|
getMeterSize (Just t) = getMeterSize t
|
||||||
|
|
||||||
instance MeterSize FileSize where
|
instance MeterSize FileSize where
|
||||||
getMeterSize = pure . Just
|
getMeterSize = pure . Just . TotalSize
|
||||||
|
|
||||||
instance MeterSize Key where
|
instance MeterSize Key where
|
||||||
getMeterSize = pure . fromKey keySize
|
getMeterSize = pure . fmap TotalSize . fromKey keySize
|
||||||
|
|
||||||
instance MeterSize InodeCache where
|
instance MeterSize InodeCache where
|
||||||
getMeterSize = pure . Just . inodeCacheFileSize
|
getMeterSize = pure . Just . TotalSize . inodeCacheFileSize
|
||||||
|
|
||||||
instance MeterSize KeySource where
|
instance MeterSize KeySource where
|
||||||
getMeterSize = maybe (pure Nothing) getMeterSize . inodeCache
|
getMeterSize = maybe (pure Nothing) getMeterSize . inodeCache
|
||||||
|
@ -55,12 +55,13 @@ data KeySizer = KeySizer Key (Annex (Maybe RawFilePath))
|
||||||
|
|
||||||
instance MeterSize KeySizer where
|
instance MeterSize KeySizer where
|
||||||
getMeterSize (KeySizer k getsrcfile) = case fromKey keySize k of
|
getMeterSize (KeySizer k getsrcfile) = case fromKey keySize k of
|
||||||
Just sz -> return (Just sz)
|
Just sz -> return (Just (TotalSize sz))
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
srcfile <- getsrcfile
|
srcfile <- getsrcfile
|
||||||
case srcfile of
|
case srcfile of
|
||||||
Nothing -> return Nothing
|
Nothing -> return Nothing
|
||||||
Just f -> catchMaybeIO $ liftIO $ getFileSize f
|
Just f -> catchMaybeIO $ liftIO $
|
||||||
|
TotalSize <$> getFileSize f
|
||||||
|
|
||||||
{- Shows a progress meter while performing an action.
|
{- Shows a progress meter while performing an action.
|
||||||
- The action is passed the meter and a callback to use to update the meter.
|
- The action is passed the meter and a callback to use to update the meter.
|
||||||
|
@ -79,7 +80,7 @@ metered'
|
||||||
:: (Monad m, MonadIO m, MonadMask m)
|
:: (Monad m, MonadIO m, MonadMask m)
|
||||||
=> MessageState
|
=> MessageState
|
||||||
-> Maybe MeterUpdate
|
-> Maybe MeterUpdate
|
||||||
-> Maybe FileSize
|
-> Maybe TotalSize
|
||||||
-> m ()
|
-> m ()
|
||||||
-- ^ this should run showOutput
|
-- ^ this should run showOutput
|
||||||
-> (Meter -> MeterUpdate -> m a)
|
-> (Meter -> MeterUpdate -> m a)
|
||||||
|
|
|
@ -281,7 +281,7 @@ data LocalF c
|
||||||
-- present, runs the protocol action with False.
|
-- present, runs the protocol action with False.
|
||||||
| WaitRefChange (ChangedRefs -> c)
|
| WaitRefChange (ChangedRefs -> c)
|
||||||
-- ^ Waits for one or more git refs to change and returns them.a
|
-- ^ Waits for one or more git refs to change and returns them.a
|
||||||
| UpdateMeterTotalSize Meter Integer c
|
| UpdateMeterTotalSize Meter TotalSize c
|
||||||
-- ^ Updates the total size of a Meter, for cases where the size is
|
-- ^ Updates the total size of a Meter, for cases where the size is
|
||||||
-- not known until the data is being received.
|
-- not known until the data is being received.
|
||||||
| RunValidityCheck (Annex Validity) (Validity -> c)
|
| RunValidityCheck (Annex Validity) (Validity -> c)
|
||||||
|
@ -548,7 +548,7 @@ receiveContent mm p sizer storer mkmsg = do
|
||||||
Just (DATA len@(Len l)) -> do
|
Just (DATA len@(Len l)) -> do
|
||||||
local $ case mm of
|
local $ case mm of
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
Just m -> updateMeterTotalSize m (n+l)
|
Just m -> updateMeterTotalSize m (TotalSize (n+l))
|
||||||
ver <- net getProtocolVersion
|
ver <- net getProtocolVersion
|
||||||
let validitycheck = if ver >= ProtocolVersion 1
|
let validitycheck = if ver >= ProtocolVersion 1
|
||||||
then net receiveMessage >>= \case
|
then net receiveMessage >>= \case
|
||||||
|
|
|
@ -9,7 +9,6 @@ module Types.Messages where
|
||||||
|
|
||||||
import qualified Utility.Aeson as Aeson
|
import qualified Utility.Aeson as Aeson
|
||||||
import Utility.Metered
|
import Utility.Metered
|
||||||
import Utility.FileSize
|
|
||||||
|
|
||||||
import Control.Concurrent
|
import Control.Concurrent
|
||||||
import System.Console.Regions (ConsoleRegion)
|
import System.Console.Regions (ConsoleRegion)
|
||||||
|
@ -69,7 +68,7 @@ newMessageState = do
|
||||||
data SerializedOutput
|
data SerializedOutput
|
||||||
= OutputMessage S.ByteString
|
= OutputMessage S.ByteString
|
||||||
| OutputError String
|
| OutputError String
|
||||||
| StartProgressMeter (Maybe FileSize)
|
| StartProgressMeter (Maybe TotalSize)
|
||||||
| UpdateProgressMeter BytesProcessed
|
| UpdateProgressMeter BytesProcessed
|
||||||
| EndProgressMeter
|
| EndProgressMeter
|
||||||
| StartPrompt
|
| StartPrompt
|
||||||
|
|
|
@ -12,6 +12,7 @@ import Types.Messages
|
||||||
import Git.Types (RemoteName)
|
import Git.Types (RemoteName)
|
||||||
import qualified Utility.SimpleProtocol as Proto
|
import qualified Utility.SimpleProtocol as Proto
|
||||||
import Utility.Format
|
import Utility.Format
|
||||||
|
import Utility.Metered (TotalSize(..))
|
||||||
|
|
||||||
import Data.Char
|
import Data.Char
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ instance Proto.Sendable TransferResponse where
|
||||||
["om", Proto.serialize (encode_c (decodeBS m))]
|
["om", Proto.serialize (encode_c (decodeBS m))]
|
||||||
formatMessage (TransferOutput (OutputError e)) =
|
formatMessage (TransferOutput (OutputError e)) =
|
||||||
["oe", Proto.serialize (encode_c e)]
|
["oe", Proto.serialize (encode_c e)]
|
||||||
formatMessage (TransferOutput (StartProgressMeter (Just n))) =
|
formatMessage (TransferOutput (StartProgressMeter (Just (TotalSize n)))) =
|
||||||
["ops", Proto.serialize n]
|
["ops", Proto.serialize n]
|
||||||
formatMessage (TransferOutput (StartProgressMeter Nothing)) =
|
formatMessage (TransferOutput (StartProgressMeter Nothing)) =
|
||||||
["opsx"]
|
["opsx"]
|
||||||
|
@ -104,17 +105,28 @@ instance Proto.Sendable TransferResponse where
|
||||||
["f"]
|
["f"]
|
||||||
|
|
||||||
instance Proto.Receivable TransferResponse where
|
instance Proto.Receivable TransferResponse where
|
||||||
parseCommand "om" = Proto.parse1 (TransferOutput . OutputMessage . encodeBS . decode_c)
|
parseCommand "om" = Proto.parse1 $
|
||||||
parseCommand "oe" = Proto.parse1 (TransferOutput . OutputError . decode_c)
|
TransferOutput . OutputMessage . encodeBS . decode_c
|
||||||
parseCommand "ops" = Proto.parse1 (TransferOutput . StartProgressMeter . Just)
|
parseCommand "oe" = Proto.parse1 $
|
||||||
parseCommand "opsx" = Proto.parse0 (TransferOutput (StartProgressMeter Nothing))
|
TransferOutput . OutputError . decode_c
|
||||||
parseCommand "op" = Proto.parse1 (TransferOutput . UpdateProgressMeter)
|
parseCommand "ops" = Proto.parse1 $
|
||||||
parseCommand "ope" = Proto.parse0 (TransferOutput EndProgressMeter)
|
TransferOutput . StartProgressMeter . Just . TotalSize
|
||||||
parseCommand "oprs" = Proto.parse0 (TransferOutput StartPrompt)
|
parseCommand "opsx" = Proto.parse0 $
|
||||||
parseCommand "opre" = Proto.parse0 (TransferOutput EndPrompt)
|
TransferOutput (StartProgressMeter Nothing)
|
||||||
parseCommand "oj" = Proto.parse1 (TransferOutput . JSONObject . encodeBL . decode_c)
|
parseCommand "op" = Proto.parse1 $
|
||||||
parseCommand "t" = Proto.parse0 (TransferResult True)
|
TransferOutput . UpdateProgressMeter
|
||||||
parseCommand "f" = Proto.parse0 (TransferResult False)
|
parseCommand "ope" = Proto.parse0 $
|
||||||
|
TransferOutput EndProgressMeter
|
||||||
|
parseCommand "oprs" = Proto.parse0 $
|
||||||
|
TransferOutput StartPrompt
|
||||||
|
parseCommand "opre" = Proto.parse0 $
|
||||||
|
TransferOutput EndPrompt
|
||||||
|
parseCommand "oj" = Proto.parse1 $
|
||||||
|
TransferOutput . JSONObject . encodeBL . decode_c
|
||||||
|
parseCommand "t" = Proto.parse0 $
|
||||||
|
TransferResult True
|
||||||
|
parseCommand "f" = Proto.parse0 $
|
||||||
|
TransferResult False
|
||||||
parseCommand _ = Proto.parseFail
|
parseCommand _ = Proto.parseFail
|
||||||
|
|
||||||
instance Proto.Sendable TransferSerializedOutputResponse where
|
instance Proto.Sendable TransferSerializedOutputResponse where
|
||||||
|
|
|
@ -242,6 +242,7 @@ data OutputHandler = OutputHandler
|
||||||
type ProgressParser = String -> (Maybe BytesProcessed, Maybe TotalSize, String)
|
type ProgressParser = String -> (Maybe BytesProcessed, Maybe TotalSize, String)
|
||||||
|
|
||||||
newtype TotalSize = TotalSize Integer
|
newtype TotalSize = TotalSize Integer
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
{- Runs a command and runs a ProgressParser on its output, in order
|
{- Runs a command and runs a ProgressParser on its output, in order
|
||||||
- to update a meter.
|
- to update a meter.
|
||||||
|
@ -281,8 +282,8 @@ commandMeterExitCode' progressparser oh mmeter meterupdate cmd params mkprocess
|
||||||
let s = decodeBS b
|
let s = decodeBS b
|
||||||
let (mbytes, mtotalsize, buf') = progressparser (buf++s)
|
let (mbytes, mtotalsize, buf') = progressparser (buf++s)
|
||||||
sendtotalsize' <- case (sendtotalsize, mtotalsize) of
|
sendtotalsize' <- case (sendtotalsize, mtotalsize) of
|
||||||
(Just meter, Just (TotalSize n)) -> do
|
(Just meter, Just t) -> do
|
||||||
setMeterTotalSize meter n
|
setMeterTotalSize meter t
|
||||||
return Nothing
|
return Nothing
|
||||||
_ -> return sendtotalsize
|
_ -> return sendtotalsize
|
||||||
case mbytes of
|
case mbytes of
|
||||||
|
@ -368,7 +369,7 @@ rateLimitMeterUpdate delta (Meter totalsizev _ _ _) meterupdate = do
|
||||||
return $ mu lastupdate
|
return $ mu lastupdate
|
||||||
where
|
where
|
||||||
mu lastupdate n@(BytesProcessed i) = readMVar totalsizev >>= \case
|
mu lastupdate n@(BytesProcessed i) = readMVar totalsizev >>= \case
|
||||||
Just t | i >= t -> meterupdate n
|
Just (TotalSize t) | i >= t -> meterupdate n
|
||||||
_ -> do
|
_ -> do
|
||||||
now <- getPOSIXTime
|
now <- getPOSIXTime
|
||||||
prev <- takeMVar lastupdate
|
prev <- takeMVar lastupdate
|
||||||
|
@ -378,19 +379,19 @@ rateLimitMeterUpdate delta (Meter totalsizev _ _ _) meterupdate = do
|
||||||
meterupdate n
|
meterupdate n
|
||||||
else putMVar lastupdate prev
|
else putMVar lastupdate prev
|
||||||
|
|
||||||
data Meter = Meter (MVar (Maybe Integer)) (MVar MeterState) (MVar String) DisplayMeter
|
data Meter = Meter (MVar (Maybe TotalSize)) (MVar MeterState) (MVar String) DisplayMeter
|
||||||
|
|
||||||
data MeterState = MeterState
|
data MeterState = MeterState
|
||||||
{ meterBytesProcessed :: BytesProcessed
|
{ meterBytesProcessed :: BytesProcessed
|
||||||
, meterTimeStamp :: POSIXTime
|
, meterTimeStamp :: POSIXTime
|
||||||
} deriving (Show)
|
} deriving (Show)
|
||||||
|
|
||||||
type DisplayMeter = MVar String -> Maybe Integer -> MeterState -> MeterState -> IO ()
|
type DisplayMeter = MVar String -> Maybe TotalSize -> MeterState -> MeterState -> IO ()
|
||||||
|
|
||||||
type RenderMeter = Maybe Integer -> MeterState -> MeterState -> String
|
type RenderMeter = Maybe TotalSize -> MeterState -> MeterState -> String
|
||||||
|
|
||||||
-- | Make a meter. Pass the total size, if it's known.
|
-- | Make a meter. Pass the total size, if it's known.
|
||||||
mkMeter :: Maybe Integer -> DisplayMeter -> IO Meter
|
mkMeter :: Maybe TotalSize -> DisplayMeter -> IO Meter
|
||||||
mkMeter totalsize displaymeter = do
|
mkMeter totalsize displaymeter = do
|
||||||
ts <- getPOSIXTime
|
ts <- getPOSIXTime
|
||||||
Meter
|
Meter
|
||||||
|
@ -399,7 +400,7 @@ mkMeter totalsize displaymeter = do
|
||||||
<*> newMVar ""
|
<*> newMVar ""
|
||||||
<*> pure displaymeter
|
<*> pure displaymeter
|
||||||
|
|
||||||
setMeterTotalSize :: Meter -> Integer -> IO ()
|
setMeterTotalSize :: Meter -> TotalSize -> IO ()
|
||||||
setMeterTotalSize (Meter totalsizev _ _ _) = void . swapMVar totalsizev . Just
|
setMeterTotalSize (Meter totalsizev _ _ _) = void . swapMVar totalsizev . Just
|
||||||
|
|
||||||
-- | Updates the meter, displaying it if necessary.
|
-- | Updates the meter, displaying it if necessary.
|
||||||
|
@ -446,7 +447,7 @@ bandwidthMeter mtotalsize (MeterState (BytesProcessed old) before) (MeterState (
|
||||||
where
|
where
|
||||||
amount = roughSize' memoryUnits True 2 new
|
amount = roughSize' memoryUnits True 2 new
|
||||||
percentamount = case mtotalsize of
|
percentamount = case mtotalsize of
|
||||||
Just totalsize ->
|
Just (TotalSize totalsize) ->
|
||||||
let p = showPercentage 0 $
|
let p = showPercentage 0 $
|
||||||
percentage totalsize (min new totalsize)
|
percentage totalsize (min new totalsize)
|
||||||
in p ++ replicate (6 - length p) ' ' ++ amount
|
in p ++ replicate (6 - length p) ' ' ++ amount
|
||||||
|
@ -458,7 +459,7 @@ bandwidthMeter mtotalsize (MeterState (BytesProcessed old) before) (MeterState (
|
||||||
transferred = max 0 (new - old)
|
transferred = max 0 (new - old)
|
||||||
duration = max 0 (now - before)
|
duration = max 0 (now - before)
|
||||||
estimatedcompletion = case mtotalsize of
|
estimatedcompletion = case mtotalsize of
|
||||||
Just totalsize
|
Just (TotalSize totalsize)
|
||||||
| bytespersecond > 0 ->
|
| bytespersecond > 0 ->
|
||||||
Just $ fromDuration $ Duration $
|
Just $ fromDuration $ Duration $
|
||||||
(totalsize - new) `div` bytespersecond
|
(totalsize - new) `div` bytespersecond
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue