diff options
Diffstat (limited to 'Types/Remote.hs')
-rw-r--r-- | Types/Remote.hs | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/Types/Remote.hs b/Types/Remote.hs index 6e78bf238..169701ecc 100644 --- a/Types/Remote.hs +++ b/Types/Remote.hs @@ -19,6 +19,7 @@ module Types.Remote , Verification(..) , unVerified , ExportLocation(..) + , ExportActions(..) ) where @@ -63,91 +64,75 @@ instance Eq (RemoteTypeA a) where x == y = typename x == typename y {- An individual remote. -} -data RemoteA a = Remote { +data RemoteA a = Remote -- each Remote has a unique uuid - uuid :: UUID, + { uuid :: UUID -- each Remote has a human visible name - name :: RemoteName, + , name :: RemoteName -- Remotes have a use cost; higher is more expensive - cost :: Cost, + , cost :: Cost -- Transfers a key's contents from disk to the remote. -- The key should not appear to be present on the remote until -- all of its contents have been transferred. - storeKey :: Key -> AssociatedFile -> MeterUpdate -> a Bool, + , storeKey :: Key -> AssociatedFile -> MeterUpdate -> a Bool -- Retrieves a key's contents to a file. -- (The MeterUpdate does not need to be used if it writes -- sequentially to the file.) - retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a (Bool, Verification), + , retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a (Bool, Verification) -- Retrieves a key's contents to a tmp file, if it can be done cheaply. -- It's ok to create a symlink or hardlink. - retrieveKeyFileCheap :: Key -> AssociatedFile -> FilePath -> a Bool, + , retrieveKeyFileCheap :: Key -> AssociatedFile -> FilePath -> a Bool -- Removes a key's contents (succeeds if the contents are not present) - removeKey :: Key -> a Bool, + , removeKey :: Key -> a Bool -- Uses locking to prevent removal of a key's contents, -- thus producing a VerifiedCopy, which is passed to the callback. -- If unable to lock, does not run the callback, and throws an -- error. -- This is optional; remotes do not have to support locking. - lockContent :: forall r. Maybe (Key -> (VerifiedCopy -> a r) -> a r), + , lockContent :: forall r. Maybe (Key -> (VerifiedCopy -> a r) -> a r) -- Checks if a key is present in the remote. -- Throws an exception if the remote cannot be accessed. - checkPresent :: Key -> a Bool, + , checkPresent :: Key -> a Bool -- Some remotes can checkPresent without an expensive network -- operation. - checkPresentCheap :: Bool, - - -- Exports content to an ExportLocation. - -- The exported file should not appear to be present on the remote - -- until all of its contents have been transferred. - storeExport :: Maybe (FilePath -> Key -> ExportLocation -> MeterUpdate -> a Bool), - -- Retrieves exported content to a file. - -- (The MeterUpdate does not need to be used if it writes - -- sequentially to the file.) - retrieveExport :: Maybe (Key -> ExportLocation -> FilePath -> MeterUpdate -> a (Bool, Verification)), - -- Removes an exported file (succeeds if the contents are not present) - removeExport :: Maybe (Key -> ExportLocation -> a Bool), - -- Checks if anything is exported to the remote at the specified - -- ExportLocation. - -- Throws an exception if the remote cannot be accessed. - checkPresentExport :: Maybe (Key -> ExportLocation -> a Bool), - -- Renames an already exported file. - renameExport :: Maybe (Key -> ExportLocation -> ExportLocation -> a Bool), - + , checkPresentCheap :: Bool + -- Some remotes support exports of trees. + , exportActions :: ExportActions a -- Some remotes can provide additional details for whereis. - whereisKey :: Maybe (Key -> a [String]), + , whereisKey :: Maybe (Key -> a [String]) -- Some remotes can run a fsck operation on the remote, -- without transferring all the data to the local repo -- The parameters are passed to the fsck command on the remote. - remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)), + , remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)) -- Runs an action to repair the remote's git repository. - repairRepo :: Maybe (a Bool -> a (IO Bool)), + , repairRepo :: Maybe (a Bool -> a (IO Bool)) -- a Remote has a persistent configuration store - config :: RemoteConfig, + , config :: RemoteConfig -- git repo for the Remote - repo :: Git.Repo, + , repo :: Git.Repo -- a Remote's configuration from git - gitconfig :: RemoteGitConfig, + , gitconfig :: RemoteGitConfig -- a Remote can be assocated with a specific local filesystem path - localpath :: Maybe FilePath, + , localpath :: Maybe FilePath -- a Remote can be known to be readonly - readonly :: Bool, + , readonly :: Bool -- a Remote can be globally available. (Ie, "in the cloud".) - availability :: Availability, + , availability :: Availability -- the type of the remote - remotetype :: RemoteTypeA a, + , remotetype :: RemoteTypeA a -- For testing, makes a version of this remote that is not -- available for use. All its actions should fail. - mkUnavailable :: a (Maybe (RemoteA a)), + , mkUnavailable :: a (Maybe (RemoteA a)) -- Information about the remote, for git annex info to display. - getInfo :: a [(String, String)], + , getInfo :: a [(String, String)] -- Some remotes can download from an url (or uri). - claimUrl :: Maybe (URLString -> a Bool), + , claimUrl :: Maybe (URLString -> a Bool) -- Checks that the url is accessible, and gets information about -- its contents, without downloading the full content. -- Throws an exception if the url is inaccessible. - checkUrl :: Maybe (URLString -> a UrlContents) -} + , checkUrl :: Maybe (URLString -> a UrlContents) + } instance Show (RemoteA a) where show remote = "Remote { name =\"" ++ name remote ++ "\" }" @@ -175,3 +160,23 @@ unVerified a = do -- The FilePath will be relative, and may contain unix-style path -- separators. newtype ExportLocation = ExportLocation FilePath + +data ExportActions a = ExportActions + { exportSupported :: a Bool + -- Exports content to an ExportLocation. + -- The exported file should not appear to be present on the remote + -- until all of its contents have been transferred. + , storeExport :: FilePath -> Key -> ExportLocation -> MeterUpdate -> a Bool + -- Retrieves exported content to a file. + -- (The MeterUpdate does not need to be used if it writes + -- sequentially to the file.) + , retrieveExport :: Key -> ExportLocation -> FilePath -> MeterUpdate -> a (Bool, Verification) + -- Removes an exported file (succeeds if the contents are not present) + , removeExport :: Key -> ExportLocation -> a Bool + -- Checks if anything is exported to the remote at the specified + -- ExportLocation. + -- Throws an exception if the remote cannot be accessed. + , checkPresentExport :: Key -> ExportLocation -> a Bool + -- Renames an already exported file. + , renameExport :: Key -> ExportLocation -> ExportLocation -> a Bool + } |