diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 5873b1f46..23a7b7505 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -98,14 +98,33 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult { // get target name // FIXME: This is a bit inefficient but allowing us to use less code in general - let target_name: String = - ctry!(conn.query("SELECT target_name - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[&crate_name, &version])) - .get(0) - .get(0); + let target_name: String = { + fn targets_contains(doc_targets: &Json, default_target: &str) -> bool { + doc_targets.as_array().map_or(false, |tgts| { + tgts.iter().any(|t| t.as_string() == Some(default_target)) + }) + } + + let query = ctry!(conn.query("SELECT target_name, default_target, doc_targets + FROM releases + INNER JOIN crates ON crates.id = releases.crate_id + WHERE crates.name = $1 AND releases.version = $2", + &[&crate_name, &version])); + let row = query.get(0); + + let (target, default, doc_targets): (String, Option, Json) = + (row.get(0), row.get(1), row.get(2)); + + if let Some(default) = default { + if targets_contains(&doc_targets, &default) { + format!("{}/{}", default, target) + } else { + target + } + } else { + target + } + }; redirect_to_doc(req, &crate_name, &version, &target_name) }