packages feed

dockercook-0.5.0.0: src/prog/Main.hs

module Main where

import Paths_dockercook (version)
import Data.Version (showVersion, versionBranch)

import Cook.ArgParse
import Cook.Build
import Cook.Sync
import Cook.Types
import Cook.Uploader
import Cook.Util
import Cook.State.Manager

import Data.List (foldl')
import Data.Aeson.Encode.Pretty (encodePretty)
import Control.Monad
import Options.Applicative
import System.Exit
import System.Log
import System.Directory
import System.FilePath
import System.Process
import qualified Data.ByteString.Lazy as BSL
import qualified Data.Text.Encoding as T
import qualified Data.Text.IO as T

runProg :: (Int, CookCmd) -> IO ()
runProg (verb, cmd) =
    do initLoggingFramework logLevel
       ec <- system "command -v docker >/dev/null 2>&1"
       case ec of
         ExitSuccess ->
             runProg' cmd
         ExitFailure _ ->
             error "dockercook requires docker. Install from http://docker.com"
    where
      logLevel =
          case verb of
            0 -> ERROR
            1 -> WARNING
            2 -> INFO
            3 -> DEBUG
            _ -> error "Invalid verbosity! Pick 0-3"

runProg' :: CookCmd -> IO ()
runProg' cmd =
    case cmd of
      CookBuild buildCfg ->
          do uploader <- mkUploader 100
             stateDir <- findStateDirectory
             let rootDir = takeDirectory stateDir
             _ <- cookBuild rootDir stateDir buildCfg uploader Nothing
             when (cc_autoPush buildCfg) $
               do logInfo $ "Waiting for all images to finish beeing pushed"
                  waitForCompletion uploader
                  missingImages <- killUploader uploader
                  unless (null missingImages) $
                      logError "Uploader confirmed completion but still had images in the pipeline!"
             return ()
      CookSync ->
          do stateDir <- findStateDirectory
             runSync stateDir
      CookParse files ->
          mapM_ cookParse files
      CookVersion showNumeric ->
          if showNumeric
          then print (foldl' (\v (vers, pos) -> v + vers * (10 ^ (2*pos))) 0 $
                      zip (reverse $ versionBranch version) ([0..] :: [Integer]))
          else putStrLn ("dockercook " ++ showVersion version)
      CookInit ->
          do createDirectoryIfMissing True _STATE_DIR_NAME_
             _ <- createStateManager _STATE_DIR_NAME_
             putStrLn "My kitchen is ready for cooking!"
      CookTiming opt ->
          do stateDir <- findStateDirectory
             (mgr, _) <- createStateManager stateDir
             res <- getImageBuildTime mgr opt
             T.putStrLn $ T.decodeUtf8 $ BSL.toStrict $ encodePretty res

main :: IO ()
main =
    execParser opts >>= runProg
    where
      opts = info (helper <*> argParse)
             ( fullDesc
             <> progDesc "Speed up docker image building"
             )