Skip to content

Commit 489f93f

Browse files
committed
Auto merge of #13154 - epage:schema, r=weihanglo
refactor(schema): Remove reliance on cargo types ### What does this PR try to resolve? This is another step towards #12801. The only thing left is `validate_package_name` which I left out because I want to explore ways of handing that and don't want this commit blocked on it ### How should we test and review this PR? ### Additional information
2 parents a0339b0 + 808e2a1 commit 489f93f

File tree

14 files changed

+67
-78
lines changed

14 files changed

+67
-78
lines changed

crates/resolver-tests/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use cargo::core::{Dependency, PackageId, Registry, Summary};
1818
use cargo::core::{GitReference, SourceId};
1919
use cargo::sources::source::QueryKind;
2020
use cargo::sources::IndexSummary;
21-
use cargo::util::{CargoResult, Config, IntoUrl, RustVersion};
21+
use cargo::util::{CargoResult, Config, IntoUrl};
22+
use cargo::util_schemas::manifest::RustVersion;
2223

2324
use proptest::collection::{btree_map, vec};
2425
use proptest::prelude::*;

src/cargo/core/manifest.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use crate::core::{Dependency, PackageId, PackageIdSpec, SourceId, Summary};
1818
use crate::core::{Edition, Feature, Features, WorkspaceConfig};
1919
use crate::util::errors::*;
2020
use crate::util::interning::InternedString;
21-
use crate::util::{short_hash, Config, Filesystem, RustVersion};
21+
use crate::util::{short_hash, Config, Filesystem};
22+
use crate::util_schemas::manifest::RustVersion;
2223
use crate::util_schemas::manifest::{TomlManifest, TomlProfiles};
2324

