module Propellor.Git where

import Utility.Process
import Utility.Exception
import Utility.Directory
import Utility.Misc
import Utility.PartialPrelude

import Data.Maybe
import Control.Applicative
import Prelude

getCurrentBranch :: IO String
getCurrentBranch :: IO String
getCurrentBranch = 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
"symbolic-ref", String
"--short", String
"HEAD"]

getCurrentBranchRef :: IO String
getCurrentBranchRef :: IO String
getCurrentBranchRef = 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
"symbolic-ref", String
"HEAD"]

getCurrentGitSha1 :: String -> IO String
getCurrentGitSha1 :: String -> IO String
getCurrentGitSha1 String
branchref = 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
"show-ref", String
"--hash", String
branchref]

hasOrigin :: IO Bool
hasOrigin :: IO Bool
hasOrigin = String -> IO Bool
hasRemote String
"origin"

hasRemote :: String -> IO Bool
hasRemote :: String -> IO Bool
hasRemote String
remotename = forall (m :: * -> *) a. MonadCatch m => a -> m a -> m a
catchDefaultIO Bool
False forall a b. (a -> b) -> a -> b
$ do
	[String]
rs <- String -> [String]
lines forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> IO String
readProcess String
"git" [String
"remote"]
	forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String
remotename forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
rs

remoteUrl :: String -> IO (Maybe String)
remoteUrl :: String -> IO (Maybe String)
remoteUrl String
remotename = forall (m :: * -> *) a. MonadCatch m => a -> m a -> m a
catchDefaultIO forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ forall a. [a] -> Maybe a
headMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
	forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> IO String
readProcess String
"git" [String
"config", String
"remote." forall a. [a] -> [a] -> [a]
++ String
remotename forall a. [a] -> [a] -> [a]
++ String
".url"]

hasGitRepo :: IO Bool
hasGitRepo :: IO Bool
hasGitRepo = String -> IO Bool
doesFileExist String
".git/HEAD"

type Version = [Int]

gitVersion :: IO Version
gitVersion :: IO Version
gitVersion = forall {a}. Read a => String -> [a]
extract forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String] -> IO String
readProcess String
"git" [String
"--version"]
  where
	extract :: String -> [a]
extract String
s = case String -> [String]
lines String
s of
		[] -> []
		(String
l:[String]
_) -> forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe forall a. Read a => String -> Maybe a
readish forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [[a]]
segment (forall a. Eq a => a -> a -> Bool
== Char
'.') forall a b. (a -> b) -> a -> b
$
			[String] -> String
unwords forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
drop Int
2 forall a b. (a -> b) -> a -> b
$ String -> [String]
words String
l