Skip to content

Commit 0455a8a

Browse files
Merge pull request #810 from Turbo87/reverse-deps
WIP: Fix reverse dependencies query
2 parents 1291a87 + ae6d196 commit 0455a8a

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/dependency.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ pub struct Dependency {
3030

3131
pub struct ReverseDependency {
3232
dependency: Dependency,
33-
crate_name: String,
3433
crate_downloads: i32,
3534
}
3635

@@ -125,9 +124,9 @@ impl Dependency {
125124
}
126125

127126
impl ReverseDependency {
128-
pub fn encodable(self) -> EncodableDependency {
127+
pub fn encodable(self, crate_name: &str) -> EncodableDependency {
129128
self.dependency.encodable(
130-
&self.crate_name,
129+
crate_name,
131130
Some(self.crate_downloads),
132131
)
133132
}
@@ -218,11 +217,10 @@ impl Queryable<dependencies::SqlType, Pg> for Dependency {
218217
impl Queryable<(dependencies::SqlType, Integer, Text), Pg> for ReverseDependency {
219218
type Row = (<Dependency as Queryable<dependencies::SqlType, Pg>>::Row, i32, String);
220219

221-
fn build((dep_row, downloads, name): Self::Row) -> Self {
220+
fn build((dep_row, downloads, _name): Self::Row) -> Self {
222221
ReverseDependency {
223222
dependency: Dependency::build(dep_row),
224223
crate_downloads: downloads,
225-
crate_name: name,
226224
}
227225
}
228226
}

src/krate.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,19 +1543,33 @@ fn modify_owners(req: &mut Request, add: bool) -> CargoResult<Response> {
15431543

15441544
/// Handles the `GET /crates/:crate_id/reverse_dependencies` route.
15451545
pub fn reverse_dependencies(req: &mut Request) -> CargoResult<Response> {
1546+
use diesel::expression::dsl::any;
1547+
15461548
let name = &req.params()["crate_id"];
15471549
let conn = req.db_conn()?;
15481550
let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
15491551
let (offset, limit) = req.pagination(10, 100)?;
15501552
let (rev_deps, total) = krate.reverse_dependencies(&*conn, offset, limit)?;
1551-
let rev_deps = rev_deps
1553+
let rev_deps: Vec<_> = rev_deps
1554+
.into_iter()
1555+
.map(|dep| dep.encodable(&krate.name))
1556+
.collect();
1557+
1558+
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
1559+
1560+
let versions = versions::table
1561+
.filter(versions::id.eq(any(version_ids)))
1562+
.inner_join(crates::table)
1563+
.select((versions::all_columns, crates::name))
1564+
.load::<(Version, String)>(&*conn)?
15521565
.into_iter()
1553-
.map(ReverseDependency::encodable)
1566+
.map(|(version, krate_name)| version.encodable(&krate_name))
15541567
.collect();
15551568

15561569
#[derive(RustcEncodable)]
15571570
struct R {
15581571
dependencies: Vec<EncodableDependency>,
1572+
versions: Vec<EncodableVersion>,
15591573
meta: Meta,
15601574
}
15611575
#[derive(RustcEncodable)]
@@ -1564,6 +1578,7 @@ pub fn reverse_dependencies(req: &mut Request) -> CargoResult<Response> {
15641578
}
15651579
Ok(req.json(&R {
15661580
dependencies: rev_deps,
1581+
versions,
15671582
meta: Meta { total: total },
15681583
}))
15691584
}

src/tests/krate.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct Deps {
5959
#[derive(RustcDecodable)]
6060
struct RevDeps {
6161
dependencies: Vec<EncodableDependency>,
62+
versions: Vec<EncodableVersion>,
6263
meta: CrateMeta,
6364
}
6465
#[derive(RustcDecodable)]
@@ -1616,7 +1617,10 @@ fn reverse_dependencies() {
16161617
let deps = ::json::<RevDeps>(&mut response);
16171618
assert_eq!(deps.dependencies.len(), 1);
16181619
assert_eq!(deps.meta.total, 1);
1619-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1620+
assert_eq!(deps.dependencies[0].crate_id, "c1");
1621+
assert_eq!(deps.versions.len(), 1);
1622+
assert_eq!(deps.versions[0].krate, "c2");
1623+
assert_eq!(deps.versions[0].num, "1.1.0");
16201624

16211625
// c1 has no dependent crates.
16221626
req.with_path("/api/v1/crates/c2/reverse_dependencies");
@@ -1651,7 +1655,7 @@ fn reverse_dependencies_when_old_version_doesnt_depend_but_new_does() {
16511655
let deps = ::json::<RevDeps>(&mut response);
16521656
assert_eq!(deps.dependencies.len(), 1);
16531657
assert_eq!(deps.meta.total, 1);
1654-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1658+
assert_eq!(deps.dependencies[0].crate_id, "c1");
16551659
}
16561660

16571661
#[test]
@@ -1709,7 +1713,7 @@ fn prerelease_versions_not_included_in_reverse_dependencies() {
17091713
let deps = ::json::<RevDeps>(&mut response);
17101714
assert_eq!(deps.dependencies.len(), 1);
17111715
assert_eq!(deps.meta.total, 1);
1712-
assert_eq!(deps.dependencies[0].crate_id, "c3");
1716+
assert_eq!(deps.dependencies[0].crate_id, "c1");
17131717
}
17141718

17151719
#[test]
@@ -1737,7 +1741,7 @@ fn yanked_versions_not_included_in_reverse_dependencies() {
17371741
let deps = ::json::<RevDeps>(&mut response);
17381742
assert_eq!(deps.dependencies.len(), 1);
17391743
assert_eq!(deps.meta.total, 1);
1740-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1744+
assert_eq!(deps.dependencies[0].crate_id, "c1");
17411745

17421746
// TODO: have this test call `version.yank()` once the yank method is converted to diesel
17431747
diesel::update(versions::table.filter(versions::num.eq("2.0.0")))

0 commit comments

Comments
 (0)