diff --git a/src/cargo.rs b/src/cargo.rs index 2bddce0..5cee8f7 100644 --- a/src/cargo.rs +++ b/src/cargo.rs @@ -43,7 +43,7 @@ fn cargo_target_dir(project: &Project) -> impl Iterator Result<()> { +pub fn build_dependencies(project: &mut Project) -> Result<()> { let workspace_cargo_lock = path!(project.workspace / "Cargo.lock"); if workspace_cargo_lock.exists() { let _ = fs::copy(workspace_cargo_lock, path!(project.dir / "Cargo.lock")); @@ -51,20 +51,30 @@ pub fn build_dependencies(project: &Project) -> Result<()> { let _ = cargo(project).arg("generate-lockfile").status(); } - let status = cargo(project) + let mut command = cargo(project); + command .arg(if project.has_pass { "build" } else { "check" }) .args(target()) .arg("--bin") .arg(&project.name) - .args(features(project)) - .status() - .map_err(Error::Cargo)?; + .args(features(project)); - if status.success() { - Ok(()) - } else { - Err(Error::CargoFail) + let status = command.status().map_err(Error::Cargo)?; + if !status.success() { + return Err(Error::CargoFail); } + + // Check if this Cargo contains https://github.com/rust-lang/cargo/pull/10383 + project.keep_going = command + .arg("-Zunstable-options") + .arg("--keep-going") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .map(|status| status.success()) + .unwrap_or(false); + + Ok(()) } pub fn build_test(project: &Project, name: &Name) -> Result { diff --git a/src/run.rs b/src/run.rs index 084606b..50ae6cb 100644 --- a/src/run.rs +++ b/src/run.rs @@ -31,6 +31,7 @@ pub struct Project { pub workspace: Directory, pub path_dependencies: Vec, manifest: Manifest, + pub keep_going: bool, } #[derive(Debug)] @@ -45,9 +46,9 @@ impl Runner { filter(&mut tests); let (project, _lock) = (|| { - let project = self.prepare(&tests)?; + let mut project = self.prepare(&tests)?; let lock = Lock::acquire(path!(project.dir / ".lock")); - self.write(&project)?; + self.write(&mut project)?; Ok((project, lock)) })() .unwrap_or_else(|err| { @@ -149,10 +150,11 @@ impl Runner { workspace, path_dependencies, manifest, + keep_going: false, }) } - fn write(&self, project: &Project) -> Result<()> { + fn write(&self, project: &mut Project) -> Result<()> { let manifest_toml = toml::to_string(&project.manifest)?; let config = self.make_config();