Skip to content

Commit c6a9ab7

Browse files
committed
models/krate: Move index_metadata() fn into index module
1 parent b0a3208 commit c6a9ab7

File tree

3 files changed

+88
-87
lines changed

3 files changed

+88
-87
lines changed

src/index.rs

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
use crate::models;
1+
use crate::models::{Crate, CrateVersions, Dependency, Version};
2+
use crate::schema::{crates, dependencies};
23
use crate::util::diesel::Conn;
34
use anyhow::Context;
5+
use crates_io_index::features::split_features;
46
use diesel::prelude::*;
57
use sentry::Level;
68

79
#[instrument(skip_all, fields(krate.name = ?name))]
810
pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option<String>> {
911
debug!("Looking up crate by name");
10-
let Some(krate): Option<models::Crate> =
11-
models::Crate::by_exact_name(name).first(conn).optional()?
12-
else {
12+
let Some(krate): Option<Crate> = Crate::by_exact_name(name).first(conn).optional()? else {
1313
return Ok(None);
1414
};
1515

1616
debug!("Gathering remaining index data");
17-
let crates = krate
18-
.index_metadata(conn)
19-
.context("Failed to gather index metadata")?;
17+
let crates = index_metadata(&krate, conn).context("Failed to gather index metadata")?;
2018

2119
// This can sometimes happen when we delete versions upon owner request
2220
// but don't realize that the crate is now left with no versions at all.
@@ -39,3 +37,81 @@ pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option
3937

4038
Ok(Some(str))
4139
}
40+
41+
/// Gather all the necessary data to write an index metadata file
42+
pub fn index_metadata(
43+
krate: &Crate,
44+
conn: &mut impl Conn,
45+
) -> QueryResult<Vec<crates_io_index::Crate>> {
46+
let mut versions: Vec<Version> = krate.all_versions().load(conn)?;
47+
48+
// We sort by `created_at` by default, but since tests run within a
49+
// single database transaction the versions will all have the same
50+
// `created_at` timestamp, so we sort by semver as a secondary key.
51+
versions.sort_by_cached_key(|k| (k.created_at, semver::Version::parse(&k.num).ok()));
52+
53+
let deps: Vec<(Dependency, String)> = Dependency::belonging_to(&versions)
54+
.inner_join(crates::table)
55+
.select((dependencies::all_columns, crates::name))
56+
.load(conn)?;
57+
58+
let deps = deps.grouped_by(&versions);
59+
60+
versions
61+
.into_iter()
62+
.zip(deps)
63+
.map(|(version, deps)| {
64+
let mut deps = deps
65+
.into_iter()
66+
.map(|(dep, name)| {
67+
// If this dependency has an explicit name in `Cargo.toml` that
68+
// means that the `name` we have listed is actually the package name
69+
// that we're depending on. The `name` listed in the index is the
70+
// Cargo.toml-written-name which is what cargo uses for
71+
// `--extern foo=...`
72+
let (name, package) = match dep.explicit_name {
73+
Some(explicit_name) => (explicit_name, Some(name)),
74+
None => (name, None),
75+
};
76+
77+
crates_io_index::Dependency {
78+
name,
79+
req: dep.req,
80+
features: dep.features,
81+
optional: dep.optional,
82+
default_features: dep.default_features,
83+
kind: Some(dep.kind.into()),
84+
package,
85+
target: dep.target,
86+
}
87+
})
88+
.collect::<Vec<_>>();
89+
90+
deps.sort();
91+
92+
let features = version.features().unwrap_or_default();
93+
let (features, features2) = split_features(features);
94+
95+
let (features2, v) = if features2.is_empty() {
96+
(None, None)
97+
} else {
98+
(Some(features2), Some(2))
99+
};
100+
101+
let krate = crates_io_index::Crate {
102+
name: krate.name.clone(),
103+
vers: version.num.to_string(),
104+
cksum: version.checksum,
105+
yanked: Some(version.yanked),
106+
deps,
107+
features,
108+
links: version.links,
109+
rust_version: version.rust_version,
110+
features2,
111+
v,
112+
};
113+
114+
Ok(krate)
115+
})
116+
.collect()
117+
}

src/models/krate.rs

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use chrono::NaiveDateTime;
2-
use crates_io_index::features::split_features;
32
use diesel::associations::Identifiable;
43
use diesel::dsl;
54
use diesel::pg::Pg;
@@ -12,7 +11,7 @@ use crate::controllers::helpers::pagination::*;
1211
use crate::models::helpers::with_count::*;
1312
use crate::models::version::TopVersions;
1413
use crate::models::{
15-
CrateOwner, CrateOwnerInvitation, Dependency, NewCrateOwnerInvitationOutcome, Owner, OwnerKind,
14+
CrateOwner, CrateOwnerInvitation, NewCrateOwnerInvitationOutcome, Owner, OwnerKind,
1615
ReverseDependency, User, Version,
1716
};
1817
use crate::schema::*;
@@ -433,81 +432,6 @@ impl Crate {
433432

434433
Ok(rows.records_and_total())
435434
}
436-
437-
/// Gather all the necessary data to write an index metadata file
438-
pub fn index_metadata(&self, conn: &mut impl Conn) -> QueryResult<Vec<crates_io_index::Crate>> {
439-
let mut versions: Vec<Version> = self.all_versions().load(conn)?;
440-
441-
// We sort by `created_at` by default, but since tests run within a
442-
// single database transaction the versions will all have the same
443-
// `created_at` timestamp, so we sort by semver as a secondary key.
444-
versions.sort_by_cached_key(|k| (k.created_at, semver::Version::parse(&k.num).ok()));
445-
446-
let deps: Vec<(Dependency, String)> = Dependency::belonging_to(&versions)
447-
.inner_join(crates::table)
448-
.select((dependencies::all_columns, crates::name))
449-
.load(conn)?;
450-
451-
let deps = deps.grouped_by(&versions);
452-
453-
versions
454-
.into_iter()
455-
.zip(deps)
456-
.map(|(version, deps)| {
457-
let mut deps = deps
458-
.into_iter()
459-
.map(|(dep, name)| {
460-
// If this dependency has an explicit name in `Cargo.toml` that
461-
// means that the `name` we have listed is actually the package name
462-
// that we're depending on. The `name` listed in the index is the
463-
// Cargo.toml-written-name which is what cargo uses for
464-
// `--extern foo=...`
465-
let (name, package) = match dep.explicit_name {
466-
Some(explicit_name) => (explicit_name, Some(name)),
467-
None => (name, None),
468-
};
469-
470-
crates_io_index::Dependency {
471-
name,
472-
req: dep.req,
473-
features: dep.features,
474-
optional: dep.optional,
475-
default_features: dep.default_features,
476-
kind: Some(dep.kind.into()),
477-
package,
478-
target: dep.target,
479-
}
480-
})
481-
.collect::<Vec<_>>();
482-
483-
deps.sort();
484-
485-
let features = version.features().unwrap_or_default();
486-
let (features, features2) = split_features(features);
487-
488-
let (features2, v) = if features2.is_empty() {
489-
(None, None)
490-
} else {
491-
(Some(features2), Some(2))
492-
};
493-
494-
let krate = crates_io_index::Crate {
495-
name: self.name.clone(),
496-
vers: version.num.to_string(),
497-
cksum: version.checksum,
498-
yanked: Some(version.yanked),
499-
deps,
500-
features,
501-
links: version.links,
502-
rust_version: version.rust_version,
503-
features2,
504-
v,
505-
};
506-
507-
Ok(krate)
508-
})
509-
.collect()
510-
}
511435
}
512436