2425
pub enum EitherManifest {

src/cargo/core/package.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ use crate::util::network::http::HttpTimeout;
3232
use crate::util::network::retry::{Retry, RetryResult};
3333
use crate::util::network::sleep::SleepTracker;
3434
use crate::util::toml::prepare_for_publish;
35-
use crate::util::RustVersion;
3635
use crate::util::{self, internal, Config, Progress, ProgressStyle};
36+
use crate::util_schemas::manifest::RustVersion;
3737

3838
pub const MANIFEST_PREAMBLE: &str = "\
3939
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO

src/cargo/core/resolver/version_prefs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::collections::{HashMap, HashSet};
66

77
use crate::core::{Dependency, PackageId, Summary};
88
use crate::util::interning::InternedString;
9-
use crate::util::RustVersion;
9+
use crate::util_schemas::manifest::RustVersion;
1010

1111
/// A collection of preferences for particular package versions.
1212
///

src/cargo/core/summary.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::core::{Dependency, PackageId, SourceId};
22
use crate::util::interning::InternedString;
33
use crate::util::CargoResult;
4-
use crate::util::RustVersion;
4+
use crate::util_schemas::manifest::RustVersion;
55
use anyhow::bail;
66
use semver::Version;
77
use std::collections::{BTreeMap, HashMap, HashSet};

src/cargo/core/workspace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ use crate::util::edit_distance;
2525
use crate::util::errors::{CargoResult, ManifestError};
2626
use crate::util::interning::InternedString;
2727
use crate::util::toml::{read_manifest, InheritableFields};
28-
use crate::util::RustVersion;
2928
use crate::util::{config::ConfigRelativePath, Config, Filesystem, IntoUrl};
29+
use crate::util_schemas::manifest::RustVersion;
3030
use crate::util_schemas::manifest::{TomlDependency, TomlProfiles};
3131
use cargo_util::paths;
3232
use cargo_util::paths::normalize_path;

src/cargo/ops/cargo_add/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::util::toml_mut::dependency::WorkspaceSource;
3535
use crate::util::toml_mut::is_sorted;
3636
use crate::util::toml_mut::manifest::DepTable;
3737
use crate::util::toml_mut::manifest::LocalManifest;
38-
use crate::util::RustVersion;
38+
use crate::util_schemas::manifest::RustVersion;
3939
use crate::CargoResult;
4040
use crate::Config;
4141
use crate_spec::CrateSpec;

src/cargo/ops/resolve.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ use crate::ops;
7171
use crate::sources::PathSource;
7272
use crate::util::cache_lock::CacheLockMode;
7373
use crate::util::errors::CargoResult;
74-
use crate::util::RustVersion;
7574
use crate::util::{profile, CanonicalUrl};
75+
use crate::util_schemas::manifest::RustVersion;
7676
use anyhow::Context as _;
7777
use std::collections::{HashMap, HashSet};
7878
use tracing::{debug, trace};

src/cargo/sources/registry/index.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ use crate::sources::registry::{LoadResponse, RegistryData};
9292
use crate::util::cache_lock::CacheLockMode;
9393
use crate::util::interning::InternedString;
9494
use crate::util::IntoUrl;
95-
use crate::util::{internal, CargoResult, Config, Filesystem, OptVersionReq, RustVersion};
95+
use crate::util::{internal, CargoResult, Config, Filesystem, OptVersionReq};
96+
use crate::util_schemas::manifest::RustVersion;
9697
use anyhow::bail;
9798
use cargo_util::{paths, registry::make_dep_path};
9899
use semver::Version;

src/cargo/util/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub use self::progress::{Progress, ProgressStyle};
2323
pub use self::queue::Queue;
2424
pub use self::restricted_names::validate_package_name;
2525
pub use self::rustc::Rustc;
26-
pub use self::semver_ext::{OptVersionReq, RustVersion};
26+
pub use self::semver_ext::OptVersionReq;
2727
pub use self::vcs::{existing_vcs_repo, FossilRepo, GitRepo, HgRepo, PijulRepo};
2828
pub use self::workspace::{
2929
add_path_args, path_args, print_available_benches, print_available_binaries,

src/cargo/util/semver_ext.rs

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use std::fmt::{self, Display};
22

33
use semver::{Op, Version, VersionReq};
4-
use serde_untagged::UntaggedEnumVisitor;
54

6-
use crate::util_semver::PartialVersion;
75
use crate::util_semver::VersionExt as _;
86

97
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
@@ -125,48 +123,3 @@ impl From<VersionReq> for OptVersionReq {
125123
OptVersionReq::Req(req)
126124
}
127125
}
128-
129-
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug, serde::Serialize)]
130-
#[serde(transparent)]
131-
pub struct RustVersion(PartialVersion);
132-
133-
impl std::ops::Deref for RustVersion {
134-
type Target = PartialVersion;
135-
136-
fn deref(&self) -> &Self::Target {
137-
&self.0
138-
}
139-
}
140-
141-
impl std::str::FromStr for RustVersion {
142-
type Err = anyhow::Error;
143-
144-
fn from_str(value: &str) -> Result<Self, Self::Err> {
145-
let partial = value.parse::<PartialVersion>()?;
146-
if partial.pre.is_some() {
147-
anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"")
148-
}
149-
if partial.build.is_some() {
150-
anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"")
151-
}
152-
Ok(Self(partial))
153-
}
154-
}
155-
156-
impl<'de> serde::Deserialize<'de> for RustVersion {
157-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
158-
where
159-
D: serde::Deserializer<'de>,
160-
{
161-
UntaggedEnumVisitor::new()
162-
.expecting("SemVer version")
163-
.string(|value| value.parse().map_err(serde::de::Error::custom))
164-
.deserialize(deserializer)
165-
}
166-
}
167-
168-
impl Display for RustVersion {
169-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
170-
self.0.fmt(f)
171-
}
172-
}

src/cargo/util/toml/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ use crate::util::interning::InternedString;
2626
use crate::util::restricted_names;
2727
use crate::util::{
2828
self, config::ConfigRelativePath, validate_package_name, Config, IntoUrl, OptVersionReq,
29-
RustVersion,
3029
};
3130
use crate::util_schemas::manifest;
31+
use crate::util_schemas::manifest::RustVersion;
3232

3333
mod embedded;
3434
mod targets;

src/cargo/util_schemas/core/package_id_spec.rs

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
use std::fmt;
22

33
use anyhow::bail;
4+
use anyhow::Result;
45
use semver::Version;
56
use serde::{de, ser};
67
use url::Url;
78

