{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
import Args
import BuildBox
import BuildBox.FileFormat.BuildResults
import System.Console.ParseArgs hiding (args)
import Data.List
import Control.Monad
main :: IO ()
main
= do args <- parseArgsIO (ArgsTrailing "files") resultsArgs
mainWithArgs args
mainWithArgs :: Args ResultsArg -> IO ()
mainWithArgs args
-- Print usage help
| gotArg args ArgHelp
= usageError args ""
-- Dump a results file.
| Just fileName <- getArg args ArgDump
, [] <- argsRest args
= do contents <- readFile fileName
let results = (read contents) :: BuildResults
putStrLn $ render $ ppr results
-- Print the names of all the benchmarks in a file.
| Just fileName <- getArg args ArgNames
, [] <- argsRest args
= do contents <- readFile fileName
let results = (read contents) :: BuildResults
putStrLn
$ render
$ vcat
$ map (text . benchResultName)
$ buildResultBench results
-- Compare two results files.
| gotArg args ArgCompare
= do let fileNames = argsRest args
contentss <- mapM readFile fileNames
let (results :: [BuildResults])
= map read contentss
let [baseline, current]
= map buildResultBench results
putStrLn $ render $ vcat $ punctuate (text "\n") $ map ppr
$ compareManyBenchResults
(map statBenchResult baseline)
(map statBenchResult current)
-- Compare two results files and summarise them.
| Just swing <- getArg args ArgSummarise
= do let fileNames = argsRest args
contentss <- mapM readFile fileNames
let (results :: [BuildResults]) = map read contentss
let [baseline, current] = map buildResultBench results
putStr $ render $ reportBenchResults (Just swing)
$ compareManyBenchResults
(map statBenchResult baseline)
(map statBenchResult current)
-- Merge two results files, prefering benchmark results on the left.
-- The time and environment fields are taken from the file on the right.
| gotArg args ArgMerge
= do
-- Read all the files.
let fileNames = argsRest args
contentss <- mapM readFile fileNames
let (results :: [BuildResults])
= map read contentss
print $ mergeResults results
-- Accept the most recent run of a named benchmark.
| Just name <- getArg args ArgAccept
, [fileBase, fileRecent] <- argsRest args
= do baseline <- liftM read $ readFile fileBase
recent <- liftM read $ readFile fileRecent
let Just result = acceptResult name baseline recent
print $ result
-- Advance winning results to form a new baseline.
| Just swing <- getArg args ArgAdvance
= do let fileNames = argsRest args
contentss <- mapM readFile fileNames
let ([baseline, recent] :: [BuildResults])
= map read contentss
print $ advanceResults swing baseline recent
| otherwise
= usageError args "Nothing to do...\n"