module Rivet.Rules where
import Prelude hiding ((*>), (++))
import Control.Monad (void, when)
import Data.List (isInfixOf)
import qualified Data.Text as T
import Development.Shake
import Rivet.Common
addCommands commands =
sequence_ (map (\(cName, cCom) -> (T.unpack cName) ~> void (exec (T.unpack cCom)))
commands)
addBinary cabal proj =
do let binary = "./.cabal-sandbox/bin/" ++ proj
binary *> \_ -> do files <- getDirectoryFiles "" ["src/Main.hs", "*.cabal"]
need files
cmd $ cabal ++ " install -j -fdevelopment --reorder-goals --force-reinstalls"
addDependencies cabal deps =
do let depDirs = map ((++ ".d/.rivetclone") . ("deps/" ++) . T.unpack . head .
T.splitOn (T.pack ":") . head . T.splitOn (T.pack "+")) deps
sequence_ (map (\d ->
do let (repo':rest) = T.splitOn (T.pack "+") d
let (repo:branchspec) = T.splitOn (T.pack ":") repo'
let depdir = ("deps/" ++ (T.unpack repo) ++ ".d")
depdir ++ "/.rivetclone" *> \clonedFile -> do
liftIO $ removeFiles depdir ["//*"]
() <- case branchspec of
(branch:_) -> cmd ("git clone --depth=1 -b " ++ (T.unpack branch) ++
" https://github.com/" ++ (T.unpack repo) ++ " " ++
depdir)
_ -> cmd ("git clone --depth=1 https://github.com/"
++ (T.unpack repo) ++ " " ++ depdir)
writeFile' clonedFile ""
let addSource s = do contents <- readFileOrBlank "deps/add-all"
let addstr = cabal ++ " sandbox add-source " ++ s
if addstr `isInfixOf` contents
then return ()
else liftIO $ appendFile "deps/add-all" (addstr ++ "\n")
let remstr = cabal ++ " sandbox delete-source " ++ s
if remstr `isInfixOf` contents
then return ()
else liftIO $ appendFile "deps/delete-all" (remstr ++ "\n")
hasSandbox <- doesFileExist "cabal.sandbox.config"
if hasSandbox
then cmd addstr :: Action ()
else return ()
hasHalcyon <- doesDirectoryExist ".halcyon"
when hasHalcyon $
do contents <- readFileOrBlank ".halcyon/sandbox-sources"
if s `isInfixOf` contents
then return ()
else liftIO $ appendFile ".halcyon/sandbox-sources" (s ++ "\n")
case rest of
(subdirs:_) -> mapM_ (\subdir -> addSource (depdir ++ "/" ++ (T.unpack subdir)))
(T.splitOn (T.pack ",") subdirs)
_ -> addSource depdir)
deps)
"deps" ~> need depDirs
where readFileOrBlank nm = do e <- doesFileExist nm
if e
then liftIO $ readFile nm
else return ""