diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-03-31 13:45:39 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-31 13:45:39 +0100 |
commit | d63bb8565e129f51fadf6a036683b1eedefb78dd (patch) | |
tree | 85194d956ce16ef5113c7b08e1d09ec6795ddee1 /crates/ra_project_model/src | |
parent | a932ccd53da3d2179e5e36ae4fbcbf82f3e0bd25 (diff) | |
parent | 331d1db3174853a435991c9341367c235e89eca4 (diff) |
Merge #3781
3781: Add crate versions when running cargo -p commands. r=matklad a=o0Ignition0o
If someone (unfortunately) creates a project that happens to have the same name as one of its (future) dependencies, there is [a way for them to change the dependency's alias in the Cargo.toml file](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#renaming-dependencies-in-cargotoml), to mitigate the name conflict. Unfortunately cargo -p commands don't seem to pick it up, which seems to put rust-analyzer run commands in a tough situation:
```
> Executing task: cargo test --package config --example default -- tests --nocapture <
error: There are multiple `config` packages in your project, and the specification `config` is ambiguous.
Please re-run this command with `-p <spec>` where `<spec>` is one of the following:
config:0.1.0
config:0.9.3
The terminal process terminated with exit code: 101
```
cargo suggests us to be more specific and refer to a package by its name and version, which this PR achieves.
I passed the version as a String because I don't really understand how the ra_db types work, but I would love to switch it to [a fully fledged Version type](https://steveklabnik.github.io/semver/semver/index.html) if you guide me towards that :)
Co-authored-by: o0Ignition0o <[email protected]>
Diffstat (limited to 'crates/ra_project_model/src')
-rw-r--r-- | crates/ra_project_model/src/cargo_workspace.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 291594e2a..738fd6f61 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs | |||
@@ -75,6 +75,7 @@ pub type Target = Idx<TargetData>; | |||
75 | 75 | ||
76 | #[derive(Debug, Clone)] | 76 | #[derive(Debug, Clone)] |
77 | pub struct PackageData { | 77 | pub struct PackageData { |
78 | pub id: String, | ||
78 | pub name: String, | 79 | pub name: String, |
79 | pub manifest: PathBuf, | 80 | pub manifest: PathBuf, |
80 | pub targets: Vec<Target>, | 81 | pub targets: Vec<Target>, |
@@ -180,6 +181,7 @@ impl CargoWorkspace { | |||
180 | .with_context(|| format!("Failed to parse edition {}", edition))?; | 181 | .with_context(|| format!("Failed to parse edition {}", edition))?; |
181 | let pkg = packages.alloc(PackageData { | 182 | let pkg = packages.alloc(PackageData { |
182 | name, | 183 | name, |
184 | id: id.to_string(), | ||
183 | manifest: manifest_path, | 185 | manifest: manifest_path, |
184 | targets: Vec::new(), | 186 | targets: Vec::new(), |
185 | is_member, | 187 | is_member, |
@@ -249,6 +251,18 @@ impl CargoWorkspace { | |||
249 | pub fn workspace_root(&self) -> &Path { | 251 | pub fn workspace_root(&self) -> &Path { |
250 | &self.workspace_root | 252 | &self.workspace_root |
251 | } | 253 | } |
254 | |||
255 | pub fn package_flag(&self, package: &PackageData) -> String { | ||
256 | if self.is_unique(&*package.name) { | ||
257 | package.name.clone() | ||
258 | } else { | ||
259 | package.id.clone() | ||
260 | } | ||
261 | } | ||
262 | |||
263 | fn is_unique(&self, name: &str) -> bool { | ||
264 | self.packages.iter().filter(|(_, v)| v.name == name).count() == 1 | ||
265 | } | ||
252 | } | 266 | } |
253 | 267 | ||
254 | #[derive(Debug, Clone, Default)] | 268 | #[derive(Debug, Clone, Default)] |