From c8e69b1e4a9d4c93d507024261b98ff5d5eeff5a Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 28 Jun 2017 09:20:52 +0200 Subject: [PATCH 1/2] dependency: Adjust "crate_id" property of reverse dependencies query --- src/dependency.rs | 8 +++----- src/krate.rs | 2 +- src/tests/krate.rs | 8 ++++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/dependency.rs b/src/dependency.rs index b0e004b84b9..8c15ab42981 100644 --- a/src/dependency.rs +++ b/src/dependency.rs @@ -30,7 +30,6 @@ pub struct Dependency { pub struct ReverseDependency { dependency: Dependency, - crate_name: String, crate_downloads: i32, } @@ -125,9 +124,9 @@ impl Dependency { } impl ReverseDependency { - pub fn encodable(self) -> EncodableDependency { + pub fn encodable(self, crate_name: &str) -> EncodableDependency { self.dependency.encodable( - &self.crate_name, + crate_name, Some(self.crate_downloads), ) } @@ -218,11 +217,10 @@ impl Queryable for Dependency { impl Queryable<(dependencies::SqlType, Integer, Text), Pg> for ReverseDependency { type Row = (>::Row, i32, String); - fn build((dep_row, downloads, name): Self::Row) -> Self { + fn build((dep_row, downloads, _name): Self::Row) -> Self { ReverseDependency { dependency: Dependency::build(dep_row), crate_downloads: downloads, - crate_name: name, } } } diff --git a/src/krate.rs b/src/krate.rs index 229bf740dc1..0dc57899225 100644 --- a/src/krate.rs +++ b/src/krate.rs @@ -1550,7 +1550,7 @@ pub fn reverse_dependencies(req: &mut Request) -> CargoResult { let (rev_deps, total) = krate.reverse_dependencies(&*conn, offset, limit)?; let rev_deps = rev_deps .into_iter() - .map(ReverseDependency::encodable) + .map(|dep| dep.encodable(&krate.name)) .collect(); #[derive(RustcEncodable)] diff --git a/src/tests/krate.rs b/src/tests/krate.rs index ba003d53160..b630bdc570d 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1616,7 +1616,7 @@ fn reverse_dependencies() { let deps = ::json::(&mut response); assert_eq!(deps.dependencies.len(), 1); assert_eq!(deps.meta.total, 1); - assert_eq!(deps.dependencies[0].crate_id, "c2"); + assert_eq!(deps.dependencies[0].crate_id, "c1"); // c1 has no dependent crates. req.with_path("/api/v1/crates/c2/reverse_dependencies"); @@ -1651,7 +1651,7 @@ fn reverse_dependencies_when_old_version_doesnt_depend_but_new_does() { let deps = ::json::(&mut response); assert_eq!(deps.dependencies.len(), 1); assert_eq!(deps.meta.total, 1); - assert_eq!(deps.dependencies[0].crate_id, "c2"); + assert_eq!(deps.dependencies[0].crate_id, "c1"); } #[test] @@ -1709,7 +1709,7 @@ fn prerelease_versions_not_included_in_reverse_dependencies() { let deps = ::json::(&mut response); assert_eq!(deps.dependencies.len(), 1); assert_eq!(deps.meta.total, 1); - assert_eq!(deps.dependencies[0].crate_id, "c3"); + assert_eq!(deps.dependencies[0].crate_id, "c1"); } #[test] @@ -1737,7 +1737,7 @@ fn yanked_versions_not_included_in_reverse_dependencies() { let deps = ::json::(&mut response); assert_eq!(deps.dependencies.len(), 1); assert_eq!(deps.meta.total, 1); - assert_eq!(deps.dependencies[0].crate_id, "c2"); + assert_eq!(deps.dependencies[0].crate_id, "c1"); // TODO: have this test call `version.yank()` once the yank method is converted to diesel diesel::update(versions::table.filter(versions::num.eq("2.0.0"))) From ae6d1962f6979cc9515461738cc5add97da79ad4 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 28 Jun 2017 09:22:20 +0200 Subject: [PATCH 2/2] Include "versions" array in reverse dependencies query result --- src/krate.rs | 17 ++++++++++++++++- src/tests/krate.rs | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/krate.rs b/src/krate.rs index 0dc57899225..24270c6f067 100644 --- a/src/krate.rs +++ b/src/krate.rs @@ -1543,19 +1543,33 @@ fn modify_owners(req: &mut Request, add: bool) -> CargoResult { /// Handles the `GET /crates/:crate_id/reverse_dependencies` route. pub fn reverse_dependencies(req: &mut Request) -> CargoResult { + use diesel::expression::dsl::any; + let name = &req.params()["crate_id"]; let conn = req.db_conn()?; let krate = Crate::by_name(name).first::(&*conn)?; let (offset, limit) = req.pagination(10, 100)?; let (rev_deps, total) = krate.reverse_dependencies(&*conn, offset, limit)?; - let rev_deps = rev_deps + let rev_deps: Vec<_> = rev_deps .into_iter() .map(|dep| dep.encodable(&krate.name)) .collect(); + let version_ids: Vec = rev_deps.iter().map(|dep| dep.version_id).collect(); + + let versions = versions::table + .filter(versions::id.eq(any(version_ids))) + .inner_join(crates::table) + .select((versions::all_columns, crates::name)) + .load::<(Version, String)>(&*conn)? + .into_iter() + .map(|(version, krate_name)| version.encodable(&krate_name)) + .collect(); + #[derive(RustcEncodable)] struct R { dependencies: Vec, + versions: Vec, meta: Meta, } #[derive(RustcEncodable)] @@ -1564,6 +1578,7 @@ pub fn reverse_dependencies(req: &mut Request) -> CargoResult { } Ok(req.json(&R { dependencies: rev_deps, + versions, meta: Meta { total: total }, })) } diff --git a/src/tests/krate.rs b/src/tests/krate.rs index b630bdc570d..c26bfad6448 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -59,6 +59,7 @@ struct Deps { #[derive(RustcDecodable)] struct RevDeps { dependencies: Vec, + versions: Vec, meta: CrateMeta, } #[derive(RustcDecodable)] @@ -1617,6 +1618,9 @@ fn reverse_dependencies() { assert_eq!(deps.dependencies.len(), 1); assert_eq!(deps.meta.total, 1); assert_eq!(deps.dependencies[0].crate_id, "c1"); + assert_eq!(deps.versions.len(), 1); + assert_eq!(deps.versions[0].krate, "c2"); + assert_eq!(deps.versions[0].num, "1.1.0"); // c1 has no dependent crates. req.with_path("/api/v1/crates/c2/reverse_dependencies");