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 :: String -> IO (Maybe String)
getGitConfigValue String
key = do
	Maybe String
value <- forall (m :: * -> *) a. MonadCatch m => m a -> m (Maybe a)
catchMaybeIO forall a b. (a -> b) -> a -> b
$
		forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Eq a => a -> a -> Bool
/= Char
'\n')
			forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> IO String
readProcessString
"git" [String
"config", String
key]
	forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe String
value of
		Just String
v | Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
v) -> forall a. a -> Maybe a
Just String
v
		Maybe String
_ -> forall a. Maybe a
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 :: String -> IO Bool
getGitConfigBool String
key = do
	Maybe String
value <- forall (m :: * -> *) a. MonadCatch m => m a -> m (Maybe a)
catchMaybeIO forall a b. (a -> b) -> a -> b
$
		forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Eq a => a -> a -> Bool
/= Char
'\n')
			forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> IO String
readProcess String
"git" [String
"config", String
"--bool", String
key]
	forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe String
value of
		Just String
"true" -> Bool
True
		Maybe String
_ -> Bool
False

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

getRepoUrl :: IO (Maybe String)
getRepoUrl :: IO (Maybe String)
getRepoUrl = forall (m :: * -> *) a b.
Monad m =>
(a -> m (Maybe b)) -> [a] -> m (Maybe b)
getM String -> IO (Maybe String)
getGitConfigValue [String]
urls
  where
	urls :: [String]
urls = [String
"remote.deploy.url", String
"remote.origin.url"]