module Biegunka.Source.Darcs
(
darcs, darcs_
) where
import Control.Exception (SomeException (..), fromException, handle)
import System.Exit (ExitCode (..))
import Data.Text (pack)
import System.Directory (doesDirectoryExist)
import System.FilePath.Posix (takeDirectory)
import Darcs.Commands (DarcsCommand (commandCommand))
import Darcs.Commands.Get (get)
import Darcs.Commands.Pull (pull)
import qualified Darcs.Flags as F
import Darcs.Utils (withCurrentDirectory)
import Biegunka.Language
import Biegunka.Script (Script, sourced)
import Biegunka.Execute.Exception
darcs :: String -> FilePath -> Script Actions () -> Script Sources ()
darcs url path script = sourced "darcs" url path script (updateDarcs url)
darcs_ :: String -> FilePath -> Script Sources ()
darcs_ url path = darcs url path (return ())
updateDarcs :: String -> FilePath -> IO ()
updateDarcs url path = do
exists <- doesDirectoryExist path
handle check $ if exists
then
withCurrentDirectory path $ commandCommand pull [F.Quiet, F.All] [url]
else
withCurrentDirectory parent_path $ commandCommand get [F.Quiet] [url,path]
where
parent_path = takeDirectory path
check :: SomeException -> IO ()
check e =
case fromException e :: Maybe ExitCode of
Just ExitSuccess -> return ()
Just _ -> f
Nothing -> f
where
f = sourceFailure url path $ pack $ show e