module Gitson.Util (module Gitson.Util) where
import Data.Char (isSpace)
import Control.Monad (void)
import Control.Applicative
import System.FilePath
import System.Directory
import System.Process
import System.IO
entryPath :: FilePath -> FilePath -> FilePath
entryPath collection key = collection </> key <.> "json"
lockPath :: FilePath
lockPath = ".git" </> "gitson-lock"
filterFilenamesAsKeys :: [String] -> [String]
filterFilenamesAsKeys = map dropExtension . filter (`notElem` [".", ".."])
insideDirectory :: FilePath -> IO a -> IO a
insideDirectory path action = do
prevPath <- getCurrentDirectory
setCurrentDirectory path
result <- action
setCurrentDirectory prevPath
return result
stripWhitespaceRight :: FilePath -> FilePath
stripWhitespaceRight = reverse . dropWhile isSpace . reverse
findRepoRoot :: FilePath -> IO FilePath
findRepoRoot path = stripWhitespaceRight <$> (insideDirectory path $ readProcess "git" ["rev-parse", "--show-toplevel"] [])
lastCommitText :: IO String
lastCommitText = readProcess "git" ["log", "--max-count=1", "--pretty=format:%s"] []
devNull :: IO Handle
devNull = openFile "/dev/null" ReadWriteMode
shell :: String -> [String] -> IO ()
shell cmd args = void $ do
null <- devNull
(_, _, _, pid) <- createProcess (proc cmd args){std_in = UseHandle null, std_out = UseHandle null, std_err = UseHandle null}
waitForProcess pid