diff options
| -rwxr-xr-x | Omni/Ci.hs | 25 |
1 files changed, 16 insertions, 9 deletions
@@ -208,16 +208,19 @@ getCoderoot = do -- | Extract meaningful error messages from tool output, filtering out progress/status lines extractErrorMessage :: Text -> Text extractErrorMessage output = - let errorLines = - Text.lines output - |> map stripAnsiEscapes -- Remove ANSI escape sequences - |> filter isErrorLine - |> take 5 -- Limit to first 5 error lines - cleaned = + let cleanedLines = Text.lines output |> map stripAnsiEscapes |> filter (not <. Text.null) + -- First try to find explicit error lines + errorLines = cleanedLines |> filter isErrorLine |> take 5 + -- If no explicit errors, take last few non-empty lines (likely contain the issue) + fallbackLines = if null errorLines - then ["Unknown error (no error lines found)"] - else errorLines - in Text.unlines cleaned + then cleanedLines |> reverse |> take 3 |> reverse + else [] + finalLines + | null errorLines && null fallbackLines = ["Build failed (exit code non-zero, no error output captured)"] + | null errorLines = fallbackLines + | otherwise = errorLines + in Text.unlines finalLines where isErrorLine line = let stripped = Text.strip line @@ -230,12 +233,16 @@ extractErrorMessage output = `Text.isInfixOf` stripped || "ERROR:" `Text.isInfixOf` stripped + || "failed" + `Text.isInfixOf` stripped ) && not ("warning:" `Text.isInfixOf` stripped) -- Exclude warnings + && not ("[" `Text.isPrefixOf` stripped) -- Skip progress indicators like [1/10] -- Remove ANSI escape sequences including carriage returns stripAnsiEscapes line = line |> Text.replace "\r" "" -- Remove carriage returns |> Text.replace "\ESC[" "" -- Remove ANSI escape start + |> Text.replace "\x1b[" "" -- Alternative ANSI escape sequence |> Text.filter (\c -> c >= ' ' || c == '\t') -- Keep only printable chars and tabs |
