{-# LANGUAGE ScopedTypeVariables #-} module Hi.Git ( clone , config , lsFiles , expandUrl ) where import Control.Applicative import System.Exit import System.Process (readProcess, readProcessWithExitCode, callCommand) import Control.Exception expandUrl :: String -> String expandUrl ('g':'h':':':xs) = "git@github.com:" ++ xs ++ ".git" expandUrl xs = xs -- | Clone given repository to current directory clone :: String -> IO () clone repoUrl = handle (\(e :: IOException) -> print e >> exitFailure) $ do callCommand $ "git clone --no-checkout --quiet " ++ repoUrl ++ " " ++ "./" callCommand "git checkout HEAD --quiet" -- | Return file list by `git ls-files` lsFiles :: IO [String] lsFiles = lines <$> readProcess "git" ["ls-files"] [] -- | Return given config value config :: String -> IO (Maybe String) config name = do (exitCode,s,_) <- readProcessWithExitCode "git" ["config", name] [] return $ if exitCode == ExitSuccess then Just $ removeNewline s else Nothing removeNewline :: String -> String removeNewline = reverse . dropWhile (=='\n') . reverse