diff --git a/crates/cargo-util-schemas/src/core/source_kind.rs b/crates/cargo-util-schemas/src/core/source_kind.rs index 3794791114d..1c16a251371 100644 --- a/crates/cargo-util-schemas/src/core/source_kind.rs +++ b/crates/cargo-util-schemas/src/core/source_kind.rs @@ -15,6 +15,8 @@ pub enum SourceKind { LocalRegistry, /// A directory-based registry. Directory, + /// Package sources distributed with the rust toolchain + Builtin, } // The hash here is important for what folder packages get downloaded into. @@ -40,6 +42,7 @@ impl SourceKind { SourceKind::SparseRegistry => None, SourceKind::LocalRegistry => Some("local-registry"), SourceKind::Directory => Some("directory"), + SourceKind::Builtin => Some("builtin"), } } } @@ -71,6 +74,10 @@ impl Ord for SourceKind { (_, SourceKind::Directory) => Ordering::Greater, (SourceKind::Git(a), SourceKind::Git(b)) => a.cmp(b), + (SourceKind::Git(_), _) => Ordering::Less, + (_, SourceKind::Git(_)) => Ordering::Greater, + + (SourceKind::Builtin, SourceKind::Builtin) => Ordering::Equal, } } } diff --git a/src/workspace/parser/mod.rs b/src/workspace/parser/mod.rs index 0f862ac2ecc..52076921beb 100644 --- a/src/workspace/parser/mod.rs +++ b/src/workspace/parser/mod.rs @@ -2455,7 +2455,7 @@ fn to_dependency_source_id( if kind == Some(DepKind::Build) { bail!("builtin dependency `{name_in_toml}` cannot be used as a build dependency") } - todo!("SourceKind::Builtin"); + return SourceId::for_builtin(); } match ( diff --git a/src/workspace/source_id.rs b/src/workspace/source_id.rs index aaf736a69ae..e9f54ea1a7d 100644 --- a/src/workspace/source_id.rs +++ b/src/workspace/source_id.rs @@ -176,6 +176,7 @@ impl SourceId { let url = url.into_url()?; SourceId::new(SourceKind::Path, url, None) } + "builtin" => SourceId::for_builtin(), kind => Err(anyhow::format_err!("unsupported source protocol: {}", kind)), } } @@ -204,6 +205,12 @@ impl SourceId { SourceId::new(SourceKind::Path, url, None) } + /// Creates a `SourceId` for the builtin packages in the configured toolchain. + pub fn for_builtin() -> CargoResult { + let url = "builtin://".into_url()?; + SourceId::new(SourceKind::Builtin, url, None) + } + /// Creates a `SourceId` from a filesystem path. /// /// `path`: an absolute path. @@ -404,6 +411,7 @@ impl SourceId { } Ok(Box::new(PathSource::new(&path, self, gctx))) } + SourceKind::Builtin => todo!("builtin source"), SourceKind::Registry | SourceKind::SparseRegistry => { Ok(Box::new(RegistrySource::remote(self, gctx)?)) } @@ -664,6 +672,7 @@ impl fmt::Display for SourceId { Ok(()) } SourceKind::Path => write!(f, "{}", url_display(&self.inner.url)), + SourceKind::Builtin => write!(f, "builtin {}", url_display(&self.inner.url)), SourceKind::Registry | SourceKind::SparseRegistry => { write!(f, "registry `{}`", self.display_registry_name()) } @@ -846,6 +855,10 @@ mod tests { assert_data_eq!(gen_hash(source_id), str!["473480029881867801"].raw()); assert_data_eq!(short_hash(&source_id), str!["199e591d94239206"].raw()); + let source_id = SourceId::for_builtin().unwrap(); + assert_data_eq!(gen_hash(source_id), str!["8471877086995577839"].raw()); + assert_data_eq!(short_hash(&source_id), str!["ef7b241f53279275"].raw()); + let path = &ws_root.join("crate"); let source_id = SourceId::for_local_registry(path).unwrap(); #[cfg(not(windows))] diff --git a/tests/testsuite/builtin_dep.rs b/tests/testsuite/builtin_dep.rs index dd16c219241..806511263f0 100644 --- a/tests/testsuite/builtin_dep.rs +++ b/tests/testsuite/builtin_dep.rs @@ -27,7 +27,7 @@ fn builtin_dep_accepted() { .with_stderr_data(str![[r#" thread [..] panicked at [..] -not yet implemented: SourceKind::Builtin +not yet implemented: builtin source [NOTE] run with `RUST_BACKTRACE=1` environment variable to display a backtrace "#]])