module GitHUD.Git.Parse.Base (
getGitRepoState
) where
import Control.Applicative ((<$>))
import Control.Concurrent (forkIO)
import Control.Concurrent.MVar (newEmptyMVar, takeMVar)
import GitHUD.Git.Types
import GitHUD.Git.Command
import GitHUD.Git.Parse.Status
import GitHUD.Git.Parse.Branch
import GitHUD.Git.Parse.Count
removeEndingNewline :: String -> String
removeEndingNewline str = concat . lines $ str
getGitRepoState :: IO GitRepoState
getGitRepoState = do
mvLocalBranch <- newEmptyMVar
mvGitStatus <- newEmptyMVar
mvRemoteName <- newEmptyMVar
mvStashCount <- newEmptyMVar
mvCommitShortSHA <- newEmptyMVar
forkIO $ gitCmdLocalBranchName mvLocalBranch
forkIO $ gitCmdPorcelainStatus mvGitStatus
forkIO $ gitCmdStashCount mvStashCount
forkIO $ gitCmdCommitShortSHA mvCommitShortSHA
localBranchName <- removeEndingNewline <$> (takeMVar mvLocalBranch)
forkIO $ gitCmdRemoteName localBranchName mvRemoteName
remoteName <- removeEndingNewline <$> takeMVar mvRemoteName
repoState <- gitParseStatus <$> takeMVar mvGitStatus
stashCountStr <- takeMVar mvStashCount
commitShortSHA <- removeEndingNewline <$> takeMVar mvCommitShortSHA
fillGitRemoteRepoState zeroGitRepoState {
gitLocalRepoChanges = repoState
, gitRemote = remoteName
, gitLocalBranch = localBranchName
, gitCommitShortSHA = commitShortSHA
, gitStashCount = (getCount stashCountStr)
}
fillGitRemoteRepoState :: GitRepoState
-> IO GitRepoState
fillGitRemoteRepoState repoState@( GitRepoState { gitRemote = ""} ) = return repoState
fillGitRemoteRepoState repoState = do
mvRemoteBranchName <- newEmptyMVar
mvCommitsToPull <- newEmptyMVar
mvCommitsToPush <- newEmptyMVar
mvMergeBranchCommitsToPull <- newEmptyMVar
mvMergeBranchCommitsToPush <- newEmptyMVar
forkIO $ gitCmdRemoteBranchName (gitLocalBranch repoState) mvRemoteBranchName
remoteBranch <- removeEndingNewline <$> (takeMVar mvRemoteBranchName)
let fullRemoteBranchName = buildFullyQualifiedRemoteBranchName (gitRemote repoState) remoteBranch
forkIO $ gitCmdRevToPush "origin/master" fullRemoteBranchName mvMergeBranchCommitsToPush
forkIO $ gitCmdRevToPull "origin/master" fullRemoteBranchName mvMergeBranchCommitsToPull
forkIO $ gitCmdRevToPush fullRemoteBranchName "HEAD" mvCommitsToPush
forkIO $ gitCmdRevToPull fullRemoteBranchName "HEAD" mvCommitsToPull
mergeBranchCommitsToMergeStr <- takeMVar mvMergeBranchCommitsToPush
let mergeBranchCommitsToMerge = getCount mergeBranchCommitsToMergeStr
mergeBranchCommitsToRMasterStr <- takeMVar mvMergeBranchCommitsToPull
let mergeBranchCommitsToRMaster = getCount mergeBranchCommitsToRMasterStr
commitsToPushStr <- takeMVar mvCommitsToPush
let commitsToPush = getCount commitsToPushStr
commitsToPullStr <- takeMVar mvCommitsToPull
let commitsToPull = getCount commitsToPullStr
return repoState {
gitRemoteTrackingBranch = remoteBranch
, gitCommitsToPull = commitsToPull
, gitCommitsToPush = commitsToPush
, gitMergeBranchCommitsToPull = mergeBranchCommitsToRMaster
, gitMergeBranchCommitsToPush = mergeBranchCommitsToMerge
}