start of generalizing remotes

Goal is to support multiple different types of remotes, some of which
are not git repositories. To that end, added a Remote class, and moved
git remote specific code into Remote.GitRemote.

Remotes.hs is still present as some code has not been converted to use the
new Remote class yet.
This commit is contained in:
Joey Hess 2011-03-27 15:56:43 -04:00
parent 2821effce9
commit b40f253d6e
6 changed files with 405 additions and 39 deletions

46
RemoteClass.hs Normal file
View file

@ -0,0 +1,46 @@
{- git-annex remotes class
-
- Copyright 2011 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module RemoteClass where
import Control.Exception
import Annex
import UUID
import Key
data Remote = Remote {
-- each Remote has a unique uuid
uuid :: UUID,
-- each Remote has a human visible name
name :: String,
-- Remotes have a use cost; higher is more expensive
cost :: Int,
-- Transfers a key to the remote.
storeKey :: Key -> Annex Bool,
-- retrieves a key's contents to a file
retrieveKeyFile :: Key -> FilePath -> Annex Bool,
-- removes a key's contents
removeKey :: Key -> Annex Bool,
-- Checks if a key is present in the remote; if the remote
-- cannot be accessed returns a Left error.
hasKey :: Key -> Annex (Either IOException Bool),
-- Some remotes can check hasKey without an expensive network
-- operation.
hasKeyCheap :: Bool
}
instance Show Remote where
show remote = "Remote { uuid =\"" ++ uuid remote ++ "\" }"
-- two remotes are the same if they have the same uuid
instance Eq Remote where
a == b = uuid a == uuid b
-- order remotes by cost
instance Ord Remote where
compare a b = compare (cost a) (cost b)