diff options
| -rw-r--r-- | .tasks/tasks.jsonl | 2 | ||||
| -rwxr-xr-x | Omni/Bild.hs | 16 | ||||
| -rw-r--r-- | Omni/Log/Concurrent.hs | 22 |
3 files changed, 23 insertions, 17 deletions
diff --git a/.tasks/tasks.jsonl b/.tasks/tasks.jsonl index 5bd93c2..9e357b5 100644 --- a/.tasks/tasks.jsonl +++ b/.tasks/tasks.jsonl @@ -78,7 +78,7 @@ {"taskCreatedAt":"2025-11-14T18:19:45.800202144Z","taskDependencies":[],"taskId":"t-1a1DGY0","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Implement line reservation and release logic","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.855747669Z"} {"taskCreatedAt":"2025-11-14T18:19:45.82813327Z","taskDependencies":[],"taskId":"t-1a1DOev","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Implement concurrent line update with ANSI codes","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.915807677Z"} {"taskCreatedAt":"2025-11-14T18:19:45.857123437Z","taskDependencies":[],"taskId":"t-1a1DVM5","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Add terminal capability detection","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.975985146Z"} -{"taskCreatedAt":"2025-11-14T18:19:45.886073324Z","taskDependencies":[],"taskId":"t-1a1E3j1","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Thread LineManager through build/nixBuild functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.886073324Z"} +{"taskCreatedAt":"2025-11-14T18:19:45.886073324Z","taskDependencies":[],"taskId":"t-1a1E3j1","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Thread LineManager through build/nixBuild functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:38:03.516198105Z"} {"taskCreatedAt":"2025-11-14T18:19:45.914626247Z","taskDependencies":[],"taskId":"t-1a1EaJy","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Create runWithLineManager and logsToLine functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.914626247Z"} {"taskCreatedAt":"2025-11-14T18:19:45.94320795Z","taskDependencies":[],"taskId":"t-1a1Eiay","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Test parallel builds with ANSI multi-line output","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.94320795Z"} {"taskCreatedAt":"2025-11-14T18:19:45.971879353Z","taskDependencies":[],"taskId":"t-1a1EpCZ","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Add fallback for dumb terminals","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.971879353Z"} diff --git a/Omni/Bild.hs b/Omni/Bild.hs index 414049b..aa79877 100755 --- a/Omni/Bild.hs +++ b/Omni/Bild.hs @@ -142,6 +142,7 @@ import qualified Network.HostName as HostName import qualified Omni.Bild.Meta as Meta import qualified Omni.Cli as Cli import qualified Omni.Log as Log +import qualified Omni.Log.Concurrent as LogC import Omni.Namespace (Namespace (..)) import qualified Omni.Namespace as Namespace import Omni.Test ((@=?)) @@ -954,12 +955,15 @@ build :: Bool -> Bool -> Int -> Int -> Analysis -> IO [Exit.ExitCode] build andTest loud jobs cpus analysis = do root <- Env.getEnv "CODEROOT" let targets = Map.elems analysis - results <- mapConcurrentlyBounded jobs (buildTarget root) targets - pure (map fst results) + LogC.withLineManager jobs <| \lineMgr -> do + results <- mapConcurrentlyBounded jobs (buildTarget lineMgr root) targets + pure (map fst results) where - buildTarget :: FilePath -> Target -> IO (Exit.ExitCode, ByteString) - buildTarget root target@Target {..} = - case compiler of + buildTarget :: LogC.LineManager -> FilePath -> Target -> IO (Exit.ExitCode, ByteString) + buildTarget lineMgr root target@Target {..} = do + mLineNum <- LogC.reserveLine lineMgr namespace + let doRelease = LogC.releaseLine lineMgr mLineNum + result <- case compiler of CPython -> case out of Just _ -> Log.info ["bild", "nix", "python", nschunk namespace] @@ -1016,6 +1020,8 @@ build andTest loud jobs cpus analysis = do Sbcl -> Log.info ["bild", "dev", "lisp", nschunk namespace] >> proc loud namespace (toNixFlag compiler) compilerFlags + doRelease (isSuccess (fst result) ?: (LogC.Success, LogC.Failed)) + pure result data Proc = Proc { loud :: Bool, diff --git a/Omni/Log/Concurrent.hs b/Omni/Log/Concurrent.hs index 2a46df5..5187367 100644 --- a/Omni/Log/Concurrent.hs +++ b/Omni/Log/Concurrent.hs @@ -88,13 +88,13 @@ reserveLine LineManager {..} ns = if not lmSupportsANSI then pure Nothing else - atomicModifyIORef' lmLines <| \lines -> - case findFirstFree lines of - Nothing -> (lines, Nothing) + atomicModifyIORef' lmLines <| \linesMap -> + case findFirstFree linesMap of + Nothing -> (linesMap, Nothing) Just lineNum -> let status = BuildStatus ns "" Building - lines' = Map.insert lineNum (Just status) lines - in (lines', Just lineNum) + linesMap' = Map.insert lineNum (Just status) linesMap + in (linesMap', Just lineNum) where findFirstFree :: Map Int (Maybe BuildStatus) -> Maybe Int findFirstFree m = @@ -127,16 +127,16 @@ updateLine LineManager {..} mLineNum ns output = ANSI.hRestoreCursor IO.stderr - modifyIORef' lmLines <| \lines -> - Map.adjust (fmap (\bs -> bs {bsLastOutput = output})) lineNum lines + modifyIORef' lmLines <| \linesMap -> + Map.adjust (fmap (\bs -> bs {bsLastOutput = output})) lineNum linesMap releaseLine :: LineManager -> Maybe Int -> BuildState -> IO () -releaseLine LineManager {..} mLineNum state = +releaseLine LineManager {..} mLineNum buildState = case mLineNum of Nothing -> pure () Just lineNum -> do - modifyIORef' lmLines <| \lines -> - Map.insert lineNum Nothing lines + modifyIORef' lmLines <| \linesMap -> + Map.insert lineNum Nothing linesMap when lmSupportsANSI <| do current <- readIORef lmCurrentLine @@ -145,7 +145,7 @@ releaseLine LineManager {..} mLineNum state = ANSI.hCursorUp IO.stderr (current - lineNum) ANSI.hClearLine IO.stderr - let statusChar = case state of + let statusChar = case buildState of Success -> "✓" Failed -> "✗" Building -> "…" |
