module Data.Git.Phoenix.CmdRun where

import Data.Git.Phoenix.App
import Data.Git.Phoenix.CmdArgs
import Data.Git.Phoenix.CommitSearch as CS
import Data.Git.Phoenix.HeadsDiscovery as HD
import Data.Git.Phoenix.Extraction
import Data.Git.Phoenix.Prelude
import Data.Git.Phoenix.Pretty
import Data.Git.Phoenix.Uber
import Data.Version (showVersion)
import Paths_git_phoenix

runCmd :: CmdArgs -> IO ()
runCmd :: CmdArgs -> IO ()
runCmd = \case
  BuildUberRepo { Tagged InDir String
inDir :: Tagged InDir String
inDir :: CmdArgs -> Tagged InDir String
inDir, Tagged OutDir String
outDir :: Tagged OutDir String
outDir :: CmdArgs -> Tagged OutDir String
outDir } -> do
    String -> IO ()
forall (m :: * -> *). MonadIO m => String -> m ()
createDirectory (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ Tagged OutDir String -> String
forall {k} (s :: k) b. Tagged s b -> b
untag Tagged OutDir String
outDir
    s <- Int -> IO QSem
forall (m :: * -> *). MonadIO m => Int -> m QSem
newQSem (Int -> IO QSem) -> IO Int -> IO QSem
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Int
getNumCapabilities
    runReaderT (recoverFrom inDir) (PhoenixUberConf outDir s)
  ExtractCommitTreeAsGitRepo { Tagged ShaPrefix String
rootCommit :: Tagged ShaPrefix String
rootCommit :: CmdArgs -> Tagged ShaPrefix String
rootCommit, Tagged InDir String
uberRepoDir :: Tagged InDir String
uberRepoDir :: CmdArgs -> Tagged InDir String
uberRepoDir, Tagged OutDir String
gitRepoOut :: Tagged OutDir String
gitRepoOut :: CmdArgs -> Tagged OutDir String
gitRepoOut } -> do
    s <- Int -> IO QSem
forall (m :: * -> *). MonadIO m => Int -> m QSem
newQSem (Int -> IO QSem) -> (Int -> Int) -> Int -> IO QSem
forall b c a. (b -> c) -> (a -> b) -> a -> c
. $(tw "numCapabilities/") (Int -> IO QSem) -> IO Int -> IO QSem
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Int
getNumCapabilities
    runReaderT
      (extractCommitChainAsRepo rootCommit)
      (PhoenixExtractConf gitRepoOut uberRepoDir s)
  SearchCommitBy SearchCommitBy
scb ->
    SearchCommitBy -> IO [CommitObject]
runCommitSearch SearchCommitBy
scb IO [CommitObject] -> ([CommitObject] -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Doc -> IO ()
forall (m :: * -> *) a. (MonadIO m, Pretty a) => a -> m ()
printDoc (Doc -> IO ())
-> ([CommitObject] -> Doc) -> [CommitObject] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [CommitObject] -> Doc
CS.commitObjectsToDoc
  HeadsDiscovery HeadsDiscovery
ctx ->
    HeadsDiscovery -> IO [(ShaBs, CommitObject)]
runHeadsDiscovery HeadsDiscovery
ctx IO [(ShaBs, CommitObject)]
-> ([(ShaBs, CommitObject)] -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Doc -> IO ()
forall (m :: * -> *) a. (MonadIO m, Pretty a) => a -> m ()
printDoc (Doc -> IO ())
-> ([(ShaBs, CommitObject)] -> Doc)
-> [(ShaBs, CommitObject)]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(ShaBs, CommitObject)] -> Doc
HD.commitObjectsToDoc
  CmdArgs
GitPhoenixVersion ->
    Doc -> IO ()
forall (m :: * -> *) a. (MonadIO m, Pretty a) => a -> m ()
printDoc (Doc -> IO ()) -> Doc -> IO ()
forall a b. (a -> b) -> a -> b
$ Doc
"Version" Doc -> Doc -> Doc
<+> String -> Doc
forall a. Pretty a => a -> Doc
doc (Version -> String
showVersion Version
version) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
linebreak