diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2022-11-30 21:30:26 +0100 | 
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2022-12-02 21:25:24 +0100 | 
| commit | 55cead7b8d31f5e5fe09df0588abf736a465c0eb (patch) | |
| tree | e32319e97ea5dacb0f052a464fe3f1bdfb3ce504 /src | |
| parent | 3005c10b971856862a51cfa18dc42c79b272952d (diff) | |
First build test using cabal
Diffstat (limited to 'src')
| -rw-r--r-- | src/Main.hs | 90 | 
1 files changed, 88 insertions, 2 deletions
| diff --git a/src/Main.hs b/src/Main.hs index 65ae4a0..32c0288 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,4 +1,90 @@ -module Main where +module Main (main) where + +import Control.Monad +import Control.Monad.Except + +import Data.Text (Text) +import Data.Text qualified as T + +import System.Directory +import System.Exit +import System.IO +import System.Process + +data Job = Job +    { jobName :: JobName +    , jobRecipe :: [CreateProcess] +    , jobArtifacts :: [(ArtifactName, CreateProcess)] +    } + +data JobOutput = JobOutput +    { outName :: JobName +    , outStatus :: Bool +    , outArtifacts :: [(ArtifactName, FilePath)] +    } +    deriving (Show) + +data JobName = JobName Text +    deriving (Eq, Ord, Show) + +data ArtifactName = ArtifactName Text +    deriving (Eq, Ord, Show) + + +runJob :: String -> Job -> IO JobOutput +runJob cid job = do +    [path] <- lines <$> readProcess "mktemp" ["-d", "-t", "minici.XXXXXXXXXX"] "" + +    "" <- readProcess "git" ["--work-tree=" <> path, "restore", "--source=" <> cid, "--", "."] "" + +    res <- runExceptT $ do +        forM_ (jobRecipe job) $ \p -> do +            (Just hin, Just hout, Just herr, hp) <- liftIO $ createProcess p +                { cwd = Just path +                , std_in = CreatePipe +                , std_out = CreatePipe +                , std_err = CreatePipe +                } +            liftIO $ hClose hin +            exit <- liftIO $ waitForProcess hp +            liftIO $ hClose hout +            liftIO $ hClose herr + +            when (exit /= ExitSuccess) $ +                throwError () + +    removeDirectoryRecursive $ path + +    return JobOutput +        { outName = jobName job +        , outStatus = res == Right () +        , outArtifacts = [] +        } + + +cabalJob :: JobName -> [ArtifactName] -> Job +cabalJob name artifacts = Job +    { jobName = name +    , jobRecipe = [ proc "cabal" ["build", "--ghc-option=-Werror"] ] +    , jobArtifacts = map (\(ArtifactName aname) -> (ArtifactName "bin", proc "cabal" ["list-bin", T.unpack aname])) artifacts +    }  main :: IO () -main = putStrLn "Hello, Haskell!" +main = do +    commits <- map (fmap (drop 1) . (span (/=' '))) . lines <$> +        readProcess "git" ["log", "--pretty=oneline", "--first-parent", "--reverse", "origin/master..HEAD"] "" +    forM_ commits $ \(cid, desc) -> do +        let descLen = length desc +            desc' = if descLen <= 50 then desc <> replicate (50 - descLen) ' ' +                                     else take 49 desc <> "…" +            shortCid = take 7 cid + +        putStr $ shortCid <> " " <> desc' <> " " +        hFlush stdout +        runJob cid (cabalJob (JobName "build") $ map (ArtifactName . T.pack) []) >>= \case +            out | outStatus out -> do +                putStr "\ESC[92m✓\ESC[0m" +            _ -> do +                putStr "\ESC[91m✗\ESC[0m" +                putStr $ "\r\ESC[91m" <> shortCid <> "\ESC[0m" +        putStrLn "" |