Skip to content

feat(ci): parse JUnit XML reports in native Rust#1465

Open
jd wants to merge 1 commit into
devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bcfrom
devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778
Open

feat(ci): parse JUnit XML reports in native Rust#1465
jd wants to merge 1 commit into
devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bcfrom
devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778

Conversation

@jd
Copy link
Copy Markdown
Member

@jd jd commented May 27, 2026

First layer of the mergify ci junit-process port — a JUnit XML
parser that produces semantically-tagged TestCase values.
Hermetic (no network), so the upload and quarantine layers can be
landed and reviewed separately on top of it.

The parser mirrors the Python implementation's accepted dialect:
<testsuites> root with nested <testsuite> children, a bare
<testsuite> root, or a <testsuite> root with nested
descendants. Within each suite, every <testcase> becomes a
TestCase tagged with its result and (for failures and errors)
the kind/message attributes plus the body text from the first
<failure> / <error> child.

quick-xml 0.40 splits text events around each entity reference,
so the parser accumulates body content across Text, CData,
and GeneralRef events into a per-failure buffer and trims once
at the closing tag — anything else would silently lose the chunk
before the first &gt; / &lt; / &amp;. A live-smoke fixture
pins the round-trip end to end against the actual XML pytest
emits, so the upload layer cannot drift from what the parser
expects.

Co-Authored-By: Claude Opus 4.7 noreply@anthropic.com

Depends-On: #1461

@jd
Copy link
Copy Markdown
Member Author

jd commented May 27, 2026

This pull request is part of a Mergify stack:

# Pull Request Link
1 fix(cli): accept --debug on the Rust binary and actually toggle it in Python #1464
2 refactor(rust): share test scaffolding via mergify-test-support crate #1439
3 refactor(core): introduce CommandContext for the queue+freeze prelude #1441
4 refactor(ci): consolidate the CI-env scrubber into a shared testing module #1442
5 refactor: drop stale Phase X.Y doc markers and one inline color branch #1443
6 refactor(tui): share StyledGlyph across queue show/status renderers #1444
7 refactor(queue): drop indexmap, group_by_scope returns a Vec<(K, V)> #1445
8 refactor(ci): swap uuid for getrandom in the GHA heredoc delimiter #1446
9 refactor(config): standardize the workspace on serde_yaml_ng for YAML parsing #1447
10 test(ci): add live smoke test for ci scopes select-all path #1460
11 feat(rust): port ci scopes to native Rust #1461
12 feat(ci): parse JUnit XML reports in native Rust #1465 👈
13 feat(ci): encode JUnit cases as OTLP and upload to Mergify CI Insights #1466
14 feat(ci): promote ci junit-process from shim to native Rust #1467
15 feat(ci): promote ci junit-upload from shim to native as a deprecated alias #1468
16 fix(ci): prefer GitHub Actions PR-event head SHA over GITHUB_SHA #1469

@mergify
Copy link
Copy Markdown
Contributor

mergify Bot commented May 27, 2026

Merge Protections

Your pull request matches the following merge protections and will not be merged until they are valid.

🔴 ⛓️ Depends-On Requirements

Waiting for

This rule is failing.

Requirement based on the presence of Depends-On in the body of the pull request

🔴 👀 Review Requirements

Waiting for

  • #approved-reviews-by>=2
This rule is failing.
  • any of:
    • #approved-reviews-by>=2
    • author = dependabot[bot]
    • author = mergify-ci-bot
    • author = renovate[bot]

🔴 🔎 Reviews

Waiting for

  • #review-requested = 0
This rule is failing.
  • #review-requested = 0
  • #changes-requested-reviews-by = 0
  • #review-threads-unresolved = 0

🟢 🤖 Continuous Integration

Wonderful, this rule succeeded.
  • all of:
    • check-success=ci-gate

🟢 Enforce conventional commit

Wonderful, this rule succeeded.

Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/

  • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert|ui)(?:\(.+\))?:

🟢 📕 PR description

Wonderful, this rule succeeded.
  • body ~= (?ms:.{48,})

@mergify mergify Bot requested a review from a team May 27, 2026 08:08
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from b1b850b to d3fd85c Compare May 27, 2026 08:27
@jd jd force-pushed the devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778 branch from 380699c to aaf35b0 Compare May 27, 2026 08:27
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:27 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:27 — with GitHub Actions Inactive
@jd
Copy link
Copy Markdown
Member Author

jd commented May 27, 2026

Revision history

# Type Changes Reason Date
1 initial 380699c 2026-05-27 08:27 UTC
2 rebase 380699c → aaf35b0 (rebase only) 2026-05-27 08:27 UTC
3 rebase aaf35b0 → 1dcc6df (rebase only) 2026-05-27 08:46 UTC
4 rebase 1dcc6df → 4778d48 (rebase only) 2026-05-27 10:04 UTC
5 rebase 4778d48 → e338014 (rebase only) 2026-05-27 10:15 UTC

@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 08:29 Failure
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from d3fd85c to 2857e8a Compare May 27, 2026 08:46
@jd jd force-pushed the devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778 branch from aaf35b0 to 1dcc6df Compare May 27, 2026 08:46
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:46 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:46 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 08:46 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 08:46 Failure
@jd jd marked this pull request as ready for review May 27, 2026 09:56
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from 2857e8a to b0d5709 Compare May 27, 2026 10:04
@jd jd force-pushed the devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778 branch from 1dcc6df to 4778d48 Compare May 27, 2026 10:04
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:04 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:04 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 10:07 Failure
First layer of the `mergify ci junit-process` port — a JUnit XML
parser that produces semantically-tagged `TestCase` values.
Hermetic (no network), so the upload and quarantine layers can be
landed and reviewed separately on top of it.

The parser mirrors the Python implementation's accepted dialect:
`<testsuites>` root with nested `<testsuite>` children, a bare
`<testsuite>` root, or a `<testsuite>` root with nested
descendants. Within each suite, every `<testcase>` becomes a
`TestCase` tagged with its result and (for failures and errors)
the kind/message attributes plus the body text from the first
`<failure>` / `<error>` child.

quick-xml 0.40 splits text events around each entity reference,
so the parser accumulates body content across `Text`, `CData`,
and `GeneralRef` events into a per-failure buffer and trims once
at the closing tag — anything else would silently lose the chunk
before the first `&gt;` / `&lt;` / `&amp;`. A live-smoke fixture
pins the round-trip end to end against the actual XML pytest
emits, so the upload layer cannot drift from what the parser
expects.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Change-Id: I7d0fb778bd495ff47ac075eeff6220b7551cd9ec
@jd jd force-pushed the devs/jd/worktree-rust-port/parse-junit-xml-reports-native-rust--7d0fb778 branch from 4778d48 to e338014 Compare May 27, 2026 10:15
@jd jd force-pushed the devs/jd/worktree-rust-port/port-ci-scopes-native-rust--635d39bc branch from b0d5709 to a7edc08 Compare May 27, 2026 10:15
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:15 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:15 — with GitHub Actions Inactive
@jd jd temporarily deployed to func-tests-live May 27, 2026 10:15 — with GitHub Actions Inactive
@mergify mergify Bot had a problem deploying to Mergify Merge Protections May 27, 2026 10:15 Failure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant