|
17 | 17 | env: |
18 | 18 | RUST_BACKTRACE: 1 |
19 | 19 | CARGO_NET_GIT_FETCH_WITH_CLI: true |
| 20 | + CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse |
20 | 21 | steps: |
21 | 22 | - name: Checkout repository |
22 | 23 | uses: actions/checkout@v3.5.2 |
|
46 | 47 | env: |
47 | 48 | LLVM_PROFILE_FILE: "${github_repository}-%m-%p.profraw" |
48 | 49 | RUSTFLAGS: "-C instrument-coverage" |
49 | | - # Unstable feature: https://github.com/rust-lang/rust/issues/56925 |
| 50 | + # Unstable feature: `--persist-doctests`: persist doctest executables after running |
| 51 | + # https://rustwiki.org/en/rustdoc/unstable-features.html#--persist-doctests-persist-doctest-executables-after-running |
| 52 | + # |
| 53 | + # Used to allow grcov to use these sources to generate coverage metrics. |
50 | 54 | RUSTDOCFLAGS: "-C instrument-coverage -Z unstable-options --persist-doctests target/debug/doctests" |
51 | 55 | run: cargo test |
52 | 56 |
|
@@ -77,26 +81,43 @@ jobs: |
77 | 81 | aws s3 sync target/coverage/ s3://${s3_bucket}/${github_repository}/ --delete --sse AES256 --include '*' --exclude '*.svg' --exclude '*.html' --exclude '*.json' |
78 | 82 |
|
79 | 83 | - name: Check missed lines |
| 84 | + shell: python |
80 | 85 | run: | |
81 | | - curl -s https://codecov.artichokeruby.org/${github_repository}/coverage.json | python -c '\ |
82 | | - import sys, json; \ |
83 | | - \ |
84 | | - trunk_coverage = json.loads(sys.stdin.read()); \ |
85 | | - print("On trunk: "); \ |
86 | | - print("coveragePercent =", trunk_coverage["coveragePercent"]); \ |
87 | | - print("linesCovered =", trunk_coverage["linesCovered"]); \ |
88 | | - print("linesMissed =", trunk_coverage["linesMissed"]); \ |
89 | | - print("linesTotal =", trunk_coverage["linesTotal"]); \ |
90 | | - print(""); \ |
91 | | - \ |
92 | | - branch_coverage = json.load(open("target/coverage/coverage.json")) |
93 | | - print("On PR branch: "); \ |
94 | | - print("coveragePercent =", branch_coverage["coveragePercent"]); \ |
95 | | - print("linesCovered =", branch_coverage["linesCovered"]); \ |
96 | | - print("linesMissed =", branch_coverage["linesMissed"]); \ |
97 | | - print("linesTotal =", branch_coverage["linesTotal"]); \ |
98 | | - print(""); \ |
99 | | - \ |
100 | | - is_ok = branch_coverage["linesMissed"] <= trunk_coverage["linesMissed"]; \ |
101 | | - exit(0) if is_ok else exit(1) \ |
102 | | - ' |
| 86 | + import json |
| 87 | + from urllib.request import urlopen |
| 88 | +
|
| 89 | + trunk_coverage_url = "https://codecov.artichokeruby.org/${github_repository}/coverage.json" |
| 90 | +
|
| 91 | +
|
| 92 | + def print_report(coverage, *, on=None): |
| 93 | + if on is None: |
| 94 | + raise ValueError("must provide `on` kwarg") |
| 95 | +
|
| 96 | + print(f"On {on}:") |
| 97 | + print("coveragePercent =", coverage["coveragePercent"]) |
| 98 | + print("linesCovered =", coverage["linesCovered"]) |
| 99 | + print("linesMissed =", coverage["linesMissed"]) |
| 100 | + print("linesTotal =", coverage["linesTotal"]) |
| 101 | + print("") |
| 102 | +
|
| 103 | +
|
| 104 | + if "$${{ github.ref_name }}" == "trunk": |
| 105 | + # We don't need to compare trunk coverage to itself |
| 106 | + exit(0) |
| 107 | +
|
| 108 | + with urlopen(trunk_coverage_url, data=None, timeout=3) as remote: |
| 109 | + trunk_coverage = json.load(remote) |
| 110 | +
|
| 111 | + print_report(trunk_coverage, on="branch trunk") |
| 112 | +
|
| 113 | + with open("target/coverage/coverage.json") as local: |
| 114 | + branch_coverage = json.load(local) |
| 115 | +
|
| 116 | + on = None |
| 117 | + if "$${{ github.event_name }}" == "pull_request": |
| 118 | + on = "PR artichoke/${github_repository}#$${{ github.event.number }}" |
| 119 | +
|
| 120 | + print_report(branch_coverage, on=on) |
| 121 | +
|
| 122 | + is_ok = branch_coverage["linesMissed"] <= trunk_coverage["linesMissed"] |
| 123 | + exit(0) if is_ok else exit(1) |
0 commit comments