packages feed

make-package-1.1.0: src/Main.hs

{-# LANGUAGE OverloadedStrings #-}

-- | Main entry point.

module Main where

import           IO
import           Github
import           Options

import           Control.Lens ((^.), to)
import           Control.Monad (when)
import           Control.Monad.Trans (liftIO)
import           Data.Monoid
import qualified Data.Text as T
import qualified Data.Text.IO as T
import           Data.Text.Lens
import           Data.Time
import           Data.Time.Lens
import           System.Directory
import           System.Exit (exitFailure)
import           System.FilePath

-- import System.Process

-- | Main entry point.
main :: IO ()
main = withConfig $ do
  handleArgs
  packageName <- prompt "package" "Package Name" ""
  packageDir <- optionDefault "directory" packageName
  checkExists packageDir
  maybeClone packageName packageDir
  author <- confOrGitOrPrompt "defaults.author" "user.name"  "Author" ""
  email <- confOrGitOrPrompt "defaults.email" "user.email" "Author Email" ""
  desc <- prompt "description" "Description" ""
  licenseType <- getLicense
  exposed <- prompt "modules" "Exposed Module(s)" "Main"
  category <- prompt "categories" "Category(s)" ""
  now <- liftIO getCurrentTime
  liftIO $ do createDirectoryIfMissing False (T.unpack packageName)
              setCurrentDirectory (T.unpack packageName)
              createDirectoryIfMissing False ("src/")
  let substitutions = [("name"     ,packageName)
                      ,("desc"     ,desc)
                      ,("email"    ,email)
                      ,("author"   ,author)
                      ,("year"     ,now ^. years . to show . packed)
                      ,("category" ,category)
                      ,("exposed"  ,exposed)
                      ,("license"  ,licenseType)]
      copyTemplate = doCopyTemplate substitutions
  copyTemplate "package.cabal" (T.unpack (packageName <> ".cabal"))
  copyTemplate "dot-gitignore" ".gitignore"
  copyTemplate "Setup.hs" "Setup.hs"
  copyTemplate ("licenses"</> T.unpack licenseType <.> "license") "LICENSE"
  copyTemplate "README.md" "README.md"
  copyTemplate "Main.hs" "src/Main.hs"
  copyTemplate "Package.hs" (T.unpack ("src/" <> exposed <> ".hs"))
  run "cabal" ["configure"]
  unlessConf "git.enable" (== False) $ do
    run "git" ["init"]
    run "git" ["add", "."]
    whenConf "git.do-commit" (== True) $ do
      msg <- confLookupDefault "git.initial-commit-message" "initial commit"
      run "git" ["commit", "-m", msg]
  handleGithub packageName desc
  where
    checkExists pname = liftIO $
        do fileExists <- doesFileExist (T.unpack pname)
           dirExists <- doesDirectoryExist (T.unpack pname)
           when (fileExists || dirExists) $
               do putStrLn "A file or directory with this name already exists. Bailing out"
                  exitFailure

    doCopyTemplate substitutions infile outfile = liftIO $
        do template <- dataFile infile >>= T.readFile
           T.writeFile outfile (substitute template substitutions)
    substitute = foldl (\str (this,that) -> T.replace ("$" <> this) that str)