cost ordering

This commit is contained in:
Joey Hess 2010-10-13 14:40:56 -04:00
parent 794d44cf1d
commit 771a6b36e1
2 changed files with 41 additions and 5 deletions

View file

@ -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"

View file

@ -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"