1
1
use crate :: {
2
- app:: { Filters , PackageFilters } ,
3
- helpers:: get_codspeed_target_dir,
4
- measurement_mode:: MeasurementMode ,
2
+ app:: PackageFilters , helpers:: get_codspeed_target_dir, measurement_mode:: MeasurementMode ,
5
3
prelude:: * ,
6
4
} ;
7
5
use anyhow:: Context ;
@@ -22,13 +20,37 @@ struct BenchToRun {
22
20
package_name : String ,
23
21
}
24
22
25
- impl Filters {
23
+ impl PackageFilters {
24
+ /// Logic taken from [cargo::ops::Packages](https://docs.rs/cargo/0.85.0/src/cargo/ops/cargo_compile/packages.rs.html#34-42)
25
+ pub ( crate ) fn packages_from_flags < ' a > (
26
+ & self ,
27
+ metadata : & ' a Metadata ,
28
+ ) -> Result < Vec < & ' a Package > > {
29
+ Ok (
30
+ match ( self . workspace , self . exclude . len ( ) , self . package . len ( ) ) {
31
+ ( false , 0 , 0 ) => metadata. workspace_default_packages ( ) ,
32
+ ( false , 0 , _) => metadata
33
+ . workspace_packages ( )
34
+ . into_iter ( )
35
+ . filter ( |p| self . package . contains ( & p. name ) )
36
+ . collect ( ) ,
37
+ ( false , _, _) => bail ! ( "--exclude can only be used with --workspace" ) ,
38
+ ( true , 0 , _) => metadata. workspace_packages ( ) ,
39
+ ( true , _, _) => metadata
40
+ . workspace_packages ( )
41
+ . into_iter ( )
42
+ . filter ( |p| !self . exclude . contains ( & p. name ) )
43
+ . collect ( ) ,
44
+ } ,
45
+ )
46
+ }
47
+
26
48
fn benches_to_run (
27
49
& self ,
28
50
codspeed_target_dir : PathBuf ,
29
51
metadata : & Metadata ,
30
52
) -> Result < Vec < BenchToRun > > {
31
- let packages = self . package . packages ( metadata) ?;
53
+ let packages = self . packages_from_flags ( metadata) ?;
32
54
33
55
let mut benches = vec ! [ ] ;
34
56
for package in packages {
@@ -63,80 +85,25 @@ impl Filters {
63
85
}
64
86
}
65
87
66
- impl PackageFilters {
67
- /// Logic taken from [cargo::ops::Packages](https://docs.rs/cargo/0.85.0/src/cargo/ops/cargo_compile/packages.rs.html#34-42)
68
- fn packages < ' a > ( & self , metadata : & ' a Metadata ) -> Result < Vec < & ' a Package > > {
69
- Ok (
70
- match ( self . workspace , self . exclude . len ( ) , self . package . len ( ) ) {
71
- ( false , 0 , 0 ) => metadata. workspace_default_packages ( ) ,
72
- ( false , 0 , _) => metadata
73
- . workspace_packages ( )
74
- . into_iter ( )
75
- . filter ( |p| {
76
- self . package
77
- . iter ( )
78
- . any ( |allowed_package| p. name . contains ( allowed_package) )
79
- } )
80
- . collect ( ) ,
81
- ( false , _, _) => bail ! ( "--exclude can only be used with --workspace" ) ,
82
- ( true , 0 , _) => metadata. workspace_packages ( ) ,
83
- ( true , _, _) => metadata
84
- . workspace_packages ( )
85
- . into_iter ( )
86
- . filter ( |p| {
87
- !self
88
- . exclude
89
- . iter ( )
90
- . any ( |denied_package| p. name . contains ( denied_package) )
91
- } )
92
- . collect ( ) ,
93
- } ,
94
- )
95
- }
96
- }
97
-
98
88
pub fn run_benches (
99
89
metadata : & Metadata ,
100
- filters : Filters ,
90
+ bench_name_filter : Option < String > ,
91
+ package_filters : PackageFilters ,
101
92
measurement_mode : MeasurementMode ,
102
93
) -> Result < ( ) > {
103
94
let codspeed_target_dir = get_codspeed_target_dir ( metadata, measurement_mode) ;
104
95
let workspace_root = metadata. workspace_root . as_std_path ( ) ;
105
96
if measurement_mode == MeasurementMode :: Walltime {
106
97
WalltimeResults :: clear ( workspace_root) ?;
107
98
}
108
- let benches = filters . benches_to_run ( codspeed_target_dir, metadata) ?;
99
+ let benches = package_filters . benches_to_run ( codspeed_target_dir, metadata) ?;
109
100
if benches. is_empty ( ) {
110
101
bail ! ( "No benchmarks found. Run `cargo codspeed build` first." ) ;
111
102
}
112
103
113
- let mut to_run = vec ! [ ] ;
114
- if let Some ( allowed_bench_names) = filters. bench {
115
- // Make sure all benchmarks are found
116
- let mut not_found = vec ! [ ] ;
117
- for allowed_bench_name in allowed_bench_names. iter ( ) {
118
- let bench = benches
119
- . iter ( )
120
- . find ( |b| b. bench_name . contains ( allowed_bench_name) ) ;
121
-
122
- if let Some ( bench) = bench {
123
- to_run. push ( bench) ;
124
- } else {
125
- not_found. push ( allowed_bench_name) ;
126
- }
127
- }
104
+ eprintln ! ( "Collected {} benchmark suite(s) to run" , benches. len( ) ) ;
128
105
129
- if !not_found. is_empty ( ) {
130
- bail ! (
131
- "The following benchmarks to run were not found: {}" ,
132
- not_found. iter( ) . join( ", " )
133
- ) ;
134
- }
135
- } else {
136
- to_run = benches. iter ( ) . collect ( ) ;
137
- }
138
- eprintln ! ( "Collected {} benchmark suite(s) to run" , to_run. len( ) ) ;
139
- for bench in to_run. iter ( ) {
106
+ for bench in benches. iter ( ) {
140
107
let bench_name = & bench. bench_name ;
141
108
// workspace_root is needed since file! returns the path relatively to the workspace root
142
109
// while CARGO_MANIFEST_DIR returns the path to the sub package
@@ -151,6 +118,10 @@ pub fn run_benches(
151
118
command. arg ( "--bench" ) ; // Walltime targets need this additional argument (inherited from running them with `cargo bench`)
152
119
}
153
120
121
+ if let Some ( bench_name_filter) = bench_name_filter. as_ref ( ) {
122
+ command. arg ( bench_name_filter) ;
123
+ }
124
+
154
125
command
155
126
. status ( )
156
127
. map_err ( |e| anyhow ! ( "failed to execute the benchmark process: {}" , e) )
@@ -177,7 +148,7 @@ pub fn run_benches(
177
148
} ) ?;
178
149
eprintln ! ( "Done running {bench_name}" ) ;
179
150
}
180
- eprintln ! ( "Finished running {} benchmark suite(s)" , to_run . len( ) ) ;
151
+ eprintln ! ( "Finished running {} benchmark suite(s)" , benches . len( ) ) ;
181
152
182
153
if measurement_mode == MeasurementMode :: Walltime {
183
154
aggregate_raw_walltime_data ( workspace_root) ?;
0 commit comments