module Stack2nix.External.VCS.Git
( Command(..), ExternalCmd(..), InternalCmd(..)
, git
) where
import Stack2nix.External.Util (failHard, runCmd, runCmdFrom)
import System.Exit (ExitCode (..))
data Command = OutsideRepo ExternalCmd
| InsideRepo FilePath InternalCmd
data ExternalCmd = Clone String FilePath
data InternalCmd = Checkout CommitRef
type CommitRef = String
exe :: String
exe = "git"
git :: Command -> IO (ExitCode, String, String)
git (OutsideRepo cmd) = runExternal cmd
git (InsideRepo dir cmd) = runInternal dir cmd
runExternal :: ExternalCmd -> IO (ExitCode, String, String)
runExternal (Clone uri dir) =
runCmd exe ["clone", "--recurse-submodules", uri, dir] >>= failHard
runInternal :: FilePath -> InternalCmd -> IO (ExitCode, String, String)
runInternal repoDir (Checkout ref) = do
checkoutCmd <- runCmdFrom repoDir exe ["checkout", ref]
_ <- failHard checkoutCmd
submoduleCmd <- runCmdFrom repoDir exe ["submodule", "update", "--init", "--recursive"]
failHard submoduleCmd