summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-13 14:40:56 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-13 14:40:56 -0400
commit771a6b36e1527571b9a38baacbee6e864f44172a (patch)
tree7801037facceb6b602533be8efc104a6ff6091ec
parent794d44cf1daf073f05d1a27b2a02c47db37c443a (diff)
cost ordering
-rw-r--r--Annex.hs25
-rw-r--r--GitRepo.hs21
2 files changed, 41 insertions, 5 deletions
diff --git a/Annex.hs b/Annex.hs
index 012e90199..bd57514ea 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -9,12 +9,14 @@ module Annex (
annexWantFile,
annexDropFile,
annexPushRepo,
+ repoCost,
annexPullRepo
) where
import System.Posix.Files
import System.Directory
import Data.String.Utils
+import List
import GitRepo
import Utility
import Locations
@@ -165,3 +167,26 @@ logStatus state key status = do
{- Checks if a given key is currently present in the annexLocation -}
inAnnex :: State -> Backend -> Key -> IO Bool
inAnnex state backend key = doesFileExist $ annexLocation state backend key
+
+{- 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"
diff --git a/GitRepo.hs b/GitRepo.hs
index 489c9cf75..c4a55863d 100644
--- a/GitRepo.hs
+++ b/GitRepo.hs
@@ -10,13 +10,17 @@ module GitRepo (
gitRepoFromCwd,
gitRepoFromPath,
gitRepoFromUrl,
+ gitRepoIsLocal,
+ gitRepoIsRemote,
+ gitConfigRemotes,
gitWorkTree,
gitDir,
gitRelative,
gitConfig,
gitConfigRead,
gitRun,
- gitAttributes
+ gitAttributes,
+ gitRepoRemoteName
) where
import Directory
@@ -74,16 +78,23 @@ gitRepoFromUrl url query = do
where path url = uriPath $ fromJust $ parseURI url
{- User-visible description of a git repo by path or url -}
-describe repo = if (local repo) then top repo else url repo
+describe repo = if (gitRepoIsLocal repo) then top repo else url repo
+
+{- Returns the name of the remote that corresponds to the repo, if
+ - it is a remote. Otherwise, "" -}
+gitRepoRemoteName r =
+ if (isJust $ remoteName r)
+ then fromJust $ remoteName r
+ else ""
{- Some code needs to vary between remote and local repos, or bare and
- non-bare, these functions help with that. -}
-local repo = case (repo) of
+gitRepoIsLocal repo = case (repo) of
LocalGitRepo {} -> True
RemoteGitRepo {} -> False
-remote repo = not $ local repo
+gitRepoIsRemote repo = not $ gitRepoIsLocal repo
assertlocal repo action =
- if (local repo)
+ if (gitRepoIsLocal repo)
then action
else error $ "acting on remote git repo " ++ (describe repo) ++
" not supported"