summaryrefslogtreecommitdiff
path: root/Omni
diff options
context:
space:
mode:
authorBen Sima <ben@bensima.com>2025-11-22 17:11:24 -0500
committerBen Sima <ben@bensima.com>2025-11-22 17:11:24 -0500
commitbfac1e16193d379507fb4b115e014cdf9f87d605 (patch)
treea6a094ae8026339cf73fd9c88e03f1dc8f85e45c /Omni
parent62b92f0daac27a076a0177420f6a735dd30626a3 (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')
-rw-r--r--Omni/Ci.hs60
1 files changed, 29 insertions, 31 deletions
diff --git a/Omni/Ci.hs b/Omni/Ci.hs
index 35abe2b..aff5c7b 100644
--- a/Omni/Ci.hs
+++ b/Omni/Ci.hs
@@ -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
-