packages feed

rattle-0.2: benchmark/Benchmark/Redis.hs

{-# LANGUAGE RecordWildCards #-}

module Benchmark.Redis(main) where

import Benchmark.VsMake
import Development.Shake.Command
import Data.List.Extra
import System.FilePath
import System.Directory


main :: Args -> IO ()
main = vsMake VsMake{..}
    where
        broken = []
        -- a clone of Redis so we get stable -N history
        -- Originally "https://github.com/antirez/redis"
        repo = "https://github.com/ndmitchell/redis"
        master = "unstable"
        generateVersion = 2

        generate :: IO String
        generate = do
            cmd_ "make distclean" (EchoStdout False)
            Stdout xs <- cmd "make MALLOC=libc V=1 -j1"
            root <- getCurrentDirectory
            pure $ unlines $ fromTrace root $ lines xs

        clean :: IO ()
        clean = cmd_ "make distclean" (EchoStdout False)

        -- should touch .make-prerequisites in src and deps directories to force it to recursively
        -- rebuild stuff
        make = cmd Shell "make MALLOC=libc"
        rattle = cmd Shell


fromTrace :: FilePath -> [String] -> [String]
fromTrace root = f []
    where
        f cwds (x:xs)
            -- make[2]: Entering directory '/home/neil/redis-5.0.7/deps'
            | Just (_, x) <- "Entering directory '" `stripInfix` x
            , let cwd = makeRelative root $ takeWhile (/= '\'') x
                = f (cwd:cwds) xs

            -- make[3]: Leaving directory '/home/neil/redis-5.0.7/deps/lua/src'
            | "Leaving directory" `isInfixOf` x = f (tail cwds) xs

            | fst (word1 x) `elem` ["cc","ar"]
            , not $ " -MM " `isInfixOf` x -- the first line generates everyones deps
            , x <- replace " -MMD " " " x -- not required
                = (case cwds of c:_ -> "cd " ++ c ++ " && " ++ x; [] -> x) : f cwds xs

            | otherwise = f cwds xs
        f cwds [] = []