@@ -7,6 +7,7 @@ use build_helper::metrics::{
7
7
format_build_steps,
8
8
} ;
9
9
10
+ use crate :: github:: JobInfoResolver ;
10
11
use crate :: metrics;
11
12
use crate :: metrics:: { JobMetrics , JobName , get_test_suites} ;
12
13
use crate :: utils:: { output_details, pluralize} ;
@@ -185,13 +186,19 @@ fn render_table(suites: BTreeMap<String, TestSuiteRecord>) -> String {
185
186
}
186
187
187
188
/// Outputs a report of test differences between the `parent` and `current` commits.
188
- pub fn output_test_diffs ( job_metrics : & HashMap < JobName , JobMetrics > ) {
189
+ pub fn output_test_diffs (
190
+ job_metrics : & HashMap < JobName , JobMetrics > ,
191
+ job_info_resolver : & mut JobInfoResolver ,
192
+ ) {
189
193
let aggregated_test_diffs = aggregate_test_diffs ( & job_metrics) ;
190
- report_test_diffs ( aggregated_test_diffs) ;
194
+ report_test_diffs ( aggregated_test_diffs, job_metrics , job_info_resolver ) ;
191
195
}
192
196
193
197
/// Prints the ten largest differences in bootstrap durations.
194
- pub fn output_largest_duration_changes ( job_metrics : & HashMap < JobName , JobMetrics > ) {
198
+ pub fn output_largest_duration_changes (
199
+ job_metrics : & HashMap < JobName , JobMetrics > ,
200
+ job_info_resolver : & mut JobInfoResolver ,
201
+ ) {
195
202
struct Entry < ' a > {
196
203
job : & ' a JobName ,
197
204
before : Duration ,
@@ -230,9 +237,9 @@ pub fn output_largest_duration_changes(job_metrics: &HashMap<JobName, JobMetrics
230
237
println ! ( "# Job duration changes" ) ;
231
238
for ( index, entry) in changes. into_iter ( ) . take ( 10 ) . enumerate ( ) {
232
239
println ! (
233
- "{}. `{}` : {:.1}s -> {:.1}s ({:.1}%)" ,
240
+ "{}. {} : {:.1}s -> {:.1}s ({:.1}%)" ,
234
241
index + 1 ,
235
- entry. job,
242
+ format_job_link ( job_info_resolver , job_metrics , entry. job) ,
236
243
entry. before. as_secs_f64( ) ,
237
244
entry. after. as_secs_f64( ) ,
238
245
entry. change
@@ -400,7 +407,11 @@ fn generate_test_name(name: &str) -> String {
400
407
}
401
408
402
409
/// Prints test changes in Markdown format to stdout.
403
- fn report_test_diffs ( diff : AggregatedTestDiffs ) {
410
+ fn report_test_diffs (
411
+ diff : AggregatedTestDiffs ,
412
+ job_metrics : & HashMap < JobName , JobMetrics > ,
413
+ job_info_resolver : & mut JobInfoResolver ,
414
+ ) {
404
415
println ! ( "# Test differences" ) ;
405
416
if diff. diffs . is_empty ( ) {
406
417
println ! ( "No test diffs found" ) ;
@@ -521,9 +532,26 @@ fn report_test_diffs(diff: AggregatedTestDiffs) {
521
532
println ! (
522
533
"- {}: {}" ,
523
534
format_job_group( group as u64 ) ,
524
- jobs. iter( ) . map( |j| format!( "`{j}`" ) ) . collect:: <Vec <_>>( ) . join( ", " )
535
+ jobs. iter( )
536
+ . map( |j| format_job_link( job_info_resolver, job_metrics, j) )
537
+ . collect:: <Vec <_>>( )
538
+ . join( ", " )
525
539
) ;
526
540
}
527
541
} ,
528
542
) ;
529
543
}
544
+
545
+ /// Tries to get a GitHub Actions job summary URL from the resolver.
546
+ /// If it is not available, just wraps the job name in backticks.
547
+ fn format_job_link (
548
+ job_info_resolver : & mut JobInfoResolver ,
549
+ job_metrics : & HashMap < JobName , JobMetrics > ,
550
+ job_name : & str ,
551
+ ) -> String {
552
+ job_metrics
553
+ . get ( job_name)
554
+ . and_then ( |metrics| job_info_resolver. get_job_summary_link ( job_name, & metrics. current ) )
555
+ . map ( |summary_url| format ! ( "[{job_name}]({summary_url})" ) )
556
+ . unwrap_or_else ( || format ! ( "`{job_name}`" ) )
557
+ }
0 commit comments