Skip to content

Commit 6072a98

Browse files
committed
fix(cargo-codspeed): forward args after -- to bench binaries
`cargo codspeed run -- --exact <name>` previously failed with `unexpected argument '--exact' found` because the `Run` subcommand had no trailing-args field. Add a `bench_args` field with `last = true` and forward it to each bench command, mirroring `cargo bench` behavior.
1 parent 0c6ccae commit 6072a98

3 files changed

Lines changed: 26 additions & 0 deletions

File tree

crates/cargo-codspeed/src/app.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ impl Cli {
100100
package_filters,
101101
bench_target_filters,
102102
measurement_mode,
103+
bench_args,
103104
} => {
104105
let mode = measurement_mode.unwrap_or_default();
105106
eprintln!("[cargo-codspeed] Measurement mode: {mode:?}\n");
@@ -109,6 +110,7 @@ impl Cli {
109110
package_filters,
110111
bench_target_filters,
111112
mode,
113+
bench_args,
112114
)
113115
}
114116
}
@@ -211,6 +213,10 @@ enum Commands {
211213
/// Automatically set to `walltime` on macro runners
212214
#[arg(short = 'm', long = "measurement-mode", env = "CODSPEED_RUNNER_MODE")]
213215
measurement_mode: Option<MeasurementMode>,
216+
217+
/// Arguments forwarded to each benchmark binary after `--`
218+
#[arg(last = true)]
219+
bench_args: Vec<String>,
214220
},
215221
}
216222

crates/cargo-codspeed/src/run.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ pub fn run_benches(
9999
package_filters: PackageFilters,
100100
bench_target_filters: BenchTargetFilters,
101101
measurement_mode: MeasurementMode,
102+
bench_args: Vec<String>,
102103
) -> Result<()> {
103104
let build_mode = measurement_mode.into();
104105
let codspeed_target_dir = get_codspeed_target_dir(metadata, build_mode);
@@ -133,6 +134,8 @@ pub fn run_benches(
133134
command.arg(bench_name_filter);
134135
}
135136

137+
command.args(&bench_args);
138+
136139
command
137140
.status()
138141
.map_err(|e| anyhow!("failed to execute the benchmark process: {e}"))

crates/cargo-codspeed/tests/simple-criterion.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,23 @@ fn test_criterion_build_and_run_filtered_by_name_single() {
122122
teardown(dir);
123123
}
124124

125+
#[test]
126+
fn test_criterion_walltime_run_forwards_args_after_double_dash() {
127+
let dir = setup(DIR, Project::Simple);
128+
cargo_codspeed(&dir)
129+
.args(["build", "-m", "walltime"])
130+
.assert()
131+
.success();
132+
cargo_codspeed(&dir)
133+
.args(["run", "-m", "walltime", "--", "--exact", "fib 20"])
134+
.assert()
135+
.success()
136+
.stdout(contains(FIB_BENCH_NAME))
137+
.stdout(contains(BUBBLE_SORT_BENCH_NAME).not())
138+
.stderr(contains("Finished running 2 benchmark suite(s)"));
139+
teardown(dir);
140+
}
141+
125142
#[test]
126143
fn test_criterion_cargo_bench_no_run() {
127144
let dir = setup(DIR, Project::Simple);

0 commit comments

Comments
 (0)