module Gitson.Util where
import Prelude.Compat
import Control.Monad (void, filterM)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control
import Control.Exception.Lifted (bracket)
import Data.List (isSuffixOf, isPrefixOf)
import Data.Maybe
import System.FilePath
import System.Directory
import System.Process
import System.IO
documentPath :: FilePath -> String -> FilePath
documentPath collection key = collection </> key <.> "json"
lockPath :: FilePath
lockPath = ".git" </> "gitson-lock"
filterFilenamesAsKeys :: [FilePath] -> [String]
filterFilenamesAsKeys = map dropExtension . filter (isSuffixOf ".json")
filterDirs :: [FilePath] -> IO [FilePath]
filterDirs = filterM doesDirectoryExist . filter (not . isPrefixOf ".")
insideDirectory :: (MonadIO i, MonadBaseControl IO i) => FilePath -> i a -> i a
insideDirectory path action = do
prevPath <- liftIO getCurrentDirectory
liftBaseOp (bracket (setCurrentDirectory path) (\_ -> setCurrentDirectory prevPath)) (\_ -> action)
lastCommitText :: IO String
lastCommitText = readProcess "git" ["log", "--max-count=1", "--pretty=format:%s"] []
shell :: (MonadIO i) => String -> [String] -> i ()
shell cmd args = liftIO $ void $ do
dnull <- openFile "/dev/null" ReadWriteMode
(_, _, _, pid) <- createProcess (proc cmd args){std_in = UseHandle dnull, std_out = UseHandle dnull, std_err = UseHandle dnull}
waitForProcess pid
intoFunctor :: Functor f => f a -> b -> f (a, b)
intoFunctor f x = fmap (flip (,) x) f
maybeReadIntString :: String -> Maybe (Int, String)
maybeReadIntString x = listToMaybe (reads x :: [(Int, String)])
nextKeyId :: [String] -> Int
nextKeyId = (+1) . maxOrZero . mapMaybe maybeReadInt
where maybeReadInt x = fst <$> maybeReadIntString x
maxOrZero [] = 0
maxOrZero xs = maximum xs