Skip to content

Commit ec80a20

Browse files
committed
migrate to cargo_metadata crate & and its structs
1 parent 868273b commit ec80a20

File tree

17 files changed

+320
-325
lines changed

17 files changed

+320
-325
lines changed

Cargo.lock

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ aws-sdk-cloudfront = "1.3.0"
7676
aws-smithy-types-convert = { version = "0.60.0", features = ["convert-chrono"] }
7777
http = "1.0.0"
7878
uuid = { version = "1.1.2", features = ["v4"]}
79+
cargo_metadata = { version = "0.23.0", features = ["builder"] }
7980

8081
# Data serialization and deserialization
8182
serde = { version = "1.0", features = ["derive"] }

src/db/add_package.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
error::Result,
88
registry_api::{CrateData, CrateOwner, ReleaseData},
99
storage::CompressionAlgorithm,
10-
utils::{MetadataPackage, rustc_version::parse_rustc_date},
10+
utils::{cargo_metadata::PackageExt, rustc_version::parse_rustc_date},
1111
web::crate_details::{latest_release, releases_for_crate},
1212
};
1313
use anyhow::{Context, anyhow};
@@ -34,7 +34,7 @@ pub(crate) async fn finish_release(
3434
conn: &mut sqlx::PgConnection,
3535
crate_id: CrateId,
3636
release_id: ReleaseId,
37-
metadata_pkg: &MetadataPackage,
37+
metadata_pkg: &cargo_metadata::Package,
3838
source_dir: &Path,
3939
default_target: &str,
4040
source_files: Value,
@@ -388,7 +388,7 @@ pub(crate) async fn initialize_build(
388388
}
389389

390390
/// Reads features and converts them to Vec<Feature> with default being first
391-
fn get_features(pkg: &MetadataPackage) -> Vec<Feature> {
391+
fn get_features(pkg: &cargo_metadata::Package) -> Vec<Feature> {
392392
let mut features = Vec::with_capacity(pkg.features.len());
393393
if let Some(subfeatures) = pkg.features.get("default") {
394394
features.push(Feature::new("default".into(), subfeatures.clone()));
@@ -403,8 +403,8 @@ fn get_features(pkg: &MetadataPackage) -> Vec<Feature> {
403403
}
404404

405405
/// Reads readme if there is any read defined in Cargo.toml of a Package
406-
fn get_readme(pkg: &MetadataPackage, source_dir: &Path) -> Result<Option<String>> {
407-
let readme_path = source_dir.join(pkg.readme.as_deref().unwrap_or("README.md"));
406+
fn get_readme(pkg: &cargo_metadata::Package, source_dir: &Path) -> Result<Option<String>> {
407+
let readme_path = source_dir.join(pkg.readme.as_deref().unwrap_or("README.md".into()));
408408

409409
if !readme_path.exists() {
410410
return Ok(None);
@@ -424,8 +424,8 @@ fn get_readme(pkg: &MetadataPackage, source_dir: &Path) -> Result<Option<String>
424424
}
425425
}
426426

427-
fn get_rustdoc(pkg: &MetadataPackage, source_dir: &Path) -> Result<Option<String>> {
428-
if let Some(src_path) = &pkg.targets.first().and_then(|t| t.src_path.as_ref()) {
427+
fn get_rustdoc(pkg: &cargo_metadata::Package, source_dir: &Path) -> Result<Option<String>> {
428+
if let Some(src_path) = &pkg.targets.first().map(|t| &t.src_path) {
429429
let src_path = Path::new(src_path);
430430
if src_path.is_absolute() {
431431
read_rust_doc(src_path)
@@ -473,7 +473,7 @@ fn read_rust_doc(file_path: &Path) -> Result<Option<String>> {
473473
/// Adds keywords into database
474474
async fn add_keywords_into_database(
475475
conn: &mut sqlx::PgConnection,
476-
pkg: &MetadataPackage,
476+
pkg: &cargo_metadata::Package,
477477
release_id: ReleaseId,
478478
) -> Result<()> {
479479
let wanted_keywords: HashMap<String, String> = pkg
@@ -625,7 +625,7 @@ mod test {
625625
use super::*;
626626
use crate::registry_api::OwnerKind;
627627
use crate::test::*;
628-
use crate::utils::CargoMetadata;
628+
use crate::utils::cargo_metadata::{MetadataExt as _, load_cargo_metadata_from_host_path};
629629
use chrono::NaiveDate;
630630
use std::slice;
631631
use test_case::test_case;
@@ -1171,7 +1171,7 @@ mod test {
11711171
"#;
11721172

11731173
std::fs::write(dir.path().join("Cargo.toml"), [base, extra].concat())?;
1174-
let metadata = CargoMetadata::load_from_host_path(dir.path())?;
1174+
let metadata = load_cargo_metadata_from_host_path(dir.path())?;
11751175
let features = super::get_features(metadata.root());
11761176
assert_eq!(features, expected.as_ref());
11771177

src/db/types/dependencies.rs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
use crate::utils::Dependency;
2-
use derive_more::Deref;
1+
use cargo_metadata::{Dependency, DependencyKind};
32
use semver::VersionReq;
43
use serde::{Deserialize, Serialize};
54

6-
const DEFAULT_KIND: &str = "normal";
7-
8-
/// A crate dependency in our internal representation for releases.dependencies json.
9-
#[derive(Debug, Clone, PartialEq, Deref)]
10-
pub(crate) struct ReleaseDependency(Dependency);
5+
/// A subset of `cargo_metadata::Dependency`.
6+
/// Only the data we store in our `releases.dependencies` column.
7+
#[derive(Debug, Clone, PartialEq)]
8+
pub(crate) struct ReleaseDependency {
9+
pub(crate) name: String,
10+
pub(crate) req: VersionReq,
11+
pub(crate) kind: DependencyKind,
12+
pub(crate) optional: bool,
13+
}
1114

1215
impl<'de> Deserialize<'de> for ReleaseDependency {
1316
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
@@ -22,25 +25,24 @@ impl<'de> Deserialize<'de> for ReleaseDependency {
2225
/// just [name, version]``
2326
Basic((String, VersionReq)),
2427
/// [name, version, kind]
25-
WithKind((String, VersionReq, String)),
28+
WithKind((String, VersionReq, DependencyKind)),
2629
/// [name, version, kind, optional]
27-
Full((String, VersionReq, String, bool)),
30+
Full((String, VersionReq, DependencyKind, bool)),
2831
}
2932

3033
let src = Repr::deserialize(deserializer)?;
3134
let (name, req, kind, optional) = match src {
32-
Repr::Basic((name, req)) => (name, req, DEFAULT_KIND.into(), false),
35+
Repr::Basic((name, req)) => (name, req, DependencyKind::default(), false),
3336
Repr::WithKind((name, req, kind)) => (name, req, kind, false),
3437
Repr::Full((name, req, kind, optional)) => (name, req, kind, optional),
3538
};
3639

37-
Ok(ReleaseDependency(Dependency {
40+
Ok(ReleaseDependency {
3841
name,
3942
req,
40-
kind: Some(kind),
43+
kind,
4144
optional,
42-
rename: None,
43-
}))
45+
})
4446
}
4547
}
4648

@@ -49,21 +51,18 @@ impl Serialize for ReleaseDependency {
4951
where
5052
S: serde::Serializer,
5153
{
52-
let dep = &self.0;
53-
let kind = dep.kind.as_deref().unwrap_or(DEFAULT_KIND);
54-
(dep.name.as_str(), &dep.req, kind, dep.optional).serialize(serializer)
54+
(self.name.as_str(), &self.req, &self.kind, self.optional).serialize(serializer)
5555
}
5656
}
5757

5858
impl From<Dependency> for ReleaseDependency {
5959
fn from(dep: Dependency) -> Self {
60-
ReleaseDependency(dep)
61-
}
62-
}
63-
64-
impl From<ReleaseDependency> for Dependency {
65-
fn from(dep: ReleaseDependency) -> Self {
66-
dep.0
60+
ReleaseDependency {
61+
name: dep.name,
62+
req: dep.req,
63+
kind: dep.kind,
64+
optional: dep.optional,
65+
}
6766
}
6867
}
6968

@@ -103,12 +102,20 @@ mod tests {
103102
Ok(())
104103
}
105104

106-
#[test_case(r#"[["vec_map", "^0.0.1"]]"#, "normal", false)]
107-
#[test_case(r#"[["vec_map", "^0.0.1", "dev" ]]"#, "dev", false)]
108-
#[test_case(r#"[["vec_map", "^0.0.1", "dev", true ]]"#, "dev", true)]
105+
#[test_case(r#"[["vec_map", "^0.0.1"]]"#, DependencyKind::Normal, false)]
106+
#[test_case(
107+
r#"[["vec_map", "^0.0.1", "dev" ]]"#,
108+
DependencyKind::Development,
109+
false
110+
)]
111+
#[test_case(
112+
r#"[["vec_map", "^0.0.1", "dev", true ]]"#,
113+
DependencyKind::Development,
114+
true
115+
)]
109116
fn test_parse_dependency(
110117
input: &str,
111-
expected_kind: &str,
118+
expected_kind: DependencyKind,
112119
expected_optional: bool,
113120
) -> Result<()> {
114121
let deps: ReleaseDependencyList = serde_json::from_str(input)?;
@@ -118,7 +125,7 @@ mod tests {
118125

119126
assert_eq!(dep.name, "vec_map");
120127
assert_eq!(dep.req, VersionReq::parse("^0.0.1")?);
121-
assert_eq!(dep.kind.as_deref(), Some(expected_kind));
128+
assert_eq!(dep.kind, expected_kind);
122129
assert_eq!(dep.optional, expected_optional);
123130

124131
Ok(())

src/docbuilder/rustwide_builder.rs

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ use crate::{
1717
rustdoc_archive_path, rustdoc_json_path, source_archive_path,
1818
},
1919
utils::{
20-
CargoMetadata, ConfigName, MetadataPackage, copy_dir_all, get_config, parse_rustc_version,
21-
report_error, set_config,
20+
ConfigName,
21+
cargo_metadata::{MetadataExt as _, PackageExt as _, load_cargo_metadata_from_rustwide},
22+
copy_dir_all, get_config, parse_rustc_version, report_error, set_config,
2223
},
2324
};
2425
use anyhow::{Context as _, Error, anyhow, bail};
@@ -379,14 +380,14 @@ impl RustwideBuilder {
379380
}
380381

381382
pub fn build_local_package(&mut self, path: &Path) -> Result<BuildPackageSummary> {
382-
let metadata = CargoMetadata::load_from_rustwide(&self.workspace, &self.toolchain, path)
383+
let metadata = load_cargo_metadata_from_rustwide(&self.workspace, &self.toolchain, path)
383384
.map_err(|err| {
384385
err.context(format!("failed to load local package {}", path.display()))
385386
})?;
386387
let package = metadata.root();
387388
self.build_package(
388389
&package.name,
389-
&package.version,
390+
&package.version(),
390391
PackageKind::Local(path),
391392
false,
392393
)
@@ -1001,7 +1002,7 @@ impl RustwideBuilder {
10011002
create_essential_files: bool,
10021003
collect_metrics: bool,
10031004
) -> Result<FullBuildResult> {
1004-
let cargo_metadata = CargoMetadata::load_from_rustwide(
1005+
let cargo_metadata = load_cargo_metadata_from_rustwide(
10051006
&self.workspace,
10061007
&self.toolchain,
10071008
&build.host_source_dir(),
@@ -1232,7 +1233,7 @@ impl RustwideBuilder {
12321233
copy_dir_all(source, dest).map_err(Into::into)
12331234
}
12341235

1235-
fn get_repo(&self, metadata: &MetadataPackage) -> Result<Option<i32>> {
1236+
fn get_repo(&self, metadata: &cargo_metadata::Package) -> Result<Option<i32>> {
12361237
self.runtime
12371238
.block_on(self.repository_stats_updater.load_repository(metadata))
12381239
}
@@ -1241,7 +1242,7 @@ impl RustwideBuilder {
12411242
struct FullBuildResult {
12421243
result: BuildResult,
12431244
target: String,
1244-
cargo_metadata: CargoMetadata,
1245+
cargo_metadata: cargo_metadata::Metadata,
12451246
doc_coverage: Option<DocCoverage>,
12461247
build_log: String,
12471248
}
@@ -1286,10 +1287,12 @@ impl Default for BuildPackageSummary {
12861287
#[cfg(test)]
12871288
mod tests {
12881289
use super::*;
1289-
use crate::db::types::Feature;
1290-
use crate::registry_api::ReleaseData;
1291-
use crate::storage::{CompressionAlgorithm, compression};
1292-
use crate::test::{AxumRouterTestExt, TestEnvironment};
1290+
use crate::{
1291+
db::types::Feature,
1292+
registry_api::ReleaseData,
1293+
storage::{CompressionAlgorithm, compression},
1294+
test::{AxumRouterTestExt, TestEnvironment, dummy_metadata_package},
1295+
};
12931296
use pretty_assertions::assert_eq;
12941297
use std::{io, iter};
12951298
use test_case::test_case;
@@ -1658,21 +1661,7 @@ mod tests {
16581661
&mut conn,
16591662
crate_id,
16601663
release_id,
1661-
&MetadataPackage {
1662-
name: crate_.into(),
1663-
version: version.clone(),
1664-
id: "".into(),
1665-
license: None,
1666-
repository: None,
1667-
homepage: None,
1668-
description: None,
1669-
documentation: None,
1670-
dependencies: vec![],
1671-
targets: vec![],
1672-
readme: None,
1673-
keywords: vec![],
1674-
features: HashMap::new(),
1675-
},
1664+
&dummy_metadata_package().build().unwrap(),
16761665
Path::new("/unknown/"),
16771666
"x86_64-unknown-linux-gnu",
16781667
serde_json::Value::Array(vec![]),

src/repositories/updater.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::error::Result;
22
use crate::repositories::{GitHub, GitLab, RateLimitReached};
3-
use crate::utils::MetadataPackage;
43
use crate::{Config, db::Pool};
54
use async_trait::async_trait;
65
use chrono::{DateTime, Utc};
@@ -81,7 +80,10 @@ impl RepositoryStatsUpdater {
8180
Self { updaters, pool }
8281
}
8382

84-
pub(crate) async fn load_repository(&self, metadata: &MetadataPackage) -> Result<Option<i32>> {
83+
pub(crate) async fn load_repository(
84+
&self,
85+
metadata: &cargo_metadata::Package,
86+
) -> Result<Option<i32>> {
8587
let url = match &metadata.repository {
8688
Some(url) => url,
8789
None => {

0 commit comments

Comments
 (0)