513437
/// Details of a newly created invite.

src/tests/models/krate.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::index::index_metadata;
12
use crate::schema::users;
23
use crate::tests::builders::{CrateBuilder, VersionBuilder};
34
use crate::tests::util::insta::assert_json_snapshot;
@@ -6,7 +7,7 @@ use crates_io_test_db::TestDatabase;
67
use diesel::{ExpressionMethods, RunQueryDsl};
78

89
#[test]
9-
fn index_metadata() {
10+
fn test_index_metadata() {
1011
let test_db = TestDatabase::new();
1112
let mut conn = test_db.connect();
1213

@@ -35,7 +36,7 @@ fn index_metadata() {
3536
.version(VersionBuilder::new("0.1.0"))
3637
.expect_build(&mut conn);
3738

38-
let metadata = fooo.index_metadata(&mut conn).unwrap();
39+
let metadata = index_metadata(&fooo, &mut conn).unwrap();
3940
assert_json_snapshot!(metadata);
4041

4142
let bar = CrateBuilder::new("bar", user_id)
@@ -53,6 +54,6 @@ fn index_metadata() {
5354
.version(VersionBuilder::new("1.0.1").checksum("0123456789abcdef"))
5455
.expect_build(&mut conn);
5556

56-
let metadata = bar.index_metadata(&mut conn).unwrap();
57+
let metadata = index_metadata(&bar, &mut conn).unwrap();
5758
assert_json_snapshot!(metadata);
5859
}

0 commit comments

Comments
 (0)