summaryrefslogtreecommitdiff
path: root/Remote.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-03-27 15:56:43 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-03-27 16:04:25 -0400
commitb40f253d6e126d699e9f298bf670fc5e875bfd86 (patch)
tree546a11e81490fcc6b098085ceebd315cf3f6a305 /Remote.hs
parent2821effce9ae95a2ef12a083ce0806fe058ac987 (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.hs66
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)