diff options
| author | Ben Sima <ben@bensima.com> | 2025-11-22 17:11:24 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bensima.com> | 2025-11-22 17:11:24 -0500 |
| commit | bfac1e16193d379507fb4b115e014cdf9f87d605 (patch) | |
| tree | a6a094ae8026339cf73fd9c88e03f1dc8f85e45c /Omni/Ci.hs | |
| parent | 62b92f0daac27a076a0177420f6a735dd30626a3 (diff) | |
fix: fix compilation errors in Omni/Ci.hs
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'Omni/Ci.hs')
| -rw-r--r-- | Omni/Ci.hs | 60 |
1 files changed, 29 insertions, 31 deletions
@@ -1,9 +1,9 @@ #!/usr/bin/env run.sh {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE QuasiQuotes #-} -- | A robust CI program replacing Omni/Ci.sh -- @@ -11,16 +11,15 @@ module Omni.Ci (main) where import Alpha +import qualified Data.Text as Text import qualified Omni.Cli as Cli import qualified Omni.Log as Log import qualified Omni.Test as Test +import qualified System.Directory as Dir import qualified System.Environment as Environment import qualified System.Exit as Exit -import qualified System.Process as Process -import qualified Data.Text as Text -import qualified Data.List as List -import qualified System.Directory as Dir import System.FilePath ((</>)) +import qualified System.Process as Process main :: IO () main = Cli.main <| Cli.Plan help move test pure @@ -43,14 +42,14 @@ test = Test.group "Omni.Ci" [ Test.unit "placeholder test" <| do - True @=? True + True Test.@=? True ] move :: Cli.Arguments -> IO () move _ = do -- 1. Check for dirty worktree status <- readProcess "git" ["status", "-s"] "" - unless (null status) <| do + unless (Text.null status) <| do Log.fail ["ci", "dirty worktree"] Exit.exitWith (Exit.ExitFailure 1) @@ -69,11 +68,11 @@ move _ = do -- 4. Check existing git notes -- commit=$(git notes --ref=ci show HEAD || true) (exitCode, noteContent, _) <- Process.readProcessWithExitCode "git" ["notes", "--ref=ci", "show", "HEAD"] "" - + let alreadyGood = case exitCode of Exit.ExitSuccess -> let content = Text.pack noteContent - in ("Lint-is: good" `Text.isInfixOf` content) && ("Test-is: good" `Text.isInfixOf` content) + in ("Lint-is: good" `Text.isInfixOf` content) && ("Test-is: good" `Text.isInfixOf` content) _ -> False when alreadyGood <| do @@ -83,7 +82,7 @@ move _ = do -- 5. Run Lint coderoot <- getCoderoot let runlint = coderoot </> "_/bin/lint" - + lintExists <- Dir.doesFileExist runlint unless lintExists <| do Log.info ["ci", "building lint"] @@ -105,10 +104,11 @@ move _ = do -- Omni/Lint.hs: "traverse Directory.makeAbsolute /> map (Namespace.fromPath root) ... filter (not <. Namespace.isCab)" -- It seems it expects files. -- We can use `git ls-files` to get all files. - allFiles <- readProcess "git" ["ls-files"] "" - /> lines - /> map Text.unpack - /> filter (not . null) + allFiles <- + readProcess "git" ["ls-files"] "" + /> lines + /> map Text.unpack + /> filter (not <. null) -- We can't pass all files as arguments if there are too many (ARG_MAX). -- But wait, Omni/Lint.hs takes arguments. @@ -120,28 +120,28 @@ move _ = do -- It seems it filters for files. -- If I pass a directory, `doesFileExist` will return False. -- So I must pass files. - + -- Let's pass all files from git ls-files. -- But we must be careful about ARG_MAX. -- For now, let's try passing them. If it fails, we might need to batch. - + lintResult <- do -- We run lint on all files. -- Note: calling callProcess with huge list might fail. -- Let's see if we can avoid passing all files if Lint supports it. - -- Omni/Lint.hs doesn't seem to support directory recursion on its own if passed a dir, + -- Omni/Lint.hs doesn't seem to support directory recursion on its own if passed a dir, -- it treats args as file paths. - + -- We will try to run it. (exitCodeLint, _, _) <- Process.readProcessWithExitCode runlint allFiles "" - pure $ case exitCodeLint of + pure <| case exitCodeLint of Exit.ExitSuccess -> "good" _ -> "fail" -- 6. Run Tests -- if bild "${BILD_ARGS:-""}" --test "${CODEROOT:?}"/**/* Log.info ["ci", "running tests"] - + testResult <- do -- similarly, bild takes targets. -- bild "${CODEROOT:?}"/**/* @@ -149,20 +149,21 @@ move _ = do -- Let's try passing all files again. -- bild handles namespaces. (exitCodeTest, _, _) <- Process.readProcessWithExitCode "bild" ("--test" : allFiles) "" - pure $ case exitCodeTest of + pure <| case exitCodeTest of Exit.ExitSuccess -> "good" _ -> "fail" -- 7. Create Note - let note = Text.unlines - [ "Lint-is: " <> lintResult - , "Test-is: " <> testResult - , "Test-by: " <> user <> " <" <> mail <> ">" - , "Test-at: " <> at - ] + let noteMsg = + Text.unlines + [ "Lint-is: " <> lintResult, + "Test-is: " <> testResult, + "Test-by: " <> user <> " <" <> mail <> ">", + "Test-at: " <> at + ] -- 8. Append Note - callProcess "git" ["notes", "--ref=ci", "append", "-m", Text.unpack note] + callProcess "git" ["notes", "--ref=ci", "append", "-m", Text.unpack noteMsg] -- 9. Exit if lintResult == "good" && testResult == "good" @@ -171,7 +172,6 @@ move _ = do Log.fail ["ci", "verification failed"] Exit.exitWith (Exit.ExitFailure 1) - -- Helpers readProcess :: FilePath -> [String] -> String -> IO Text @@ -186,8 +186,6 @@ callProcess cmd args = do getCoderoot :: IO FilePath getCoderoot = do mEnvRoot <- Environment.lookupEnv "CODEROOT" - cwd <- Dir.getCurrentDirectory case mEnvRoot of Just envRoot -> pure envRoot Nothing -> panic "CODEROOT not set" -- Simplified for now - |
