diff --git a/crates/resolver-tests/src/lib.rs b/crates/resolver-tests/src/lib.rs index c24fdbce6e5..2df7a36bb09 100644 --- a/crates/resolver-tests/src/lib.rs +++ b/crates/resolver-tests/src/lib.rs @@ -18,7 +18,8 @@ use cargo::core::{Dependency, PackageId, Registry, Summary}; use cargo::core::{GitReference, SourceId}; use cargo::sources::source::QueryKind; use cargo::sources::IndexSummary; -use cargo::util::{CargoResult, Config, IntoUrl, RustVersion}; +use cargo::util::{CargoResult, Config, IntoUrl}; +use cargo::util_schemas::manifest::RustVersion; use proptest::collection::{btree_map, vec}; use proptest::prelude::*; diff --git a/src/cargo/core/manifest.rs b/src/cargo/core/manifest.rs index 54c724c23de..0468caa9627 100644 --- a/src/cargo/core/manifest.rs +++ b/src/cargo/core/manifest.rs @@ -18,7 +18,8 @@ use crate::core::{Dependency, PackageId, PackageIdSpec, SourceId, Summary}; use crate::core::{Edition, Feature, Features, WorkspaceConfig}; use crate::util::errors::*; use crate::util::interning::InternedString; -use crate::util::{short_hash, Config, Filesystem, RustVersion}; +use crate::util::{short_hash, Config, Filesystem}; +use crate::util_schemas::manifest::RustVersion; use crate::util_schemas::manifest::{TomlManifest, TomlProfiles}; pub enum EitherManifest { diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 7a4f5e07037..08254488283 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -32,8 +32,8 @@ use crate::util::network::http::HttpTimeout; use crate::util::network::retry::{Retry, RetryResult}; use crate::util::network::sleep::SleepTracker; use crate::util::toml::prepare_for_publish; -use crate::util::RustVersion; use crate::util::{self, internal, Config, Progress, ProgressStyle}; +use crate::util_schemas::manifest::RustVersion; pub const MANIFEST_PREAMBLE: &str = "\ # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO diff --git a/src/cargo/core/resolver/version_prefs.rs b/src/cargo/core/resolver/version_prefs.rs index 43159936ab0..1e4eacb591f 100644 --- a/src/cargo/core/resolver/version_prefs.rs +++ b/src/cargo/core/resolver/version_prefs.rs @@ -6,7 +6,7 @@ use std::collections::{HashMap, HashSet}; use crate::core::{Dependency, PackageId, Summary}; use crate::util::interning::InternedString; -use crate::util::RustVersion; +use crate::util_schemas::manifest::RustVersion; /// A collection of preferences for particular package versions. /// diff --git a/src/cargo/core/summary.rs b/src/cargo/core/summary.rs index cca9325fa20..8dfdf0dbfb4 100644 --- a/src/cargo/core/summary.rs +++ b/src/cargo/core/summary.rs @@ -1,7 +1,7 @@ use crate::core::{Dependency, PackageId, SourceId}; use crate::util::interning::InternedString; use crate::util::CargoResult; -use crate::util::RustVersion; +use crate::util_schemas::manifest::RustVersion; use anyhow::bail; use semver::Version; use std::collections::{BTreeMap, HashMap, HashSet}; diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index a47d994cff1..b933c61731d 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -25,8 +25,8 @@ use crate::util::edit_distance; use crate::util::errors::{CargoResult, ManifestError}; use crate::util::interning::InternedString; use crate::util::toml::{read_manifest, InheritableFields}; -use crate::util::RustVersion; use crate::util::{config::ConfigRelativePath, Config, Filesystem, IntoUrl}; +use crate::util_schemas::manifest::RustVersion; use crate::util_schemas::manifest::{TomlDependency, TomlProfiles}; use cargo_util::paths; use cargo_util::paths::normalize_path; diff --git a/src/cargo/ops/cargo_add/mod.rs b/src/cargo/ops/cargo_add/mod.rs index eb7e446c1d4..9be290b4818 100644 --- a/src/cargo/ops/cargo_add/mod.rs +++ b/src/cargo/ops/cargo_add/mod.rs @@ -35,7 +35,7 @@ use crate::util::toml_mut::dependency::WorkspaceSource; use crate::util::toml_mut::is_sorted; use crate::util::toml_mut::manifest::DepTable; use crate::util::toml_mut::manifest::LocalManifest; -use crate::util::RustVersion; +use crate::util_schemas::manifest::RustVersion; use crate::CargoResult; use crate::Config; use crate_spec::CrateSpec; diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 06716a2b4cf..5421d05724b 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -71,8 +71,8 @@ use crate::ops; use crate::sources::PathSource; use crate::util::cache_lock::CacheLockMode; use crate::util::errors::CargoResult; -use crate::util::RustVersion; use crate::util::{profile, CanonicalUrl}; +use crate::util_schemas::manifest::RustVersion; use anyhow::Context as _; use std::collections::{HashMap, HashSet}; use tracing::{debug, trace}; diff --git a/src/cargo/sources/registry/index.rs b/src/cargo/sources/registry/index.rs index 39ead2f5659..aed8fc813b5 100644 --- a/src/cargo/sources/registry/index.rs +++ b/src/cargo/sources/registry/index.rs @@ -92,7 +92,8 @@ use crate::sources::registry::{LoadResponse, RegistryData}; use crate::util::cache_lock::CacheLockMode; use crate::util::interning::InternedString; use crate::util::IntoUrl; -use crate::util::{internal, CargoResult, Config, Filesystem, OptVersionReq, RustVersion}; +use crate::util::{internal, CargoResult, Config, Filesystem, OptVersionReq}; +use crate::util_schemas::manifest::RustVersion; use anyhow::bail; use cargo_util::{paths, registry::make_dep_path}; use semver::Version; diff --git a/src/cargo/util/mod.rs b/src/cargo/util/mod.rs index 7829592945c..16c15770fe4 100644 --- a/src/cargo/util/mod.rs +++ b/src/cargo/util/mod.rs @@ -23,7 +23,7 @@ pub use self::progress::{Progress, ProgressStyle}; pub use self::queue::Queue; pub use self::restricted_names::validate_package_name; pub use self::rustc::Rustc; -pub use self::semver_ext::{OptVersionReq, RustVersion}; +pub use self::semver_ext::OptVersionReq; pub use self::vcs::{existing_vcs_repo, FossilRepo, GitRepo, HgRepo, PijulRepo}; pub use self::workspace::{ add_path_args, path_args, print_available_benches, print_available_binaries, diff --git a/src/cargo/util/semver_ext.rs b/src/cargo/util/semver_ext.rs index 561cf140ed6..854fab6c8a2 100644 --- a/src/cargo/util/semver_ext.rs +++ b/src/cargo/util/semver_ext.rs @@ -1,9 +1,7 @@ use std::fmt::{self, Display}; use semver::{Op, Version, VersionReq}; -use serde_untagged::UntaggedEnumVisitor; -use crate::util_semver::PartialVersion; use crate::util_semver::VersionExt as _; #[derive(PartialEq, Eq, Hash, Clone, Debug)] @@ -125,48 +123,3 @@ impl From for OptVersionReq { OptVersionReq::Req(req) } } - -#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug, serde::Serialize)] -#[serde(transparent)] -pub struct RustVersion(PartialVersion); - -impl std::ops::Deref for RustVersion { - type Target = PartialVersion; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl std::str::FromStr for RustVersion { - type Err = anyhow::Error; - - fn from_str(value: &str) -> Result { - let partial = value.parse::()?; - if partial.pre.is_some() { - anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"") - } - if partial.build.is_some() { - anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"") - } - Ok(Self(partial)) - } -} - -impl<'de> serde::Deserialize<'de> for RustVersion { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - UntaggedEnumVisitor::new() - .expecting("SemVer version") - .string(|value| value.parse().map_err(serde::de::Error::custom)) - .deserialize(deserializer) - } -} - -impl Display for RustVersion { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 8933b814161..6824cb5f5c7 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -26,9 +26,9 @@ use crate::util::interning::InternedString; use crate::util::restricted_names; use crate::util::{ self, config::ConfigRelativePath, validate_package_name, Config, IntoUrl, OptVersionReq, - RustVersion, }; use crate::util_schemas::manifest; +use crate::util_schemas::manifest::RustVersion; mod embedded; mod targets; diff --git a/src/cargo/util_schemas/core/package_id_spec.rs b/src/cargo/util_schemas/core/package_id_spec.rs index cc3f70ff852..90f26a03660 100644 --- a/src/cargo/util_schemas/core/package_id_spec.rs +++ b/src/cargo/util_schemas/core/package_id_spec.rs @@ -1,15 +1,14 @@ use std::fmt; use anyhow::bail; +use anyhow::Result; use semver::Version; use serde::{de, ser}; use url::Url; -use crate::core::GitReference; -use crate::core::PackageId; -use crate::core::SourceKind; -use crate::util::errors::CargoResult; -use crate::util::{validate_package_name, IntoUrl}; +use crate::util::validate_package_name; +use crate::util_schemas::core::GitReference; +use crate::util_schemas::core::SourceKind; use crate::util_semver::PartialVersion; /// Some or all of the data required to identify a package: @@ -74,9 +73,9 @@ impl PackageIdSpec { /// for spec in specs { /// assert!(PackageIdSpec::parse(spec).is_ok()); /// } - pub fn parse(spec: &str) -> CargoResult { + pub fn parse(spec: &str) -> Result { if spec.contains("://") { - if let Ok(url) = spec.into_url() { + if let Ok(url) = Url::parse(spec) { return PackageIdSpec::from_url(url); } } else if spec.contains('/') || spec.contains('\\') { @@ -107,19 +106,8 @@ impl PackageIdSpec { }) } - /// Convert a `PackageId` to a `PackageIdSpec`, which will have both the `PartialVersion` and `Url` - /// fields filled in. - pub fn from_package_id(package_id: PackageId) -> PackageIdSpec { - PackageIdSpec { - name: String::from(package_id.name().as_str()), - version: Some(package_id.version().clone().into()), - url: Some(package_id.source_id().url().clone()), - kind: Some(package_id.source_id().kind().clone()), - } - } - /// Tries to convert a valid `Url` to a `PackageIdSpec`. - fn from_url(mut url: Url) -> CargoResult { + fn from_url(mut url: Url) -> Result { let mut kind = None; if let Some((kind_str, scheme)) = url.scheme().split_once('+') { match kind_str { diff --git a/src/cargo/util_schemas/manifest.rs b/src/cargo/util_schemas/manifest.rs index 21777e60eff..b0aa6393f6f 100644 --- a/src/cargo/util_schemas/manifest.rs +++ b/src/cargo/util_schemas/manifest.rs @@ -15,8 +15,8 @@ use serde::ser; use serde::{Deserialize, Serialize}; use serde_untagged::UntaggedEnumVisitor; -use crate::util::RustVersion; use crate::util_schemas::core::PackageIdSpec; +use crate::util_semver::PartialVersion; /// This type is used to deserialize `Cargo.toml` files. #[derive(Debug, Deserialize, Serialize)] @@ -1208,6 +1208,51 @@ pub enum TomlLintLevel { Allow, } +#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug, serde::Serialize)] +#[serde(transparent)] +pub struct RustVersion(PartialVersion); + +impl std::ops::Deref for RustVersion { + type Target = PartialVersion; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::str::FromStr for RustVersion { + type Err = anyhow::Error; + + fn from_str(value: &str) -> Result { + let partial = value.parse::()?; + if partial.pre.is_some() { + anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"") + } + if partial.build.is_some() { + anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"") + } + Ok(Self(partial)) + } +} + +impl<'de> serde::Deserialize<'de> for RustVersion { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + UntaggedEnumVisitor::new() + .expecting("SemVer version") + .string(|value| value.parse().map_err(serde::de::Error::custom)) + .deserialize(deserializer) + } +} + +impl Display for RustVersion { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + #[derive(Copy, Clone, Debug)] pub struct InvalidCargoFeatures {}