use xshell::Shell;
use crate::environment::{cargo_cmd, get_workspace_packages, CmdExt, ProgressGuard};
use crate::git;
use crate::lock::LockFile;
use crate::toolchain::{prepare_toolchain, Toolchain};
pub fn run(
sh: &Shell,
lockfile: LockFile,
toolchain: Toolchain,
baseline: Option<&str>,
packages: &[String],
cargo_args: &[String],
) -> Result<(), Box<dyn std::error::Error>> {
let _progress = ProgressGuard::new();
git::for_each_commit(sh, lockfile, baseline, |sh| {
prepare_toolchain(sh, toolchain)?;
let resolved_packages = get_workspace_packages(sh, packages)?;
let mut cmd = cargo_cmd(sh);
if let Some(subcommand) = cargo_args.first() {
cmd = cmd.arg(subcommand);
}
for pkg in &resolved_packages {
cmd = cmd.arg("-p").arg(&pkg.name);
}
if cargo_args.len() > 1 {
cmd = cmd.args(&cargo_args[1..]);
}
cmd.run_with_capture()
})?;
Ok(())
}