From d0bf9604ecd1c74f127b05bfb11b0ec8272b1ab3 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Fri, 22 Apr 2022 07:49:21 -0500 Subject: [PATCH] Allow running `cargo add foo` when a `foo.workspace = true` already exists --- src/cargo/ops/cargo_add/dependency.rs | 112 ++++++++++-- src/cargo/ops/cargo_add/mod.rs | 161 ++++++++++++------ .../Cargo.toml | 5 + .../dependency/Cargo.toml | 6 + .../dependency/src/lib.rs | 0 .../primary/Cargo.toml | 8 + .../primary/src/lib.rs | 0 .../Cargo.toml | 5 + .../dependency/Cargo.toml | 6 + .../primary/Cargo.toml | 8 + .../overwrite_inherit_features_noop.stderr | 3 + .../overwrite_inherit_features_noop.stdout | 0 .../add/overwrite_inherit_noop.in/Cargo.toml | 5 + .../dependency/Cargo.toml | 3 + .../dependency/src/lib.rs | 0 .../primary/Cargo.toml | 8 + .../primary/src/lib.rs | 0 .../add/overwrite_inherit_noop.out/Cargo.toml | 5 + .../dependency/Cargo.toml | 3 + .../primary/Cargo.toml | 8 + .../add/overwrite_inherit_noop.stderr | 1 + .../add/overwrite_inherit_noop.stdout | 0 .../Cargo.toml | 5 + .../dependency/Cargo.toml | 3 + .../dependency/src/lib.rs | 0 .../primary/Cargo.toml | 8 + .../primary/src/lib.rs | 0 .../Cargo.toml | 5 + .../dependency/Cargo.toml | 3 + .../primary/Cargo.toml | 8 + .../overwrite_inherit_optional_noop.stderr | 1 + .../overwrite_inherit_optional_noop.stdout | 0 tests/testsuite/cargo_add.rs | 68 ++++++++ 33 files changed, 387 insertions(+), 61 deletions(-) create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.in/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.in/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.in/primary/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.out/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.out/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.out/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.stderr create mode 100644 tests/snapshots/add/overwrite_inherit_features_noop.stdout create mode 100644 tests/snapshots/add/overwrite_inherit_noop.in/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.in/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.in/dependency/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_noop.in/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.in/primary/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_noop.out/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.out/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.out/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_noop.stderr create mode 100644 tests/snapshots/add/overwrite_inherit_noop.stdout create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.in/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/src/lib.rs create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.out/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.out/dependency/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.out/primary/Cargo.toml create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.stderr create mode 100644 tests/snapshots/add/overwrite_inherit_optional_noop.stdout diff --git a/src/cargo/ops/cargo_add/dependency.rs b/src/cargo/ops/cargo_add/dependency.rs index 23b3373fc2d..caf2314e025 100644 --- a/src/cargo/ops/cargo_add/dependency.rs +++ b/src/cargo/ops/cargo_add/dependency.rs @@ -1,4 +1,5 @@ use std::collections::BTreeMap; +use std::fmt::{Display, Formatter}; use std::path::{Path, PathBuf}; use indexmap::IndexSet; @@ -74,6 +75,7 @@ impl Dependency { Some(Source::Git(git)) => { git.version = None; } + Some(Source::Workspace(_workspace)) => {} None => {} } self @@ -161,6 +163,7 @@ impl Dependency { Source::Registry(src) => Some(src.version.as_str()), Source::Path(src) => src.version.as_deref(), Source::Git(src) => src.version.as_deref(), + Source::Workspace(_) => None, } } @@ -185,29 +188,47 @@ impl Dependency { } /// Get the SourceID for this dependency - pub fn source_id(&self, config: &Config) -> CargoResult { + pub fn source_id(&self, config: &Config) -> CargoResult> { match &self.source.as_ref() { Some(Source::Registry(_)) | None => { if let Some(r) = self.registry() { let source_id = SourceId::alt_registry(config, r)?; - Ok(source_id) + Ok(MaybeWorkspace::Other(source_id)) } else { let source_id = SourceId::crates_io(config)?; - Ok(source_id) + Ok(MaybeWorkspace::Other(source_id)) } } - Some(Source::Path(source)) => source.source_id(), - Some(Source::Git(source)) => source.source_id(), + Some(Source::Path(source)) => Ok(MaybeWorkspace::Other(source.source_id()?)), + Some(Source::Git(source)) => Ok(MaybeWorkspace::Other(source.source_id()?)), + Some(Source::Workspace(workspace)) => Ok(MaybeWorkspace::Workspace(workspace.clone())), } } /// Query to find this dependency - pub fn query(&self, config: &Config) -> CargoResult { + pub fn query( + &self, + config: &Config, + ) -> CargoResult> { let source_id = self.source_id(config)?; - crate::core::dependency::Dependency::parse(self.name.as_str(), self.version(), source_id) + match source_id { + MaybeWorkspace::Workspace(workspace) => Ok(MaybeWorkspace::Workspace(workspace)), + MaybeWorkspace::Other(source_id) => Ok(MaybeWorkspace::Other( + crate::core::dependency::Dependency::parse( + self.name.as_str(), + self.version(), + source_id, + )?, + )), + } } } +pub enum MaybeWorkspace { + Workspace(WorkspaceSource), + Other(T), +} + impl Dependency { /// Create a dependency from a TOML table entry pub fn from_toml(crate_root: &Path, key: &str, item: &toml_edit::Item) -> CargoResult { @@ -271,6 +292,15 @@ impl Dependency { invalid_type(key, "version", version.type_name(), "string") })?); src.into() + } else if let Some(workspace) = table.get("workspace") { + let workspace_bool = workspace.as_bool().ok_or_else(|| { + invalid_type(key, "workspace", workspace.type_name(), "bool") + })?; + if !workspace_bool { + anyhow::bail!("`{key}.workspace = false` is unsupported") + } + let src = WorkspaceSource::new(); + src.into() } else { anyhow::bail!("Unrecognized dependency source for `{key}`"); }; @@ -367,6 +397,12 @@ impl Dependency { None, None, ) => toml_edit::value(v), + (false, None, true, Some(Source::Workspace(WorkspaceSource {})), None, None) => { + let mut table = toml_edit::InlineTable::default(); + table.set_dotted(true); + table.insert("workspace", true.into()); + toml_edit::value(toml_edit::Value::InlineTable(table)) + } // Other cases are represented as an inline table (_, _, _, _, _, _) => { let mut table = toml_edit::InlineTable::default(); @@ -397,6 +433,9 @@ impl Dependency { table.insert("version", r.into()); } } + Some(Source::Workspace(_)) => { + table.insert("workspace", true.into()); + } None => {} } if table.contains_key("version") { @@ -436,7 +475,7 @@ impl Dependency { Some(Source::Registry(src)) => { table.insert("version", toml_edit::value(src.version.as_str())); - for key in ["path", "git", "branch", "tag", "rev"] { + for key in ["path", "git", "branch", "tag", "rev", "workspace"] { table.remove(key); } } @@ -449,7 +488,7 @@ impl Dependency { table.remove("version"); } - for key in ["git", "branch", "tag", "rev"] { + for key in ["git", "branch", "tag", "rev", "workspace"] { table.remove(key); } } @@ -476,7 +515,23 @@ impl Dependency { table.remove("version"); } - for key in ["path"] { + for key in ["path", "workspace"] { + table.remove(key); + } + } + Some(Source::Workspace(_)) => { + table.set_dotted(true); + for key in [ + "version", + "registry", + "registry-index", + "path", + "git", + "branch", + "tag", + "rev", + "package", + ] { table.remove(key); } } @@ -516,12 +571,14 @@ impl Dependency { .unwrap_or_default(); features.extend(new_features.iter().map(|s| s.as_str())); let features = toml_edit::value(features.into_iter().collect::()); + table.set_dotted(false); table.insert("features", features); } else { table.remove("features"); } match self.optional { Some(v) => { + table.set_dotted(false); table.insert("optional", toml_edit::value(v)); } None => { @@ -596,6 +653,8 @@ pub enum Source { Path(PathSource), /// Dependency from a git repo Git(GitSource), + /// Dependency from a workspace + Workspace(WorkspaceSource), } impl Source { @@ -624,6 +683,15 @@ impl Source { _ => None, } } + + /// Access the workspace source, if present + #[allow(dead_code)] + pub fn as_workspace(&self) -> Option<&WorkspaceSource> { + match self { + Self::Workspace(src) => Some(src), + _ => None, + } + } } impl std::fmt::Display for Source { @@ -632,6 +700,7 @@ impl std::fmt::Display for Source { Self::Registry(src) => src.fmt(f), Self::Path(src) => src.fmt(f), Self::Git(src) => src.fmt(f), + Self::Workspace(src) => src.fmt(f), } } } @@ -660,6 +729,12 @@ impl From for Source { } } +impl From for Source { + fn from(inner: WorkspaceSource) -> Self { + Self::Workspace(inner) + } +} + /// Dependency from a registry #[derive(Debug, Hash, PartialEq, Eq, Clone)] #[non_exhaustive] @@ -822,6 +897,23 @@ impl std::fmt::Display for GitSource { } } +/// Dependency from a workspace +#[derive(Debug, Hash, PartialEq, Eq, Clone)] +#[non_exhaustive] +pub struct WorkspaceSource; + +impl WorkspaceSource { + pub fn new() -> Self { + Self + } +} + +impl Display for WorkspaceSource { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + "workspace".fmt(f) + } +} + #[cfg(test)] mod tests { use std::path::Path; diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index 20cc26ece22..4033f1af1bb 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -4,6 +4,7 @@ mod crate_spec; mod dependency; mod manifest; +use anyhow::Context; use std::collections::BTreeSet; use std::collections::VecDeque; use std::path::Path; @@ -31,6 +32,7 @@ use dependency::RegistrySource; use dependency::Source; use manifest::LocalManifest; +use crate::ops::cargo_add::dependency::MaybeWorkspace; pub use manifest::DepTable; /// Information on what dependencies should be added @@ -313,7 +315,7 @@ fn resolve_dependency( dependency = dependency.clear_version(); } - dependency = populate_available_features(dependency, config, registry)?; + dependency = populate_available_features(dependency, config, registry, ws)?; Ok(dependency) } @@ -389,31 +391,40 @@ fn get_latest_dependency( registry: &mut PackageRegistry<'_>, ) -> CargoResult { let query = dependency.query(config)?; - let possibilities = loop { - let fuzzy = true; - match registry.query_vec(&query, fuzzy) { - std::task::Poll::Ready(res) => { - break res?; + match query { + MaybeWorkspace::Workspace(_) => { + unreachable!("registry dependencies required, found a workspace dependency"); + } + MaybeWorkspace::Other(query) => { + let possibilities = loop { + let fuzzy = true; + match registry.query_vec(&query, fuzzy) { + std::task::Poll::Ready(res) => { + break res?; + } + std::task::Poll::Pending => registry.block_until_ready()?, + } + }; + let latest = possibilities + .iter() + .max_by_key(|s| { + // Fallback to a pre-release if no official release is available by sorting them as + // less. + let stable = s.version().pre.is_empty(); + (stable, s.version()) + }) + .ok_or_else(|| { + anyhow::format_err!( + "the crate `{dependency}` could not be found in registry index." + ) + })?; + let mut dep = Dependency::from(latest); + if let Some(reg_name) = dependency.registry.as_deref() { + dep = dep.set_registry(reg_name); } - std::task::Poll::Pending => registry.block_until_ready()?, + Ok(dep) } - }; - let latest = possibilities - .iter() - .max_by_key(|s| { - // Fallback to a pre-release if no official release is available by sorting them as - // less. - let stable = s.version().pre.is_empty(); - (stable, s.version()) - }) - .ok_or_else(|| { - anyhow::format_err!("the crate `{dependency}` could not be found in registry index.") - })?; - let mut dep = Dependency::from(latest); - if let Some(reg_name) = dependency.registry.as_deref() { - dep = dep.set_registry(reg_name); } - Ok(dep) } fn select_package( @@ -422,36 +433,43 @@ fn select_package( registry: &mut PackageRegistry<'_>, ) -> CargoResult { let query = dependency.query(config)?; - let possibilities = loop { - let fuzzy = false; // Returns all for path/git - match registry.query_vec(&query, fuzzy) { - std::task::Poll::Ready(res) => { - break res?; - } - std::task::Poll::Pending => registry.block_until_ready()?, + match query { + MaybeWorkspace::Workspace(_) => { + unreachable!("path or git dependency expected, found workspace dependency"); } - }; - match possibilities.len() { - 0 => { - let source = dependency - .source() - .expect("source should be resolved before here"); - anyhow::bail!("the crate `{dependency}` could not be found at `{source}`") - } - 1 => { - let mut dep = Dependency::from(&possibilities[0]); - if let Some(reg_name) = dependency.registry.as_deref() { - dep = dep.set_registry(reg_name); + MaybeWorkspace::Other(query) => { + let possibilities = loop { + let fuzzy = false; // Returns all for path/git + match registry.query_vec(&query, fuzzy) { + std::task::Poll::Ready(res) => { + break res?; + } + std::task::Poll::Pending => registry.block_until_ready()?, + } + }; + match possibilities.len() { + 0 => { + let source = dependency + .source() + .expect("source should be resolved before here"); + anyhow::bail!("the crate `{dependency}` could not be found at `{source}`") + } + 1 => { + let mut dep = Dependency::from(&possibilities[0]); + if let Some(reg_name) = dependency.registry.as_deref() { + dep = dep.set_registry(reg_name); + } + Ok(dep) + } + _ => { + let source = dependency + .source() + .expect("source should be resolved before here"); + anyhow::bail!( + "unexpectedly found multiple copies of crate `{dependency}` at `{source}`" + ) + } } - Ok(dep) - } - _ => { - let source = dependency - .source() - .expect("source should be resolved before here"); - anyhow::bail!( - "unexpectedly found multiple copies of crate `{dependency}` at `{source}`" - ) } } } @@ -512,12 +530,50 @@ fn populate_available_features( mut dependency: Dependency, config: &Config, registry: &mut PackageRegistry<'_>, + ws: &Workspace<'_>, ) -> CargoResult { if !dependency.available_features.is_empty() { return Ok(dependency); } let query = dependency.query(config)?; + let query = match query { + MaybeWorkspace::Workspace(_workspace) => { + let manifest = LocalManifest::try_new(ws.root_manifest())?; + let manifest = manifest + .data + .as_item() + .as_table_like() + .context("could not make `manifest.data` into a table")?; + let workspace = manifest + .get("workspace") + .context("could not find `workspace`")? + .as_table_like() + .context("could not make `manifest.data.workspace` into a table")?; + let dependencies = workspace + .get("dependencies") + .context("could not find `dependencies` table in `workspace`")? + .as_table_like() + .context("could not make `dependencies` into a table")?; + let dep_item = dependencies.get(dependency.toml_key()).context(format!( + "could not find {} in `workspace.dependencies`", + dependency.toml_key() + ))?; + let dep = Dependency::from_toml( + ws.root_manifest().parent().unwrap(), + dependency.toml_key(), + dep_item, + )?; + let query = dep.query(config)?; + match query { + MaybeWorkspace::Workspace(_) => { + unreachable!("This should have been caught when parsing a workspace root") + } + MaybeWorkspace::Other(query) => query, + } + } + MaybeWorkspace::Other(query) => query, + }; let possibilities = loop { match registry.query_vec(&query, true) { std::task::Poll::Ready(res) => { @@ -567,6 +623,9 @@ fn print_msg(shell: &mut Shell, dep: &Dependency, section: &[String]) -> CargoRe Some(Source::Git(_)) => { write!(message, " (git)")?; } + Some(Source::Workspace(_)) => { + write!(message, " (workspace)")?; + } None => {} } write!(message, " to")?; diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.in/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.in/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/Cargo.toml new file mode 100644 index 00000000000..bed9320474a --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "foo" +version = "0.0.0" + +[features] +test = [] \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/src/lib.rs b/tests/snapshots/add/overwrite_inherit_features_noop.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.in/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.in/primary/Cargo.toml new file mode 100644 index 00000000000..7ab3f9dd2c1 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.in/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo = { workspace = true, features = ["test"] } \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.in/primary/src/lib.rs b/tests/snapshots/add/overwrite_inherit_features_noop.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.out/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.out/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.out/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.out/dependency/Cargo.toml new file mode 100644 index 00000000000..bed9320474a --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.out/dependency/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "foo" +version = "0.0.0" + +[features] +test = [] \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.out/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_features_noop.out/primary/Cargo.toml new file mode 100644 index 00000000000..0f91d71a3c8 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.out/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo = { workspace = true, features = ["test"] } diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.stderr b/tests/snapshots/add/overwrite_inherit_features_noop.stderr new file mode 100644 index 00000000000..0eee2e6bd46 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_features_noop.stderr @@ -0,0 +1,3 @@ + Adding foo (workspace) to dependencies. + Features: + + test diff --git a/tests/snapshots/add/overwrite_inherit_features_noop.stdout b/tests/snapshots/add/overwrite_inherit_features_noop.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_noop.in/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.in/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_noop.in/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.in/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.in/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/overwrite_inherit_noop.in/dependency/src/lib.rs b/tests/snapshots/add/overwrite_inherit_noop.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_noop.in/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.in/primary/Cargo.toml new file mode 100644 index 00000000000..aaadbceb163 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.in/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo.workspace = true \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_noop.in/primary/src/lib.rs b/tests/snapshots/add/overwrite_inherit_noop.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_noop.out/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.out/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_noop.out/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.out/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.out/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/overwrite_inherit_noop.out/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_noop.out/primary/Cargo.toml new file mode 100644 index 00000000000..c97da880af7 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.out/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo.workspace = true diff --git a/tests/snapshots/add/overwrite_inherit_noop.stderr b/tests/snapshots/add/overwrite_inherit_noop.stderr new file mode 100644 index 00000000000..d2efcc0c00c --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_noop.stderr @@ -0,0 +1 @@ + Adding foo (workspace) to dependencies. diff --git a/tests/snapshots/add/overwrite_inherit_noop.stdout b/tests/snapshots/add/overwrite_inherit_noop.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.in/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.in/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.in/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/src/lib.rs b/tests/snapshots/add/overwrite_inherit_optional_noop.in/dependency/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/Cargo.toml new file mode 100644 index 00000000000..ffb5719c788 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo = { workspace = true, optional = true } \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/src/lib.rs b/tests/snapshots/add/overwrite_inherit_optional_noop.in/primary/src/lib.rs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.out/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.out/Cargo.toml new file mode 100644 index 00000000000..24c50556bb5 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.out/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = ["primary", "dependency"] + +[workspace.dependencies] +foo = { version = "0.0.0", path = "./dependency"} \ No newline at end of file diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.out/dependency/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.out/dependency/Cargo.toml new file mode 100644 index 00000000000..2d247d4d26c --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.out/dependency/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "foo" +version = "0.0.0" diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.out/primary/Cargo.toml b/tests/snapshots/add/overwrite_inherit_optional_noop.out/primary/Cargo.toml new file mode 100644 index 00000000000..b3b1ccc5b11 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.out/primary/Cargo.toml @@ -0,0 +1,8 @@ +cargo-features = ["workspace-inheritance"] + +[package] +name = "bar" +version = "0.0.0" + +[dependencies] +foo = { workspace = true, optional = true } diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.stderr b/tests/snapshots/add/overwrite_inherit_optional_noop.stderr new file mode 100644 index 00000000000..da03b11f700 --- /dev/null +++ b/tests/snapshots/add/overwrite_inherit_optional_noop.stderr @@ -0,0 +1 @@ + Adding foo (workspace) to optional dependencies. diff --git a/tests/snapshots/add/overwrite_inherit_optional_noop.stdout b/tests/snapshots/add/overwrite_inherit_optional_noop.stdout new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_add.rs b/tests/testsuite/cargo_add.rs index 20a48ddbe3f..16c4d231947 100644 --- a/tests/testsuite/cargo_add.rs +++ b/tests/testsuite/cargo_add.rs @@ -1504,6 +1504,74 @@ fn overwrite_inline_features() { ); } +#[cargo_test] +fn overwrite_inherit_features_noop() { + init_registry(); + let project_root = + project_from_template("tests/snapshots/add/overwrite_inherit_features_noop.in"); + let cwd = &project_root; + + cargo_command() + .env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly") + .arg("add") + .args(["foo", "-p", "bar"]) + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path("tests/snapshots/add/overwrite_inherit_features_noop.stdout") + .stderr_matches_path("tests/snapshots/add/overwrite_inherit_features_noop.stderr"); + + assert().subset_matches( + "tests/snapshots/add/overwrite_inherit_features_noop.out", + &project_root, + ); +} + +#[cargo_test] +fn overwrite_inherit_noop() { + init_registry(); + let project_root = project_from_template("tests/snapshots/add/overwrite_inherit_noop.in"); + let cwd = &project_root; + + cargo_command() + .env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly") + .arg("add") + .args(["foo", "-p", "bar"]) + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path("tests/snapshots/add/overwrite_inherit_noop.stdout") + .stderr_matches_path("tests/snapshots/add/overwrite_inherit_noop.stderr"); + + assert().subset_matches( + "tests/snapshots/add/overwrite_inherit_noop.out", + &project_root, + ); +} + +#[cargo_test] +fn overwrite_inherit_optional_noop() { + init_registry(); + let project_root = + project_from_template("tests/snapshots/add/overwrite_inherit_optional_noop.in"); + let cwd = &project_root; + + cargo_command() + .env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly") + .arg("add") + .args(["foo", "-p", "bar"]) + .current_dir(cwd) + .assert() + .success() + .stdout_matches_path("tests/snapshots/add/overwrite_inherit_optional_noop.stdout") + .stderr_matches_path("tests/snapshots/add/overwrite_inherit_optional_noop.stderr"); + + assert().subset_matches( + "tests/snapshots/add/overwrite_inherit_optional_noop.out", + &project_root, + ); +} + #[cargo_test] fn overwrite_name_dev_noop() { init_alt_registry();