DotCov.Fallout
3.0.0
See the version list below for details.
dotnet add package DotCov.Fallout --version 3.0.0
NuGet\Install-Package DotCov.Fallout -Version 3.0.0
<PackageReference Include="DotCov.Fallout" Version="3.0.0" />
<PackageVersion Include="DotCov.Fallout" Version="3.0.0" />
<PackageReference Include="DotCov.Fallout" />
paket add DotCov.Fallout --version 3.0.0
#r "nuget: DotCov.Fallout, 3.0.0"
#:package DotCov.Fallout@3.0.0
#addin nuget:?package=DotCov.Fallout&version=3.0.0
#tool nuget:?package=DotCov.Fallout&version=3.0.0
DotCov.Fallout
Coverage reporting and threshold gating for Fallout builds — one interface, no target wiring.
Migrating from DotCov.Nuke
Version 1.0 replaces DotCov.Nuke with this package; it is not a NUKE compatibility
shim. First migrate your build with the
Fallout migration guide,
then replace the DotCov.Nuke package reference with DotCov.Fallout version
1.0.0 and change using DotCov.Nuke; to using DotCov.Fallout;.
Keep ICoverageReport on your FalloutBuild. Existing DotCov.Nuke 0.x packages
remain separate and do not automatically redirect to this package.
See the 1.0 migration notes for the accompanying parser API changes.
Getting started
fallout :add-package DotCov.Fallout
using DotCov.Fallout;
class Build : FalloutBuild, ICoverageReport { }
fallout ReportCoverage --coverage-min-line 80 --coverage-exclude-generated-param true
That is the whole setup. There is no default threshold: set --coverage-min-line,
--coverage-min-branch, or both, or the target fails naming them before it reads a report.
ReportCoverage searches RootDirectory / "TestResults" for
**/*cobertura*.xml (including timestamped MTP reports and hidden directories), merges everything it finds, renders
the chosen format, appends a markdown block to $GITHUB_STEP_SUMMARY when that variable is
set, and fails the build when line or branch coverage is below threshold.
The target attaches itself to ICompile through TryDependsOn, so it hooks into an existing
build without requiring you to implement ICompile.
Parameters
| Parameter | Default | Effect |
|---|---|---|
--coverage-min-line |
none | Minimum line coverage percentage, 0 to 100 (invariant number); set it, --coverage-min-branch, or both |
--coverage-min-branch |
none | Minimum branch coverage percentage, 0 to 100; a dimension left unset is not checked |
--coverage-format |
table |
table, json, markdown, or md |
--coverage-exclude-generated-param |
false |
true/false: apply ExclusionRules.WellKnown before gating |
--coverage-exclude-test-code-param |
false |
true/false: apply ExclusionRules.TestCode before gating; the excluded files are logged |
--coverage-probe-sources-param |
false |
true/false: resolve a relative file name under several <source> roots against the root that holds it on this machine's disk |
--coverage-source-root |
empty (off) | Resolve such file names against this declared root instead |
--coverage-pattern |
**/*cobertura*.xml |
filename (top level) or **/filename (recursive) |
--coverage-max-chars-param |
50000000 |
Per-file XML character cap; 0 disables it |
--coverage-badge-directory |
empty (off) | Write coverage-badge.svg and coverage-badge.json here, relative to the root, for every outcome |
Every value is validated once, before any report is read; an invalid value fails the target
naming the parameter. Override CoverageSearchDirectory in your Build class to scan
somewhere other than RootDirectory / "TestResults".
Outcomes
| Situation | Result |
|---|---|
| Search directory missing | Target fails: Coverage search directory '…' does not exist |
| Directory exists, no matching report | Target fails: No files matching '…' found in … |
| No threshold set, or one outside 0 to 100 | Target fails before reading a report, naming Coverage MinLine/Coverage MinBranch |
| Reports parsed, but nothing measured | Target fails: Coverage could not be measured: NODATA: … |
Several <source> roots, file identity unresolved |
Target fails: Coverage could not be measured: NODATA: … ambiguous identity … |
--coverage-source-root not declared by any report |
Target fails: Invalid Coverage SourceRoot: … |
| Coverage below a threshold | Target fails: Coverage below threshold: FAIL: … |
Every threshold is 0 |
Target fails: Coverage gate is disabled … |
| Thresholds met | Target succeeds; the verdict is logged |
| Thresholds met, badge directory unwritable | Target fails: Coverage gate passed, but its badge could not be written: … |
Parser warnings (malformed hit counts, contradictory branch data, ambiguous source roots, …) are
logged one per line. Only an unresolved file identity changes the verdict, to NODATA. The badge is written before a failing verdict fails the target, so
a drop turns it red; its colour is the outcome, and its message the line rate, plus the branch
rate when a branch minimum is set. A non-passing gate keeps its own failure message when the badge
cannot be written. To publish it to a branch, pass the directory to the
badge action as badge-directory. An unwritable GITHUB_STEP_SUMMARY is logged as a warning and
does not fail an otherwise passing gate. Percentages are invariant-formatted, so CI logs read
62.0% on every host, never 62,0%.
Parsing comes from DotCov: streaming XmlReader,
no full-DOM load, DTDs ignored (never processed), external resolution disabled, bounded memory.
Also in this family
DotCov.Tool — the dotcov CLI ·
DotCov — the parser as a library
Feedback
Documentation · Issues · MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DotCov (>= 3.0.0)
- Fallout.Common (>= 10.4.0)
- Fallout.Components (>= 10.4.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.7.1 | 106 | 10/19/2026 |
| 4.7.0 | 160 | 10/15/2026 |
| 4.6.0 | 80 | 10/15/2026 |
| 4.5.0 | 101 | 10/15/2026 |
| 4.4.0 | 88 | 10/15/2026 |
| 4.3.2 | 81 | 10/15/2026 |
| 4.3.1 | 89 | 10/15/2026 |
| 4.3.0 | 81 | 10/14/2026 |
| 4.2.0 | 83 | 10/14/2026 |
| 4.1.0 | 130 | 10/14/2026 |
| 4.0.0 | 90 | 10/14/2026 |
| 3.0.1 | 89 | 10/14/2026 |
| 3.0.0 | 101 | 10/13/2026 |
| 2.0.0 | 83 | 10/13/2026 |
| 1.7.1 | 87 | 10/11/2026 |
| 1.7.0 | 90 | 10/11/2026 |
| 1.6.1 | 85 | 10/11/2026 |
| 1.6.0 | 90 | 10/11/2026 |
| 1.5.0 | 85 | 10/11/2026 |
| 1.4.0 | 92 | 10/11/2026 |
DotCov 3.0.0 changes three gate contracts; every number a gate decides on may move.
1. Thresholds are explicit: check, test, the Fallout target and the badge action have no default --min-line 80. Pass --min-line, --min-branch, or both (0 to 100); without either the command exits 2 before reading a report.
2. The CRAP gate needs every method scored: one unscored method makes it NODATA (exit 3). Emitters without a usable complexity attribute need --metrics.
3. File identity is deterministic: several source roots no longer trigger a disk probe; unresolved files make check, crap and test NODATA until --probe-sources or --source-root.
Fixes: contradictory condition detail and empty class summaries no longer inflate branch and line rates; condition identity no longer depends on XML packaging; CRAP rows stay per file and per overload, raising diluted scores; ./src/C.cs and src/C.cs count once; ParseAsync finishes method-only classes.
New: --exclude-test-code. Full notes: https://github.com/ANcpLua/dotcov/blob/main/docs/releases/3.0.0.md