diff options
author | Joey Hess <joey@kitenet.net> | 2011-03-27 15:56:43 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2011-03-27 16:04:25 -0400 |
commit | b40f253d6e126d699e9f298bf670fc5e875bfd86 (patch) | |
tree | 546a11e81490fcc6b098085ceebd315cf3f6a305 /Remote.hs | |
parent | 2821effce9ae95a2ef12a083ce0806fe058ac987 (diff) |
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.
Diffstat (limited to 'Remote.hs')
-rw-r--r-- | Remote.hs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/Remote.hs b/Remote.hs new file mode 100644 index 000000000..9eff5556c --- /dev/null +++ b/Remote.hs @@ -0,0 +1,66 @@ +{- git-annex remotes + - + - Copyright 2011 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote ( + generate, + keyPossibilities, + remotesWithUUID, + remotesWithoutUUID +) where + +import Control.Monad.State (liftIO) +import Data.List + +import RemoteClass +import qualified Remote.GitRemote +import Types +import UUID +import qualified Annex +import Trust +import LocationLog + +{- add generators for new Remotes here -} +generators :: [Annex [Remote]] +generators = [Remote.GitRemote.generate] + +{- generates a list of all available Remotes -} +generate :: Annex [Remote] +generate = do + lists <- sequence generators + return $ concat lists + +{- Filters a list of remotes to ones that have the listed uuids. -} +remotesWithUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithUUID rs us = filter (\r -> uuid r `elem` us) rs + +{- Filters a list of remotes to ones that do not have the listed uuids. -} +remotesWithoutUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithoutUUID rs us = filter (\r -> uuid r `notElem` us) rs + +{- Cost ordered lists of remotes that the LocationLog indicate may have a key. + - + - Also returns a list of UUIDs that are trusted to have the key + - (some may not have configured remotes). + -} +keyPossibilities :: Key -> Annex ([Remote], [UUID]) +keyPossibilities key = do + g <- Annex.gitRepo + u <- getUUID g + trusted <- trustGet Trusted + + -- get uuids of all remotes that are recorded to have the key + uuids <- liftIO $ keyLocations g key + let validuuids = filter (/= u) uuids + + -- note that validuuids is assumed to not have dups + let validtrusteduuids = intersect validuuids trusted + + -- remotes that match uuids that have the key + allremotes <- generate + let validremotes = remotesWithUUID allremotes validuuids + + return (sort validremotes, validtrusteduuids) |