module Git ( config, root, ) where import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty) import Data.Text (Text, pack, unpack) import System.Process (readProcess) config :: Text -> IO Text config :: Text -> IO Text config Text key = do Maybe (NonEmpty String) output <- [String] -> Maybe (NonEmpty String) forall a. [a] -> Maybe (NonEmpty a) nonEmpty ([String] -> Maybe (NonEmpty String)) -> (String -> [String]) -> String -> Maybe (NonEmpty String) forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [String] lines (String -> Maybe (NonEmpty String)) -> IO String -> IO (Maybe (NonEmpty String)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> [String] -> String -> IO String readProcess String "git" [String "config", Text -> String unpack Text key] [] case Maybe (NonEmpty String) output of Just (String x :| [String] _) -> Text -> IO Text forall a. a -> IO a forall (f :: * -> *) a. Applicative f => a -> f a pure (Text -> IO Text) -> Text -> IO Text forall a b. (a -> b) -> a -> b $ String -> Text pack String x Maybe (NonEmpty String) Nothing -> String -> IO Text forall a. String -> IO a forall (m :: * -> *) a. MonadFail m => String -> m a fail (String -> IO Text) -> String -> IO Text forall a b. (a -> b) -> a -> b $ String "`git config " String -> String -> String forall a. Semigroup a => a -> a -> a <> Text -> String unpack Text key String -> String -> String forall a. Semigroup a => a -> a -> a <> String "` returned no output" root :: IO Text root :: IO Text root = do Maybe (NonEmpty String) output <- [String] -> Maybe (NonEmpty String) forall a. [a] -> Maybe (NonEmpty a) nonEmpty ([String] -> Maybe (NonEmpty String)) -> (String -> [String]) -> String -> Maybe (NonEmpty String) forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [String] lines (String -> Maybe (NonEmpty String)) -> IO String -> IO (Maybe (NonEmpty String)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> [String] -> String -> IO String readProcess String "git" [String "rev-parse", String "--show-toplevel"] String "" case Maybe (NonEmpty String) output of Just (String x :| [String] _) -> Text -> IO Text forall a. a -> IO a forall (f :: * -> *) a. Applicative f => a -> f a pure (Text -> IO Text) -> Text -> IO Text forall a b. (a -> b) -> a -> b $ String -> Text pack String x Maybe (NonEmpty String) Nothing -> String -> IO Text forall a. String -> IO a forall (m :: * -> *) a. MonadFail m => String -> m a fail String "`git rev-parse --show-toplevel` returned no output"