content: 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"
  
  -- Requires git binary in PATH
  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
  