packages feed

hsinstall-2.6: src/app/hsinstall.hs

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad ( when )
import qualified System.Directory as Dir
import System.Exit ( exitSuccess )
import System.FilePath ( (</>) )
import System.Process ( callProcess )
import Text.Printf ( printf )

import HSInstall.AppImage ( mkAppImage, prepAppImageFiles )
import HSInstall.Common ( dumpStockIcon, tmplDir )
import HSInstall.DeploymentInfo
  ( DeploymentInfo (binDir, docDir, prefixDir)
  , constructDeploymentInfo
  )
import HSInstall.Except ( withExceptionHandling )
import HSInstall.Opts
  ( BuildMode (AppImageExe, Project), Options (..)
  , parseOpts
  )
import HSInstall.System.Directory ( copyTree )


main :: IO ()
main = withExceptionHandling $ do
  opts <- parseOpts

  when (optDumpIcon opts) $ dumpStockIcon Nothing >> exitSuccess

  di <- constructDeploymentInfo opts

  when (optClean opts) $ callProcess "stack" ["clean"]
  deployApplication (optBuildMode opts) di
  case optBuildMode opts of
    AppImageExe exe -> prepAppImageFiles exe >>= mkAppImage exe di
    Project         -> return ()


modeToStackArg :: BuildMode -> String
modeToStackArg (AppImageExe exe) = ':' : exe
modeToStackArg Project           = ""


deployApplication :: BuildMode -> DeploymentInfo -> IO ()
deployApplication mode di = do
  -- Copy the binaries
  Dir.createDirectoryIfMissing True $ binDir di
  callProcess "stack"
    [ "install", modeToStackArg mode 
    , "--local-bin-path=" ++ binDir di
    ]

  -- Copy the license
  let licenseFile = "LICENSE"
  licenseFileExists <- Dir.doesFileExist licenseFile
  when licenseFileExists $ do
    printf "\nCopying %s\n" licenseFile
    Dir.createDirectoryIfMissing True $ docDir di
    Dir.copyFile licenseFile (docDir di </> licenseFile)

  -- Copy the static template directory
  tmplExists <- Dir.doesDirectoryExist tmplDir
  when tmplExists $ do
    printf "\nCopying distribution files from template dir (%s)\n" tmplDir
    copyTree False tmplDir (prefixDir di)