@@ -9,6 +9,7 @@ permissions:
99 contents : read
1010 pages : write
1111 id-token : write
12+ pull-requests : write
1213
1314concurrency :
1415 group : coverage-${{ github.ref }}
7879 --output-dir coverage-raw
7980 mv coverage-raw/lcov.info coverage-raw/openssl-async-std.info
8081
82+ - name : Generate coverage summary for PR comparison
83+ if : github.event_name == 'pull_request'
84+ run : |
85+ # Merge LCOV files for summary
86+ cat coverage-raw/*.info > coverage-raw/pr-combined.info
87+
88+ # Generate JSON summary for comparison
89+ cargo tarpaulin \
90+ --package oo7 \
91+ --lib \
92+ --no-default-features \
93+ --features "tracing,tokio,native_crypto" \
94+ --ignore-panics \
95+ --out Json \
96+ --output-dir coverage-raw \
97+ --skip-clean
98+
99+ # Extract coverage percentage
100+ python3 -c "
101+ import json
102+ with open('coverage-raw/tarpaulin-report.json', 'r') as f:
103+ data = json.load(f)
104+ coverage = data['files'][''] # This might need adjustment based on actual structure
105+ print(f'PR_COVERAGE={coverage:.2f}')
106+ " >> $GITHUB_ENV || echo "PR_COVERAGE=0.00" >> $GITHUB_ENV
107+
81108 - name : Install grcov for merging coverage
82109 uses : taiki-e/install-action@v2
83110 with :
@@ -102,6 +129,110 @@ jobs:
102129 --ignore "**/examples/*" \
103130 --ignore "**/target/*"
104131
132+ - name : Store coverage percentage for main branch
133+ if : github.ref == 'refs/heads/main' && github.event_name == 'push'
134+ run : |
135+ # Extract and store coverage percentage for future PR comparisons
136+ CURRENT_COVERAGE=$(python3 -c "
137+ import json
138+ try:
139+ with open('coverage-raw/tarpaulin-report.json', 'r') as f:
140+ data = json.load(f)
141+ covered = data.get('covered', 0)
142+ coverable = data.get('coverable', 1)
143+ coverage = (covered / coverable * 100) if coverable > 0 else 0
144+ print(f'{coverage:.2f}')
145+ except Exception as e:
146+ print('0.00')
147+ " 2>/dev/null || echo "0.00")
148+
149+ echo "Main branch coverage: $CURRENT_COVERAGE%"
150+
151+ # Store in a simple text file artifact for PR comparisons
152+ mkdir -p coverage-baseline
153+ echo "$CURRENT_COVERAGE" > coverage-baseline/main-coverage.txt
154+
155+ - name : Upload baseline coverage
156+ if : github.ref == 'refs/heads/main' && github.event_name == 'push'
157+ uses : actions/upload-artifact@v4
158+ with :
159+ name : coverage-baseline
160+ path : coverage-baseline/main-coverage.txt
161+ retention-days : 90
162+
163+ - name : Get main branch coverage for comparison
164+ if : github.event_name == 'pull_request'
165+ uses : actions/download-artifact@v4
166+ with :
167+ name : coverage-baseline
168+ path : coverage-baseline/
169+ continue-on-error : true
170+
171+ - name : Set main coverage for comparison
172+ if : github.event_name == 'pull_request'
173+ run : |
174+ if [ -f coverage-baseline/main-coverage.txt ]; then
175+ MAIN_COVERAGE=$(cat coverage-baseline/main-coverage.txt)
176+ echo "MAIN_COVERAGE=$MAIN_COVERAGE" >> $GITHUB_ENV
177+ echo "Using stored main branch coverage: $MAIN_COVERAGE%"
178+ else
179+ echo "MAIN_COVERAGE=0.00" >> $GITHUB_ENV
180+ echo "No baseline coverage found, using 0.00%"
181+ fi
182+
183+ - name : Post coverage comment on PR
184+ if : github.event_name == 'pull_request'
185+ uses : actions/github-script@v7
186+ with :
187+ script : |
188+ const prCoverage = parseFloat(process.env.PR_COVERAGE || '0.00');
189+ const mainCoverage = parseFloat(process.env.MAIN_COVERAGE || '0.00');
190+ const diff = prCoverage - mainCoverage;
191+ const diffText = diff > 0 ? `+${diff.toFixed(2)}%` : `${diff.toFixed(2)}%`;
192+ const emoji = diff > 0 ? '📈' : diff < 0 ? '📉' : '➡️';
193+
194+ const body = `## 📊 Code Coverage Report
195+
196+ | Metric | Value |
197+ |--------|-------|
198+ | **Current PR Coverage** | ${prCoverage.toFixed(2)}% |
199+ | **Main Branch Coverage** | ${mainCoverage.toFixed(2)}% |
200+ | **Coverage Change** | ${emoji} ${diffText} |
201+
202+ ${diff < -1 ? '⚠️ **Warning**: Coverage decreased by more than 1%' : ''}
203+ ${diff > 1 ? '🎉 **Great**: Coverage increased by more than 1%!' : ''}
204+
205+ *Coverage report generated by [cargo-tarpaulin](https://github.com/xd009642/tarpaulin)*`;
206+
207+ // Find existing coverage comment
208+ const { data: comments } = await github.rest.issues.listComments({
209+ owner: context.repo.owner,
210+ repo: context.repo.repo,
211+ issue_number: context.issue.number,
212+ });
213+
214+ const existingComment = comments.find(comment =>
215+ comment.body.includes('## 📊 Code Coverage Report')
216+ );
217+
218+ if (existingComment) {
219+ // Update existing comment
220+ await github.rest.issues.updateComment({
221+ owner: context.repo.owner,
222+ repo: context.repo.repo,
223+ comment_id: existingComment.id,
224+ body: body
225+ });
226+ } else {
227+ // Create new comment
228+ await github.rest.issues.createComment({
229+ owner: context.repo.owner,
230+ repo: context.repo.repo,
231+ issue_number: context.issue.number,
232+ body: body
233+ });
234+ }
235+
105236 - name : Upload coverage artifacts
106237 uses : actions/upload-artifact@v4
107238 with :
0 commit comments