module Stack2nix.External.VCS.Git
  ( Command(..), ExternalCmd(..), InternalCmd(..)
  , git
  ) where

import           Stack2nix.External.Util (failHard, runCmd, runCmdFrom)

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 ()
git (OutsideRepo cmd)    = runExternal cmd
git (InsideRepo dir cmd) = runInternal dir cmd

runExternal :: ExternalCmd -> IO ()
runExternal (Clone uri dir) = do
   runCmd exe ["clone", uri, dir] >>= failHard

runInternal :: FilePath -> InternalCmd -> IO ()
runInternal repoDir (Checkout ref) = do
   runCmdFrom repoDir exe ["checkout", ref] >>= failHard