import System.Console.ANSI import System.Exit import HSH import Control.Applicative import Control.Monad import Data.Char import Data.Maybe color :: Color -> String color c = setSGRCode [SetColor Foreground Dull c] blue, magenta, green, noColor :: String blue = color Blue magenta = color Magenta green = color Green noColor = setSGRCode [] main :: IO () main = do ref <- runSL "git symbolic-ref HEAD 2> /dev/null" when (null ref) exitFailure gitstat <- fmap lines . runSL $ "git status 2>/dev/null" -|- egrep "(# Untracked|# Changes|# Changed but not updated:|# Your branch)" let f msg = listToMaybe . map (takeWhile isDigit . dropWhile (not . isDigit)) $ egrep msg gitstat ahead = f "# Your branch is ahead of " behind = f "# Your branch is behind " putStrLn . concat $ ["±" ,blue,":",magenta,drop (length "refs/heads/") ref ,green ,['!' | "# Changes to be committed:" `elem` gitstat] ,['?' | "# Untracked files:" `elem` gitstat || "# Changed but not updated:" `elem` gitstat] ,maybe "" ((blue++":"++green++"-")++) behind ,maybe "" ((blue++":"++green++"+")++) ahead ,noColor]