module Life.Main.Pull
( lifePull
) where
import Path (Dir, File, Path, Rel)
import Life.Configuration (LifeConfiguration (..))
import Life.Github (Owner, cloneRepo, pullUpdateFromRepo, updateFromRepo)
import Life.Main.Init (lifeInitQuestion)
import Life.Message (abortCmd, choose, warningMessage)
import Life.Shell (LifeExistence (..), whatIsLife)
lifePull :: Owner -> Set (Path Rel File) -> Set (Path Rel Dir) -> IO ()
lifePull owner withoutFiles withoutDirs = whatIsLife >>= \case
OnlyRepo _ -> warningMessage ".life file not found" >> pullUpdate
OnlyLife _ -> warningMessage "dotfiles not found" >> clone >> update
NoLife -> initOrPull
Both _ _ -> pullUpdate
where
initOrPull :: IO ()
initOrPull = do
warningMessage ".life file and dotfiles repo not found"
action <- choose "Do you want to (F)etch existing repo, (I)nit from scratch or (A)bort operation?"
["f", "i", "a"]
case action of
"f" -> clone >> update
"i" -> lifeInitQuestion "pull" pass
"a" -> abortCmd "pull" "Cannot find .life and dotfiles"
_ -> error "Impossible choice"
life :: LifeConfiguration
life = LifeConfiguration withoutFiles withoutDirs
clone, update, pullUpdate :: IO ()
clone = cloneRepo owner
update = updateFromRepo life
pullUpdate = pullUpdateFromRepo life