diff --git a/src/cargo.rs b/src/cargo.rs index 2bddce0..5a04b68 100644 --- a/src/cargo.rs +++ b/src/cargo.rs @@ -43,6 +43,43 @@ fn cargo_target_dir(project: &Project) -> impl Iterator Result { + let scratch_dir = env!("OUT_DIR"); + let dir = path!(scratch_dir / "keepgoing"); + fs::create_dir_all(&dir)?; + + let manifest_path = path!(dir / "Cargo.toml"); + let cargo_toml = "\ + [package]\n\ + name = \"trybuild_keep_going\"\n\ + version = \"0.0.0\"\n\ + [[bin]]\n\ + name = \"trybuild_keep_going\"\n\ + path = \"main.rs\"\n\ + [workspace]\n\ + "; + crate::fs::write_if_needed(&manifest_path, cargo_toml)?; + + let main_rs_path = path!(dir / "main.rs"); + crate::fs::write_if_needed(main_rs_path, "fn main() {}\n")?; + + let status = raw_cargo() + .envs(cargo_target_dir(project)) + .envs(rustflags::envs()) + .arg("-Zunstable-options") + .arg("check") + .args(target()) + .arg("--manifest-path") + .arg(manifest_path) + .arg("--keep-going") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status()?; + + Ok(status.success()) +} + pub fn build_dependencies(project: &Project) -> Result<()> { let workspace_cargo_lock = path!(project.workspace / "Cargo.lock"); if workspace_cargo_lock.exists() { diff --git a/src/fs.rs b/src/fs.rs new file mode 100644 index 0000000..375b3f7 --- /dev/null +++ b/src/fs.rs @@ -0,0 +1,18 @@ +use std::fs; +use std::io::Result; +use std::path::Path; + +pub fn write_if_needed(path: P, contents: C) -> Result<()> +where + P: AsRef, + C: AsRef<[u8]>, +{ + let path = path.as_ref(); + let contents = contents.as_ref(); + if let Ok(existing_contents) = fs::read(path) { + if existing_contents == contents { + return Ok(()); + } + } + fs::write(path, contents) +} diff --git a/src/lib.rs b/src/lib.rs index 8a3f77b..d6ac380 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -243,6 +243,7 @@ mod env; mod error; mod features; mod flock; +mod fs; mod manifest; mod message; mod normalize; diff --git a/src/run.rs b/src/run.rs index 084606b..1e87317 100644 --- a/src/run.rs +++ b/src/run.rs @@ -31,6 +31,8 @@ pub struct Project { pub workspace: Directory, pub path_dependencies: Vec, manifest: Manifest, + #[allow(dead_code)] + keep_going: bool, } #[derive(Debug)] @@ -137,7 +139,7 @@ impl Runner { enabled_features.retain(|feature| manifest.features.contains_key(feature)); } - Ok(Project { + let mut project = Project { dir: project_dir, source_dir, target_dir, @@ -149,7 +151,12 @@ impl Runner { workspace, path_dependencies, manifest, - }) + keep_going: false, + }; + + project.keep_going = cargo::supports_keep_going(&project).unwrap_or(false); + + Ok(project) } fn write(&self, project: &Project) -> Result<()> {