    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 = takeWhile (/= '\n')
            <$> readProcess "git" ["symbolic-ref", "--short", "HEAD"]

    getCurrentBranchRef :: IO String
    getCurrentBranchRef = takeWhile (/= '\n')
            <$> readProcess "git" ["symbolic-ref", "HEAD"]

    getCurrentGitSha1 :: String -> IO String
    getCurrentGitSha1 branchref = takeWhile (/= '\n')
            <$> readProcess "git" ["show-ref", "--hash", branchref]

    hasOrigin :: IO Bool
    hasOrigin = hasRemote "origin"

    hasRemote :: String -> IO Bool
    hasRemote remotename = catchDefaultIO False $ do
            rs <- lines <$> readProcess "git" ["remote"]
            return $ remotename `elem` rs

    remoteUrl :: String -> IO (Maybe String)
    remoteUrl remotename = catchDefaultIO Nothing $ headMaybe . lines
            <$> readProcess "git" ["config", "remote." ++ remotename ++ ".url"]

    hasGitRepo :: IO Bool
    hasGitRepo = doesFileExist ".git/HEAD"

    type Version = [Int]

    gitVersion :: IO Version
    gitVersion = extract <$> readProcess "git" ["--version"]
      where
            extract s = case lines s of
                    [] -> []
                    (l:_) -> mapMaybe readish $ segment (== '.') $
                            unwords $ drop 2 $ words l