OXYGENHUB

A test report beside the coverage from every run of Oxygen's tests (closes #139) ff6987682725

The test job runs cargo llvm-cov nextest with a ci profile, keeping a
JUnit report whether or not the tests pass, as OxygenFlow's now does
(its run #177: 114 tests read, 66.8% coverage).
Author
Andy McCall @andymccall <[email protected]>
via
agent agent:claude@andymccall <[email protected]> · keyless, under your grant for changes,refs,seal · key 41723d79429e
When
· 2026-10-25 21:25 UTC
Signature
◈ sealed by agent:claude@andymccall
Hash
ff6987682725f3184da6505b62cbb51158c4508ebb5100600b668c6ef4d9e9ca
Depends on
2b668d92b066 8fd78eb52ad2 c8d9059e4e70 dfa3e8e95d80 e4595038502a
Depended on by
544d0541a7e5
In bookmarks
identical-sides main push-notes subrepo-pin-state
In tags
v0.10.0 v0.11.0 v0.7.0 v0.8.0 v0.9.0
Edits
6 atoms, 2 tree operations, 3 files

Browse the tree at this change

added .config/nextest.toml +8 −0
1 +
# The CI profile (oxygen#139): every test runs, and a JUnit report is
2 +
# written to target/nextest/ci/junit.xml for the hub's test report
3 +
# (the job's `junit` artifact).
4 +
[profile.ci]
5 +
fail-fast = false
6 +
7 +
[profile.ci.junit]
8 +
path = "junit.xml"
modified .flow/pipeline.kdl +8 −4
…
41 unchanged lines
42 42
    }
43 43
======= oxy conflict 1 of 1, side 2 of 2: change 116da477 "CI starts from the build image's prebuilt dependencies"
44 44
    exec "sh" ".flow/warm-target.sh" "cargo" "clippy" "--workspace" "--all-targets" "--locked" "--" "-D" "warnings"
45 -
>>>>>>> oxy conflict 1 of 1 end
46 -
}
47 -
45 +
// The tests, run under cargo-nextest and cargo-llvm-cov: a test report
46 +
// (JUnit, kept whether or not they pass; #139) for the hub's Tests tab and
47 +
// line coverage (LCOV, oxygenhub#113) for its Coverage tab, from one run.
48 48
// The tests, run under cargo-llvm-cov so the hub's Coverage tab
49 49
// (oxygenhub#113) gets a report: the same tests, instrumented, and an LCOV
50 50
// file kept as the job's `coverage` artifact.
…
5 unchanged lines
56 56
        target "/src/target"
57 57
        size "24GiB"
58 58
    }
59 -
    env {
59 +
    exec "cargo" "llvm-cov" "nextest" "--workspace" "--locked" "--profile" "ci" "--lcov" "--output-path" "/src/target/lcov.info"
60 60
        CARGO_INCREMENTAL "0"
61 +
        artifact "junit" {
62 +
            path "/src/target/nextest/ci/junit.xml"
63 +
            when "always"
64 +
        }
61 65
    }
62 66
    exec "cargo" "llvm-cov" "--workspace" "--locked" "--lcov" "--output-path" "/src/target/lcov.info"
63 67
    output {
…
73 unchanged lines
modified CHANGELOG.md +1 −0
…
1 unchanged lines
2 2
3 3
## Unreleased
4 4
5 +
- **Oxygen's CI writes a test report beside its coverage (#139):** the test job runs under cargo-nextest (`.config/nextest.toml`, profile `ci`) as well as cargo-llvm-cov, keeping a JUnit report whether or not the tests pass, for the hub's Tests tab.
5 6
- **Pushing a new bookmark sends only what the remote lacks (#142).** A push was worked out against the remote's heads for that bookmark alone, so a bookmark new to the remote sent its whole history again: slow on a big repository, and OxygenHub's push protection scanned all of it (and refused a proposal's bookmark for an example key in a change main had had for weeks). The heads of every bookmark the remote lists now count as already there.
6 7
- **A binary file's or subrepo pin's conflict can be settled from the command line (#140).** Two changes that replaced the same binary file, or moved the same subrepo pin, leave a replace conflict with no markers to edit, and every commit was refused until it was settled, which only a hosted edit could do. `oxy resolve PATH…` now settles it with what the working copy holds at the path (the file, or the subrepo's pin): the next commit is a resolution replacing every version with it. A path with no replace conflict is refused, and a choice is forgotten once committed.
7 8
- **The object store works where hard links are refused (#141).** Android forbids apps hard links in their own storage, so the OxygenHub app's phone runner could clone nothing (`Permission denied`). Where a link is refused, objects are renamed into place with `renameat2(RENAME_NOREPLACE)`: as atomic, and still never over a name that is taken.
…
268 unchanged lines