diff --git a/.github/scripts/coverage.py b/.github/scripts/coverage.py index 0cdcafbfad81..bff310f0a85e 100755 --- a/.github/scripts/coverage.py +++ b/.github/scripts/coverage.py @@ -91,6 +91,41 @@ def comment_report(diff_cover_report, pr_number, job_url): else: print(report) +def raise_warnings(diff_cover_report): + """ + Raise warnings about missing coverage. + """ + + def print_warning(file, block_start, block_end): + if block_start == block_end: + message = f"Uncovered line ({block_start})" + else: + message = f"Uncovered lines ({block_start}–{block_end})" + print(f"::warning file={file},line={block_start},endLine={block_end},title=Coverage::{message}") + + with open(diff_cover_report) as f: + report_json = json.load(f) + src_stats = report_json["src_stats"] + + for file, file_stats in src_stats.items(): + violation_lines = sorted(file_stats["violation_lines"]) + + block_start = None + block_end = None + for line in violation_lines: + if block_start is None: + block_start = line + block_end = line + elif block_end == line - 1: + block_end = line + else: + print_warning(file, block_start, block_end) + block_start = line + block_end = line + + if block_start is not None: + print_warning(file, block_start, block_end) + def main(): cmd = sys.argv[1] log(f'Running command {cmd}') @@ -99,6 +134,9 @@ def main(): pr_number = sys.argv[3] if len(sys.argv) > 3 else "" job_url = sys.argv[4] if len(sys.argv) > 4 else "" comment_report(diff_cover_report, pr_number, job_url) + elif cmd == 'raise_warnings': + diff_cover_report = sys.argv[2] + raise_warnings(diff_cover_report) if __name__ == '__main__': diff --git a/.github/workflows/test_rust.yml b/.github/workflows/test_rust.yml index 74657168790b..aafaa4680df7 100644 --- a/.github/workflows/test_rust.yml +++ b/.github/workflows/test_rust.yml @@ -272,6 +272,10 @@ jobs: if: always() run: cat target/diff-cover/report.md >> $GITHUB_STEP_SUMMARY + - name: Warnings + if: always() + run: $COVERAGE_SCRIPT raise_warnings "target/diff-cover/report.json" + dependencies: needs: changes if: needs.changes.outputs.should_run == 'true'