    module Propellor.Git.Config where

    import Propellor.Git
    import Utility.Process
    import Utility.Exception
    import Utility.SafeCommand
    import Utility.Monad

    import Control.Monad
    import Control.Applicative
    import Prelude

    getGitConfigValue :: String -> IO (Maybe String)
    getGitConfigValue key = do
            value <- catchMaybeIO $
                    takeWhile (/= '\n')
                            <$> readProcess"git" ["config", key]
            return $ case value of
                    Just v | not (null v) -> Just v
                    _ -> Nothing

    -- `git config --bool propellor.blah` outputs "false" if propellor.blah is unset
    -- i.e. the git convention is that the default value of any git-config setting
    -- is "false".  So we don't need a Maybe Bool here.
    getGitConfigBool :: String -> IO Bool
    getGitConfigBool key = do
            value <- catchMaybeIO $
                    takeWhile (/= '\n')
                            <$> readProcess "git" ["config", "--bool", key]
            return $ case value of
                    Just "true" -> True
                    _ -> False

    setRepoUrl :: String -> IO ()
    setRepoUrl "" = return ()
    setRepoUrl url = do
            subcmd <- ifM hasOrigin (pure "set-url", pure "add")
            void $ boolSystem "git" [Param "remote", Param subcmd, Param "origin", Param url]
            -- same as --set-upstream-to, except origin branch
            -- may not have been pulled yet
            branch <- getCurrentBranch
            let branchval s = "branch." ++ branch ++ "." ++ s
            void $ boolSystem "git" [Param "config", Param (branchval "remote"), Param "origin"]
            void $ boolSystem "git" [Param "config", Param (branchval "merge"), Param $ "refs/heads/"++branch]

    getRepoUrl :: IO (Maybe String)
    getRepoUrl = getM getGitConfigValue urls
      where
            urls = ["remote.deploy.url", "remote.origin.url"]