packages feed

hpc-coveralls-0.2.2: src/HpcCoverallsMain.hs

module Main where

import Control.Monad
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as BSL
import Data.List
import Data.Maybe
import HpcCoverallsCmdLine
import System.Console.CmdArgs
import System.Environment (getEnv, getEnvironment)
import System.Exit (exitFailure, exitSuccess)
import Trace.Hpc.Coveralls
import Trace.Hpc.Coveralls.Config
import Trace.Hpc.Coveralls.Curl

urlApiV1 :: String
urlApiV1 = "https://coveralls.io/api/v1/jobs"

getServiceAndJobID :: IO (String, String)
getServiceAndJobID = do
    env <- getEnvironment
    case fmap snd $ find (isJust . flip lookup env . fst) ciEnvVars of
        Just (ciName, jobIdVarName) -> do
            jobId <- getEnv jobIdVarName
            return (ciName, jobId)
        _ -> error "Unsupported CI service."
    where ciEnvVars = [
           ("TRAVIS",      ("travis-ci", "TRAVIS_JOB_ID")),
           ("CIRCLECI",    ("circleci",  "CIRCLE_BUILD_NUM")),
           ("SEMAPHORE",   ("semaphore", "REVISION")),
           ("JENKINS_URL", ("jenkins",   "BUILD_ID")),
           ("CI_NAME",     ("codeship",  "CI_BUILD_NUMBER"))]

writeJson :: String -> Value -> IO ()
writeJson filePath = BSL.writeFile filePath . encode

toConfig :: HpcCoverallsArgs -> Maybe Config
toConfig hca = case testSuites hca of
    [testSuite] -> Just $ Config [testSuite] (excludeDirs hca)
    _           -> Nothing

main :: IO ()
main = do
    hca <- cmdArgs hpcCoverallsArgs
    case toConfig hca of
        Nothing -> putStrLn "Please specify a target test suite name" >> exitSuccess
        Just config -> do
            (serviceName, jobId) <- getServiceAndJobID
            coverallsJson <- generateCoverallsFromTix serviceName jobId config
            let filePath = serviceName ++ "-" ++ jobId ++ ".json"
            when (displayReport hca) $ BSL.putStrLn $ encode coverallsJson
            writeJson filePath coverallsJson
            response <- postJson filePath urlApiV1
            case response of
                PostSuccess url -> putStrLn ("URL: " ++ url) >> exitSuccess
                PostFailure msg -> putStrLn ("Error: " ++ msg) >> exitFailure