70 lines
2.2 KiB
Haskell
70 lines
2.2 KiB
Haskell
{- git-annex remote list utils
|
||
-
|
||
- Copyright 2011-2025 Joey Hess <id@joeyh.name>
|
||
-
|
||
- Licensed under the GNU AGPL version 3 or higher.
|
||
-}
|
||
|
||
module Remote.List.Util where
|
||
|
||
import Annex.Common
|
||
import qualified Annex
|
||
import qualified Git.Config
|
||
import Annex.UUID
|
||
import Types.Remote
|
||
import Config.DynamicConfig
|
||
|
||
import Data.Ord
|
||
|
||
{- Call when remotes have changed. Re-reads the git config, and
|
||
- invalidates the cache so the remoteList will be re-generated next time
|
||
- it's used. -}
|
||
remotesChanged :: Annex ()
|
||
remotesChanged = do
|
||
newg <- inRepo Git.Config.reRead
|
||
Annex.changeState $ \s -> s
|
||
{ Annex.remotes = []
|
||
, Annex.gitremotes = Nothing
|
||
, Annex.repo = newg
|
||
}
|
||
|
||
{- Whether to include remotes that have annex-ignore set. -}
|
||
newtype IncludeIgnored = IncludeIgnored Bool
|
||
|
||
keyPossibilities'
|
||
:: IncludeIgnored
|
||
-> Key
|
||
-> [UUID]
|
||
-- ^ uuids of remotes that are recorded to have the key
|
||
-> [Remote]
|
||
-- ^ all remotes
|
||
-> Annex [Remote]
|
||
keyPossibilities' ii _key remotelocations rs = do
|
||
u <- getUUID
|
||
let locations = filter (/= u) remotelocations
|
||
let speclocations = map uuid
|
||
$ filter (remoteAnnexSpeculatePresent . gitconfig) rs
|
||
-- there are unlikely to be many speclocations, so building a Set
|
||
-- is not worth the expense
|
||
let locations' = speclocations ++ filter (`notElem` speclocations) locations
|
||
fst <$> remoteLocations' ii locations' [] rs
|
||
|
||
remoteLocations' :: IncludeIgnored -> [UUID] -> [UUID] -> [Remote] -> Annex ([Remote], [UUID])
|
||
remoteLocations' (IncludeIgnored ii) locations trusted rs = do
|
||
let validtrustedlocations = nub locations `intersect` trusted
|
||
|
||
-- remotes that match uuids that have the key
|
||
allremotes <- if not ii
|
||
then filterM (not <$$> liftIO . getDynamicConfig . remoteAnnexIgnore . gitconfig) rs
|
||
else return rs
|
||
let validremotes = remotesWithUUID allremotes locations
|
||
|
||
return (sortBy (comparing cost) validremotes, validtrustedlocations)
|
||
|
||
{- 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
|