8-
use crate::core::GitReference;
9-
use crate::core::PackageId;
10-
use crate::core::SourceKind;
11-
use crate::util::errors::CargoResult;
12-
use crate::util::{validate_package_name, IntoUrl};
9+
use crate::util::validate_package_name;
10+
use crate::util_schemas::core::GitReference;
11+
use crate::util_schemas::core::SourceKind;
1312
use crate::util_semver::PartialVersion;
1413

1514
/// Some or all of the data required to identify a package:
@@ -74,9 +73,9 @@ impl PackageIdSpec {
7473
/// for spec in specs {
7574
/// assert!(PackageIdSpec::parse(spec).is_ok());
7675
/// }
77-
pub fn parse(spec: &str) -> CargoResult<PackageIdSpec> {
76+
pub fn parse(spec: &str) -> Result<PackageIdSpec> {
7877
if spec.contains("://") {
79-
if let Ok(url) = spec.into_url() {
78+
if let Ok(url) = Url::parse(spec) {
8079
return PackageIdSpec::from_url(url);
8180
}
8281
} else if spec.contains('/') || spec.contains('\\') {
@@ -107,19 +106,8 @@ impl PackageIdSpec {
107106
})
108107
}
109108

110-
/// Convert a `PackageId` to a `PackageIdSpec`, which will have both the `PartialVersion` and `Url`
111-
/// fields filled in.
112-
pub fn from_package_id(package_id: PackageId) -> PackageIdSpec {
113-
PackageIdSpec {
114-
name: String::from(package_id.name().as_str()),
115-
version: Some(package_id.version().clone().into()),
116-
url: Some(package_id.source_id().url().clone()),
117-
kind: Some(package_id.source_id().kind().clone()),
118-
}
119-
}
120-
121109
/// Tries to convert a valid `Url` to a `PackageIdSpec`.
122-
fn from_url(mut url: Url) -> CargoResult<PackageIdSpec> {
110+
fn from_url(mut url: Url) -> Result<PackageIdSpec> {
123111
let mut kind = None;
124112
if let Some((kind_str, scheme)) = url.scheme().split_once('+') {
125113
match kind_str {

src/cargo/util_schemas/manifest.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use serde::ser;
1515
use serde::{Deserialize, Serialize};
1616
use serde_untagged::UntaggedEnumVisitor;
1717

18-
use crate::util::RustVersion;
1918
use crate::util_schemas::core::PackageIdSpec;
19+
use crate::util_semver::PartialVersion;
2020

2121
/// This type is used to deserialize `Cargo.toml` files.
2222
#[derive(Debug, Deserialize, Serialize)]
@@ -1208,6 +1208,51 @@ pub enum TomlLintLevel {
12081208
Allow,
12091209
}
12101210

1211+
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug, serde::Serialize)]
1212+
#[serde(transparent)]
1213+
pub struct RustVersion(PartialVersion);
1214+
1215+
impl std::ops::Deref for RustVersion {
1216+
type Target = PartialVersion;
1217+
1218+
fn deref(&self) -> &Self::Target {
1219+
&self.0
1220+
}
1221+
}
1222+
1223+
impl std::str::FromStr for RustVersion {
1224+
type Err = anyhow::Error;
1225+
1226+
fn from_str(value: &str) -> Result<Self, Self::Err> {
1227+
let partial = value.parse::<PartialVersion>()?;
1228+
if partial.pre.is_some() {
1229+
anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"")
1230+
}
1231+
if partial.build.is_some() {
1232+
anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"")
1233+
}
1234+
Ok(Self(partial))
1235+
}
1236+
}
1237+
1238+
impl<'de> serde::Deserialize<'de> for RustVersion {
1239+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1240+
where
1241+
D: serde::Deserializer<'de>,
1242+
{
1243+
UntaggedEnumVisitor::new()
1244+
.expecting("SemVer version")
1245+
.string(|value| value.parse().map_err(serde::de::Error::custom))
1246+
.deserialize(deserializer)
1247+
}
1248+
}
1249+
1250+
impl Display for RustVersion {
1251+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1252+
self.0.fmt(f)
1253+
}
1254+
}
1255+
12111256
#[derive(Copy, Clone, Debug)]
12121257
pub struct InvalidCargoFeatures {}
12131258

0 commit comments

Comments
 (0)