@@ -7,6 +7,7 @@ use build_helper::metrics::{
77 format_build_steps,
88} ;
99
10+ use crate :: github:: JobInfoResolver ;
1011use crate :: metrics;
1112use crate :: metrics:: { JobMetrics , JobName , get_test_suites} ;
1213use crate :: utils:: { output_details, pluralize} ;
@@ -185,13 +186,19 @@ fn render_table(suites: BTreeMap<String, TestSuiteRecord>) -> String {
185186}
186187
187188/// 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+ ) {
189193 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 ) ;
191195}
192196
193197/// 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+ ) {
195202 struct Entry < ' a > {
196203 job : & ' a JobName ,
197204 before : Duration ,
@@ -225,14 +232,14 @@ pub fn output_largest_duration_changes(job_metrics: &HashMap<JobName, JobMetrics
225232 } ) ;
226233 }
227234 }
228- changes. sort_by ( |e1, e2| e1. change . partial_cmp ( & e2. change ) . unwrap ( ) . reverse ( ) ) ;
235+ changes. sort_by ( |e1, e2| e1. change . abs ( ) . partial_cmp ( & e2. change . abs ( ) ) . unwrap ( ) . reverse ( ) ) ;
229236
230237 println ! ( "# Job duration changes" ) ;
231238 for ( index, entry) in changes. into_iter ( ) . take ( 10 ) . enumerate ( ) {
232239 println ! (
233- "{}. `{}` : {:.1}s -> {:.1}s ({:.1}%)" ,
240+ "{}. {} : {:.1}s -> {:.1}s ({:.1}%)" ,
234241 index + 1 ,
235- entry. job,
242+ format_job_link ( job_info_resolver , job_metrics , entry. job) ,
236243 entry. before. as_secs_f64( ) ,
237244 entry. after. as_secs_f64( ) ,
238245 entry. change
@@ -400,7 +407,11 @@ fn generate_test_name(name: &str) -> String {
400407}
401408
402409/// 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+ ) {
404415 println ! ( "# Test differences" ) ;
405416 if diff. diffs . is_empty ( ) {
406417 println ! ( "No test diffs found" ) ;
@@ -521,9 +532,26 @@ fn report_test_diffs(diff: AggregatedTestDiffs) {
521532 println ! (
522533 "- {}: {}" ,
523534 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( ", " )
525539 ) ;
526540 }
527541 } ,
528542 ) ;
529543}
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