2016-08-03 16:37:12 +00:00
|
|
|
{- git-annex transfer types
|
|
|
|
-
|
|
|
|
- Copyright 2012 Joey Hess <id@joeyh.name>
|
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2016-08-03 16:37:12 +00:00
|
|
|
-}
|
|
|
|
|
2017-11-29 19:49:05 +00:00
|
|
|
{-# LANGUAGE FlexibleInstances #-}
|
|
|
|
|
2016-08-03 16:37:12 +00:00
|
|
|
module Types.Transfer where
|
|
|
|
|
2017-10-17 21:54:38 +00:00
|
|
|
import Types
|
2017-11-29 19:49:05 +00:00
|
|
|
import Types.Remote (Verification(..))
|
2016-08-03 16:37:12 +00:00
|
|
|
import Utility.PID
|
2016-09-05 18:52:06 +00:00
|
|
|
import Utility.QuickCheck
|
2017-12-14 15:26:59 +00:00
|
|
|
import Utility.Url
|
2016-08-03 16:37:12 +00:00
|
|
|
|
|
|
|
import Data.Time.Clock.POSIX
|
|
|
|
import Control.Concurrent
|
2016-09-06 18:23:53 +00:00
|
|
|
import Control.Applicative
|
|
|
|
import Prelude
|
2016-08-03 16:37:12 +00:00
|
|
|
|
2017-02-24 22:51:57 +00:00
|
|
|
{- Enough information to uniquely identify a transfer. -}
|
2016-08-03 16:37:12 +00:00
|
|
|
data Transfer = Transfer
|
|
|
|
{ transferDirection :: Direction
|
|
|
|
, transferUUID :: UUID
|
|
|
|
, transferKey :: Key
|
|
|
|
}
|
|
|
|
deriving (Eq, Ord, Read, Show)
|
|
|
|
|
|
|
|
{- Information about a Transfer, stored in the transfer information file.
|
|
|
|
-
|
|
|
|
- Note that the associatedFile may not correspond to a file in the local
|
|
|
|
- git repository. It's some file, possibly relative to some directory,
|
|
|
|
- of some repository, that was acted on to initiate the transfer.
|
|
|
|
-}
|
2017-10-17 21:54:38 +00:00
|
|
|
data TransferInfo = TransferInfo
|
2016-08-03 16:37:12 +00:00
|
|
|
{ startedTime :: Maybe POSIXTime
|
|
|
|
, transferPid :: Maybe PID
|
|
|
|
, transferTid :: Maybe ThreadId
|
2017-10-17 21:54:38 +00:00
|
|
|
, transferRemote :: Maybe Remote
|
2016-08-03 16:37:12 +00:00
|
|
|
, bytesComplete :: Maybe Integer
|
2017-03-10 17:12:24 +00:00
|
|
|
, associatedFile :: AssociatedFile
|
2016-08-03 16:37:12 +00:00
|
|
|
, transferPaused :: Bool
|
|
|
|
}
|
|
|
|
deriving (Show, Eq, Ord)
|
|
|
|
|
2017-10-17 21:54:38 +00:00
|
|
|
stubTransferInfo :: TransferInfo
|
2017-03-10 17:12:24 +00:00
|
|
|
stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing (AssociatedFile Nothing) False
|
2016-08-03 16:37:12 +00:00
|
|
|
|
|
|
|
data Direction = Upload | Download
|
2017-02-24 22:51:57 +00:00
|
|
|
deriving (Eq, Ord, Show, Read)
|
|
|
|
|
|
|
|
formatDirection :: Direction -> String
|
|
|
|
formatDirection Upload = "upload"
|
|
|
|
formatDirection Download = "download"
|
|
|
|
|
|
|
|
parseDirection :: String -> Maybe Direction
|
|
|
|
parseDirection "upload" = Just Upload
|
|
|
|
parseDirection "download" = Just Download
|
|
|
|
parseDirection _ = Nothing
|
2016-08-03 16:37:12 +00:00
|
|
|
|
2017-10-17 21:54:38 +00:00
|
|
|
instance Arbitrary TransferInfo where
|
2016-09-05 18:52:06 +00:00
|
|
|
arbitrary = TransferInfo
|
|
|
|
<$> arbitrary
|
|
|
|
<*> arbitrary
|
|
|
|
<*> pure Nothing -- cannot generate a ThreadID
|
|
|
|
<*> pure Nothing -- remote not needed
|
|
|
|
<*> arbitrary
|
|
|
|
-- associated file cannot be empty (but can be Nothing)
|
2017-03-10 17:12:24 +00:00
|
|
|
<*> (AssociatedFile <$> arbitrary `suchThat` (/= Just ""))
|
2016-09-05 18:52:06 +00:00
|
|
|
<*> arbitrary
|
2017-11-29 19:49:05 +00:00
|
|
|
|
|
|
|
class Observable a where
|
|
|
|
observeBool :: a -> Bool
|
|
|
|
observeFailure :: a
|
|
|
|
|
|
|
|
instance Observable Bool where
|
|
|
|
observeBool = id
|
|
|
|
observeFailure = False
|
|
|
|
|
|
|
|
instance Observable (Bool, Verification) where
|
|
|
|
observeBool = fst
|
|
|
|
observeFailure = (False, UnVerified)
|
|
|
|
|
|
|
|
instance Observable (Either e Bool) where
|
|
|
|
observeBool (Left _) = False
|
|
|
|
observeBool (Right b) = b
|
|
|
|
observeFailure = Right False
|
|
|
|
|
2017-11-30 17:45:43 +00:00
|
|
|
instance Observable (Maybe a) where
|
|
|
|
observeBool (Just _) = True
|
|
|
|
observeBool Nothing = False
|
|
|
|
observeFailure = Nothing
|
2017-12-14 15:26:59 +00:00
|
|
|
|
|
|
|
class Transferrable t where
|
|
|
|
descTransfrerrable :: t -> Maybe String
|
|
|
|
|
|
|
|
instance Transferrable AssociatedFile where
|
|
|
|
descTransfrerrable (AssociatedFile af) = af
|
|
|
|
|
|
|
|
instance Transferrable URLString where
|
|
|
|
descTransfrerrable = Just
|