import qualified Data.Map as M
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
+import qualified Data.List.NonEmpty as NE
import Data.Char
import qualified System.FilePath.ByteString as P
import Control.Concurrent.Async
{- Returns a list of values. -}
getList :: ConfigKey -> Repo -> [ConfigValue]
-getList key repo = M.findWithDefault [] key (fullconfig repo)
+getList key repo = maybe [] NE.toList $ M.lookup key (fullconfig repo)
{- Returns a single git config setting, if set. -}
getMaybe :: ConfigKey -> Repo -> Maybe ConfigValue
val <- S.hGetContents h
let c = parse val st
debug (DebugSource "Git.Config") $ "git config read: " ++
- show (map (\(k, v) -> (show k, map show v)) (M.toList c))
+ show (map (\(k, v) -> (show k, map show (NE.toList v)))
+ (M.toList c))
storeParsed c repo
{- Stores a git config into a Repo, returning the new version of the Repo.
store :: S.ByteString -> ConfigStyle -> Repo -> IO Repo
store s st = storeParsed (parse s st)
-storeParsed :: M.Map ConfigKey [ConfigValue] -> Repo -> IO Repo
+storeParsed :: M.Map ConfigKey (NE.NonEmpty ConfigValue) -> Repo -> IO Repo
storeParsed c repo = updateLocation $ repo
- { config = (M.map Prelude.head c) `M.union` config repo
- , fullconfig = M.unionWith (++) c (fullconfig repo)
+ { config = (M.map NE.head c) `M.union` config repo
+ , fullconfig = M.unionWith (<>) c (fullconfig repo)
}
{- Stores a single config setting in a Repo, returning the new version of
store' :: ConfigKey -> ConfigValue -> Repo -> Repo
store' k v repo = repo
{ config = M.singleton k v `M.union` config repo
- , fullconfig = M.unionWith (++) (M.singleton k [v]) (fullconfig repo)
+ , fullconfig = M.unionWith (<>) (M.singleton k (NE.singleton v))
+ (fullconfig repo)
}
{- Updates the location of a repo, based on its configuration.
{- Parses git config --list or git config --null --list output into a
- config map. -}
-parse :: S.ByteString -> ConfigStyle -> M.Map ConfigKey [ConfigValue]
+parse :: S.ByteString -> ConfigStyle -> M.Map ConfigKey (NE.NonEmpty ConfigValue)
parse s st
| S.null s = M.empty
| otherwise = case st of
nl = fromIntegral (ord '\n')
eq = fromIntegral (ord '=')
- sep c = M.fromListWith (++)
- . map (\(k,v) -> (ConfigKey k, [mkval v]))
+ sep c = M.fromListWith (<>)
+ . map (\(k,v) -> (ConfigKey k, (NE.singleton (mkval v))) )
. map (S.break (== c))
mkval v
import qualified Data.Map as M
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
+import qualified Data.List.NonEmpty as NE
import Network.URI
#ifdef mingw32_HOST_OS
import Git.FilePath
(_, NoConfigValue) -> False
filterconfig f = filter f $
concatMap splitconfigs $ M.toList $ fullconfig repo
- splitconfigs (k, vs) = map (\v -> (k, v)) vs
+ splitconfigs (k, vs) = map (\v -> (k, v)) (NE.toList vs)
(prefix, suffix) = ("url." , ".insteadof")
-- git supports URIs that contain unescaped characters such as
-- spaces. So to test if it's a (git) URI, escape those.
import Data.Default
import qualified Data.Map as M
import qualified Data.ByteString as S
+import qualified Data.List.NonEmpty as NE
import System.Posix.Types
import Utility.SafeCommand
import Utility.FileSystemEncoding
{ location :: RepoLocation
, config :: M.Map ConfigKey ConfigValue
-- a given git config key can actually have multiple values
- , fullconfig :: M.Map ConfigKey [ConfigValue]
+ , fullconfig :: M.Map ConfigKey (NE.NonEmpty ConfigValue)
-- remoteName holds the name used for this repo in some other
-- repo's list of remotes, when this repo is such a remote
, remoteName :: Maybe RemoteName
import Control.Concurrent
import qualified Data.Map as M
import qualified Data.Set as S
+import qualified Data.List.NonEmpty as NE
import qualified Data.ByteString as B
import qualified Utility.RawFilePath as R
import Network.URI
Git.fullconfig r
in r
{ Git.remoteName = Just proxyname
- , Git.config = M.map Prelude.head c
+ , Git.config = M.map NE.head c
, Git.fullconfig = c
}
adjustclusternode clusters $
inheritconfigs $ Git.fullconfig r'
in r'
- { Git.config = M.map Prelude.head c
+ { Git.config = M.map NE.head c
, Git.fullconfig = c
}
- adduuid ck = M.insert ck
- [Git.ConfigValue $ fromUUID $ proxyRemoteUUID p]
+ adduuid ck = M.insert ck $ NE.singleton $
+ Git.ConfigValue $ fromUUID $ proxyRemoteUUID p
- addurl = M.insert (mkRemoteConfigKey renamedr (remoteGitConfigKey UrlField))
- [Git.ConfigValue $ encodeBS $ Git.repoLocation r]
+ addurl = M.insert (mkRemoteConfigKey renamedr (remoteGitConfigKey UrlField)) $
+ NE.singleton $ Git.ConfigValue $ encodeBS $ Git.repoLocation r
addproxiedby = case remoteAnnexUUID gc of
Just u -> addremoteannexfield ProxiedByField
- [Git.ConfigValue $ fromUUID u]
+ (Git.ConfigValue $ fromUUID u)
Nothing -> id
-- A node of a cluster that is being proxied along with
Just cs
| any (\c -> S.member (fromClusterUUID c) proxieduuids) (S.toList cs) ->
addremoteannexfield SyncField
- [Git.ConfigValue $ Git.Config.boolConfig' False]
+ (Git.ConfigValue $ Git.Config.boolConfig' False)
. addremoteannexfield CostField
- [Git.ConfigValue $ encodeBS $ show $ defaultRepoCost r + 0.1]
+ (Git.ConfigValue $ encodeBS $ show $ defaultRepoCost r + 0.1)
_ -> id
proxieduuids = S.map proxyRemoteUUID proxied
addremoteannexfield f = M.insert
- (mkRemoteConfigKey renamedr (remoteGitConfigKey f))
+ (mkRemoteConfigKey renamedr (remoteGitConfigKey f))
+ . NE.singleton
inheritconfigs c = foldl' inheritconfig c proxyInheritedFields