Skip to content

Commit d60eece

Browse files
Merge pull request #837 from Turbo87/reverse-deps
Fix reverse dependencies query
2 parents f5a1523 + f9f0e26 commit d60eece

File tree

6 files changed

+42
-20
lines changed

6 files changed

+42
-20
lines changed

app/serializers/dependency.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import DS from 'ember-data';
2+
3+
export default DS.RESTSerializer.extend({
4+
attrs: {
5+
version: 'version_id',
6+
},
7+
});

app/templates/crate/reverse-dependencies.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
{{#each model as |dependency|}}
1818
<div class='crate row'>
1919
<div>
20-
{{#link-to 'crate' dependency.crate_id}}{{dependency.crate_id}}{{/link-to}} requires {{dependency.req}}
20+
{{#link-to 'crate' dependency.version.crateName}}{{dependency.version.crateName}}{{/link-to}} requires {{dependency.req}}
2121
</div>
2222
<div class='stats downloads'>
2323
{{svg-jar "download-clear-back"}}

mirage/config.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,13 @@ export default function() {
142142
let dependencies = allDependencies.slice(start, end);
143143
let total = allDependencies.length;
144144

145-
let serialized = this.serialize(dependencies);
145+
let versions = schema.versions.find(dependencies.models.map(it => it.version_id));
146146

147-
// TODO https://github.com/rust-lang/crates.io/pull/810
148-
serialized.dependencies.forEach(dep => {
149-
let version = schema.versions.find(dep.version_id);
150-
dep.crate_id = version.crate;
151-
});
152-
153-
return withMeta(serialized, { total });
147+
return {
148+
...this.serialize(dependencies),
149+
...this.serialize(versions),
150+
meta: { total },
151+
};
154152
});
155153

156154
this.get('/crates/:crate_id/downloads', function(schema, request) {

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
@@ -60,6 +60,7 @@ struct Deps {
6060
#[derive(RustcDecodable)]
6161
struct RevDeps {
6262
dependencies: Vec<EncodableDependency>,
63+
versions: Vec<EncodableVersion>,
6364
meta: CrateMeta,
6465
}
6566
#[derive(RustcDecodable)]
@@ -1635,7 +1636,10 @@ fn reverse_dependencies() {
16351636
let deps = ::json::<RevDeps>(&mut response);
16361637
assert_eq!(deps.dependencies.len(), 1);
16371638
assert_eq!(deps.meta.total, 1);
1638-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1639+
assert_eq!(deps.dependencies[0].crate_id, "c1");
1640+
assert_eq!(deps.versions.len(), 1);
1641+
assert_eq!(deps.versions[0].krate, "c2");
1642+
assert_eq!(deps.versions[0].num, "1.1.0");
16391643

16401644
// c1 has no dependent crates.
16411645
req.with_path("/api/v1/crates/c2/reverse_dependencies");
@@ -1670,7 +1674,7 @@ fn reverse_dependencies_when_old_version_doesnt_depend_but_new_does() {
16701674
let deps = ::json::<RevDeps>(&mut response);
16711675
assert_eq!(deps.dependencies.len(), 1);
16721676
assert_eq!(deps.meta.total, 1);
1673-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1677+
assert_eq!(deps.dependencies[0].crate_id, "c1");
16741678
}
16751679

16761680
#[test]
@@ -1728,7 +1732,7 @@ fn prerelease_versions_not_included_in_reverse_dependencies() {
17281732
let deps = ::json::<RevDeps>(&mut response);
17291733
assert_eq!(deps.dependencies.len(), 1);
17301734
assert_eq!(deps.meta.total, 1);
1731-
assert_eq!(deps.dependencies[0].crate_id, "c3");
1735+
assert_eq!(deps.dependencies[0].crate_id, "c1");
17321736
}
17331737

17341738
#[test]
@@ -1756,7 +1760,7 @@ fn yanked_versions_not_included_in_reverse_dependencies() {
17561760
let deps = ::json::<RevDeps>(&mut response);
17571761
assert_eq!(deps.dependencies.len(), 1);
17581762
assert_eq!(deps.meta.total, 1);
1759-
assert_eq!(deps.dependencies[0].crate_id, "c2");
1763+
assert_eq!(deps.dependencies[0].crate_id, "c1");
17601764

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

0 commit comments

Comments
 (0)