aboutsummaryrefslogtreecommitdiff
path: root/Remotes.hs
blob: ae709a3c23ae9608439c721edcce9faa6cd4f6ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{- git-annex remote repositories -}

module Remotes (
	remotesList,
	remotesWithKey
) where

import Types
import GitRepo
import LocationLog
import Data.String.Utils
import UUID
import List

{- Human visible list of remotes. -}
remotesList :: [GitRepo] -> String
remotesList remotes = join " " $ map gitRepoDescribe remotes 

{- Cost ordered list of remotes that the LocationLog indicate may have a key. -}
remotesWithKey :: State -> Key -> IO [GitRepo]
remotesWithKey state key = do
	uuids <- keyLocations (repo state) key
	return $ reposByUUID state (remotesByCost state) uuids

{- Cost Ordered list of remotes. -}
remotesByCost :: State -> [GitRepo]
remotesByCost state = reposByCost state $ gitConfigRemotes (repo state)

{- Orders a list of git repos by cost. -}
reposByCost :: State -> [GitRepo] -> [GitRepo]
reposByCost state l =
	fst $ unzip $ sortBy (\(r1, c1) (r2, c2) -> compare c1 c2) $ costpairs l
	where
		costpairs l = map (\r -> (r, repoCost state r)) l

{- Calculates cost for a repo.
 -
 - The default cost is 100 for local repositories, and 200 for remote
 - repositories; it can also be configured by remote.<name>.annex-cost
 -}
repoCost :: State -> GitRepo -> Int
repoCost state r = 
	if ((length $ config state r) > 0)
		then read $ config state r
		else if (gitRepoIsLocal r)
			then 100
			else 200
	where
		config state r = gitConfig (repo state) (configkey r) ""
		configkey r = "remote." ++ (gitRepoRemoteName r) ++ ".annex-cost"