module Development.GitRev.Internal.Git
(
GitError (..),
gitBranchQ,
gitCommitCountQ,
gitCommitDateQ,
gitDescribeQ,
gitDiffQ,
gitDirtyQ,
gitDirtyTrackedQ,
gitHashQ,
gitShortHashQ,
gitTreeQ,
runGitQ,
runGitPostProcessQ,
IndexUsed (..),
)
where
import Control.Exception
( Exception (displayException),
)
import Data.Bifunctor (Bifunctor (first))
import Development.GitRev.Internal.Git.Common
( GitProcessArgs
( MkGitProcessArgs,
fromStringTotal,
gitRootArgs,
runProcessGit,
toOsPath,
toStringTotal
),
IndexUsed (IdxNotUsed, IdxUsed),
)
import Development.GitRev.Internal.Git.Common qualified as Common
import Development.GitRev.Internal.OsString qualified as OsStringI
import Language.Haskell.TH (Q)
import Language.Haskell.TH.Syntax (Lift)
import System.Process qualified as Process
gitBranchQ :: Q (Either GitError String)
gitBranchQ :: Q (Either GitError String)
gitBranchQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"rev-parse", String
"--abbrev-ref", String
"HEAD"] IndexUsed
IdxNotUsed
gitCommitCountQ :: Q (Either GitError String)
gitCommitCountQ :: Q (Either GitError String)
gitCommitCountQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"rev-list", String
"HEAD", String
"--count"] IndexUsed
IdxNotUsed
gitCommitDateQ :: Q (Either GitError String)
gitCommitDateQ :: Q (Either GitError String)
gitCommitDateQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"log", String
"HEAD", String
"-1", String
"--format=%cd"] IndexUsed
IdxNotUsed
gitDescribeQ :: Q (Either GitError String)
gitDescribeQ :: Q (Either GitError String)
gitDescribeQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"describe", String
"--long", String
"--always"] IndexUsed
IdxNotUsed
gitDiffQ :: Q (Either GitError String)
gitDiffQ :: Q (Either GitError String)
gitDiffQ = (String -> String)
-> [String] -> IndexUsed -> Q (Either GitError String)
runGitPostProcessQ String -> String
forall a. a -> a
id [String
"diff", String
"HEAD"] IndexUsed
IdxNotUsed
gitDirtyQ :: Q (Either GitError Bool)
gitDirtyQ :: Q (Either GitError Bool)
gitDirtyQ = (String -> Bool) -> Either GitError String -> Either GitError Bool
forall a b. (a -> b) -> Either GitError a -> Either GitError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Bool
forall a. (Eq a, Monoid a) => a -> Bool
Common.nonEmpty (Either GitError String -> Either GitError Bool)
-> Q (Either GitError String) -> Q (Either GitError Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"status", String
"--porcelain"] IndexUsed
IdxUsed
gitDirtyTrackedQ :: Q (Either GitError Bool)
gitDirtyTrackedQ :: Q (Either GitError Bool)
gitDirtyTrackedQ =
(String -> Bool) -> Either GitError String -> Either GitError Bool
forall a b. (a -> b) -> Either GitError a -> Either GitError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Bool
forall a. (Eq a, Monoid a) => a -> Bool
Common.nonEmpty
(Either GitError String -> Either GitError Bool)
-> Q (Either GitError String) -> Q (Either GitError Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"status", String
"--porcelain", String
"--untracked-files=no"] IndexUsed
IdxUsed
gitHashQ :: Q (Either GitError String)
gitHashQ :: Q (Either GitError String)
gitHashQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"rev-parse", String
"HEAD"] IndexUsed
IdxNotUsed
gitShortHashQ :: Q (Either GitError String)
gitShortHashQ :: Q (Either GitError String)
gitShortHashQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"rev-parse", String
"--short", String
"HEAD"] IndexUsed
IdxNotUsed
gitTreeQ :: Q (Either GitError String)
gitTreeQ :: Q (Either GitError String)
gitTreeQ = [String] -> IndexUsed -> Q (Either GitError String)
runGitQ [String
"show", String
"HEAD", String
"--format=%T", String
"--no-patch"] IndexUsed
IdxNotUsed
newtype GitError = MkGitError
{
GitError -> String
reason :: String
}
deriving stock
(
GitError -> GitError -> Bool
(GitError -> GitError -> Bool)
-> (GitError -> GitError -> Bool) -> Eq GitError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GitError -> GitError -> Bool
== :: GitError -> GitError -> Bool
$c/= :: GitError -> GitError -> Bool
/= :: GitError -> GitError -> Bool
Eq,
(forall (m :: * -> *). Quote m => GitError -> m Exp)
-> (forall (m :: * -> *). Quote m => GitError -> Code m GitError)
-> Lift GitError
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => GitError -> m Exp
forall (m :: * -> *). Quote m => GitError -> Code m GitError
$clift :: forall (m :: * -> *). Quote m => GitError -> m Exp
lift :: forall (m :: * -> *). Quote m => GitError -> m Exp
$cliftTyped :: forall (m :: * -> *). Quote m => GitError -> Code m GitError
liftTyped :: forall (m :: * -> *). Quote m => GitError -> Code m GitError
Lift,
Int -> GitError -> String -> String
[GitError] -> String -> String
GitError -> String
(Int -> GitError -> String -> String)
-> (GitError -> String)
-> ([GitError] -> String -> String)
-> Show GitError
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> GitError -> String -> String
showsPrec :: Int -> GitError -> String -> String
$cshow :: GitError -> String
show :: GitError -> String
$cshowList :: [GitError] -> String -> String
showList :: [GitError] -> String -> String
Show
)
instance Exception GitError where
displayException :: GitError -> String
displayException (MkGitError String
s) = String
"Git error: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s
runGitQ ::
[String] ->
IndexUsed ->
Q (Either GitError String)
runGitQ :: [String] -> IndexUsed -> Q (Either GitError String)
runGitQ = (String -> String)
-> [String] -> IndexUsed -> Q (Either GitError String)
runGitPostProcessQ String -> String
tillNewLineStr
runGitPostProcessQ ::
(String -> String) ->
[String] ->
IndexUsed ->
Q (Either GitError String)
runGitPostProcessQ :: (String -> String)
-> [String] -> IndexUsed -> Q (Either GitError String)
runGitPostProcessQ String -> String
postProcess [String]
args IndexUsed
idxUsed =
(GitError String -> GitError)
-> Either (GitError String) String -> Either GitError String
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first GitError String -> GitError
mapGitError
(Either (GitError String) String -> Either GitError String)
-> Q (Either (GitError String) String)
-> Q (Either GitError String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GitProcessArgs String
-> (String -> String)
-> [String]
-> IndexUsed
-> Q (Either (GitError String) String)
forall str.
GitProcessArgs str
-> (str -> str)
-> [str]
-> IndexUsed
-> Q (Either (GitError str) str)
Common.runGitPostprocess
GitProcessArgs String
gitProcessArgs
String -> String
postProcess
[String]
args
IndexUsed
idxUsed
mapGitError :: Common.GitError String -> GitError
mapGitError :: GitError String -> GitError
mapGitError (Common.MkGitError String
s) = String -> GitError
MkGitError String
s
gitProcessArgs :: GitProcessArgs String
gitProcessArgs :: GitProcessArgs String
gitProcessArgs =
MkGitProcessArgs
{ fromStringTotal :: String -> String
fromStringTotal = String -> String
forall a. a -> a
id,
gitRootArgs :: [String]
gitRootArgs = [String
"rev-parse", String
"--show-toplevel"],
runProcessGit :: [String] -> IO (ExitCode, String, String)
runProcessGit = \[String]
args -> String -> [String] -> String -> IO (ExitCode, String, String)
Process.readProcessWithExitCode String
"git" [String]
args String
"",
toOsPath :: String -> IO OsPath
toOsPath = String -> IO OsPath
forall (m :: * -> *). MonadThrow m => String -> m OsPath
OsStringI.encodeThrowM,
toStringTotal :: String -> String
toStringTotal = String -> String
forall a. a -> a
id
}
tillNewLineStr :: String -> String
tillNewLineStr :: String -> String
tillNewLineStr = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\n' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\r')