liquidhaskell-0.8.0.2: tests/TestCommits.hs
#!/usr/bin/env runhaskell
{- GeneralizedNewtypeDeriving -}
import System.Environment (getArgs)
import System.Process (system)
import Text.Printf (printf)
import Data.List (isSuffixOf, stripPrefix)
import Data.Maybe (fromMaybe)
{- | Run this script as:
$ ./TestCommit.hs commits.txt
where commits.txt is a file with a single git commit on each line, OR
$ ./TestCommit.hs NUMBER
which will get the last N(UMBER) of commits from the `branch`
-}
--------------------------------------------------------------------------------
-- | Configuration parameters
--------------------------------------------------------------------------------
project :: String
project = "liquidhaskell"
-- project = "liquidhaskell --fast --test-arguments=\"-p Peano\""
branch :: String
branch = "develop"
tmpFile :: FilePath
tmpFile = "/tmp/commits"
summaryPath :: FilePath
summaryPath = "/Users/rjhala/research/stack/lh-test/tests/logs/cur/summary.csv"
--------------------------------------------------------------------------------
main :: IO ()
--------------------------------------------------------------------------------
main = do
p <- strParam . head <$> getArgs
case p of
File f -> testCommits f
Size n -> makeCommits n
makeCommits :: Int -> IO ()
makeCommits n = do
system (genCommand n)
putStrLn $ "Wrote commits into: " ++ tmpFile
testCommits :: FilePath -> IO ()
testCommits f = do
is <- readCommits f
putStrLn "Generating test summaries for:"
mapM_ (putStrLn . (" " ++)) is
runCmd setupCmd
mapM_ runCommit is
runCmd setupCmd
strParam :: String -> Param
strParam s
| ".txt" `isSuffixOf` s = File s
| otherwise = Size (read s)
--------------------------------------------------------------------------------
-- | Types
--------------------------------------------------------------------------------
data Param = File FilePath
| Size Int
type CommitId = String
type Command = [String]
--------------------------------------------------------------------------------
_commits :: Param -> IO [CommitId]
--------------------------------------------------------------------------------
_commits (File f) = readCommits f
_commits (Size n) = system (genCommand n) >> readCommits tmpFile
genCommand :: Int -> String
genCommand n = printf "git log -n %d --walk-reflogs %s | grep \"commit \" > %s"
n branch tmpFile
readCommits :: FilePath -> IO [CommitId]
readCommits f = map strCommit . lines <$> readFile f
strCommit :: String -> CommitId
strCommit s = fromMaybe s (stripPrefix "commit " s)
--------------------------------------------------------------------------------
runCommit :: CommitId -> IO ()
--------------------------------------------------------------------------------
runCommit i = do
putStrLn ("Running commit: " ++ i)
runCmd (commitCmd i)
runCmd :: Command -> IO ()
runCmd = mapM_ system
setupCmd :: Command
setupCmd = [ printf "git checkout %s" branch ]
commitCmd :: CommitId -> Command
commitCmd i =
[ printf "git checkout %s" i
, "git submodule update"
, printf "stack test %s" project
, printf "cp %s ~/tmp/summary-%s.csv" summaryPath i
]