diff --git a/src/main.rs b/src/main.rs index f9ae3c2..68032a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -115,6 +115,9 @@ pub struct Cook { /// Path to Cargo.toml #[arg(long)] manifest_path: Option, + /// Manifest(s) that should not be overwritten or have their artifacts cleaned up. + #[arg(long)] + ignore_manifest: Option>, /// Package(s) to build (see `cargo help pkgid`) #[arg(long, short = 'p')] package: Option>, @@ -183,6 +186,7 @@ fn _main() -> Result<(), anyhow::Error> { examples, all_targets, manifest_path, + ignore_manifest, package, workspace, offline, @@ -284,6 +288,7 @@ fn _main() -> Result<(), anyhow::Error> { target_dir, target_args, manifest_path, + ignore_manifest, package, workspace, offline, diff --git a/src/recipe.rs b/src/recipe.rs index 1f26f76..52f2ce2 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -36,6 +36,7 @@ pub struct CookArgs { pub target_dir: Option, pub target_args: TargetArgs, pub manifest_path: Option, + pub ignore_manifest: Option>, pub package: Option>, pub workspace: bool, pub offline: bool, @@ -57,8 +58,16 @@ impl Recipe { pub fn cook(&self, args: CookArgs) -> Result<(), anyhow::Error> { let current_directory = std::env::current_dir()?; + let ignored_manifests = args + .ignore_manifest + .as_deref() + .unwrap_or(&[]) + .iter() + .map(|p| current_directory.join(p)) + .collect::>(); + self.skeleton - .build_minimum_project(¤t_directory, args.no_std)?; + .build_minimum_project(¤t_directory, args.no_std, &ignored_manifests)?; if args.no_build { return Ok(()); } @@ -69,6 +78,7 @@ impl Recipe { args.profile, args.target, args.target_dir, + &ignored_manifests, ) .context("Failed to clean up dummy compilation artifacts.")?; Ok(()) @@ -106,6 +116,7 @@ fn build_dependencies(args: &CookArgs) { target_dir, target_args, manifest_path, + ignore_manifest: _ignore_manifest, package, workspace, offline, diff --git a/src/skeleton/mod.rs b/src/skeleton/mod.rs index f24c515..d4a0ddf 100644 --- a/src/skeleton/mod.rs +++ b/src/skeleton/mod.rs @@ -86,6 +86,7 @@ impl Skeleton { &self, base_path: &Path, no_std: bool, + ignored_manifests: &[PathBuf], ) -> Result<(), anyhow::Error> { // Save lockfile to disk, if available if let Some(lock_file) = &self.lock_file { @@ -146,8 +147,12 @@ fn panic(_: &core::panic::PanicInfo) -> ! { // Save all manifests to disks for manifest in &self.manifests { - // Persist manifest let manifest_path = base_path.join(&manifest.relative_path); + if ignored_manifests.contains(&manifest_path) { + continue; + } + + // Persist manifest let parent_directory = if let Some(parent_directory) = manifest_path.parent() { fs::create_dir_all(parent_directory)?; parent_directory.to_path_buf() @@ -211,6 +216,7 @@ fn panic(_: &core::panic::PanicInfo) -> ! { profile: OptimisationProfile, target: Option>, target_dir: Option, + ignored_paths: &[PathBuf], ) -> Result<(), anyhow::Error> { let target_dir = match target_dir { None => base_path.as_ref().join("target"), @@ -243,6 +249,11 @@ fn panic(_: &core::panic::PanicInfo) -> ! { .collect(); for manifest in &self.manifests { + let manifest_path = base_path.as_ref().join(&manifest.relative_path); + if ignored_paths.contains(&manifest_path) { + continue; + } + let parsed_manifest = cargo_manifest::Manifest::from_slice(manifest.contents.as_bytes())?; if let Some(package) = parsed_manifest.package.as_ref() { diff --git a/tests/skeletons.rs b/tests/skeletons.rs index 07052bc..d2d919e 100644 --- a/tests/skeletons.rs +++ b/tests/skeletons.rs @@ -34,7 +34,7 @@ path = "src/main.rs" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -53,7 +53,7 @@ path = "src/main.rs" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), true) + .build_minimum_project(cook_directory.path(), true, &[]) .unwrap(); // Assert (no_std) @@ -126,7 +126,7 @@ uuid = { version = "=0.8.0", features = ["v4"] } let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -148,7 +148,7 @@ uuid = { version = "=0.8.0", features = ["v4"] } let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), true) + .build_minimum_project(cook_directory.path(), true, &[]) .unwrap(); // Assert (no_std) @@ -202,7 +202,7 @@ harness = false let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -240,7 +240,7 @@ name = "foo" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -253,7 +253,7 @@ name = "foo" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), true) + .build_minimum_project(cook_directory.path(), true, &[]) .unwrap(); // Assert (no_std) @@ -303,7 +303,7 @@ harness = false let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); cook_directory @@ -335,7 +335,7 @@ name = "foo" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -351,7 +351,7 @@ name = "foo" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), true) + .build_minimum_project(cook_directory.path(), true, &[]) .unwrap(); // Assert (no_std) @@ -431,7 +431,7 @@ edition = "2018" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -469,7 +469,7 @@ edition = "2018" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -512,7 +512,7 @@ version = "1.2.3" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -615,7 +615,7 @@ dependencies = [ let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -797,7 +797,7 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -965,7 +965,7 @@ checksum = "3df10e9ed85b51fa3434bc5676eaa90479ce14ac3e101c8ce07e1bb5ef0b7255" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -1255,7 +1255,7 @@ anyhow = { workspace = true } let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); let first = skeleton.manifests[0].clone(); @@ -1468,7 +1468,7 @@ edition = "2021" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert @@ -1515,7 +1515,7 @@ channel = "1.75.0" let skeleton = Skeleton::derive(project.path(), None).unwrap(); let cook_directory = TempDir::new().unwrap(); skeleton - .build_minimum_project(cook_directory.path(), false) + .build_minimum_project(cook_directory.path(), false, &[]) .unwrap(); // Assert