From d84959d256b3aa3387deca8a48de3f672c9e40a0 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Sun, 22 Jul 2018 14:33:17 -0500 Subject: [PATCH 1/2] add support for default-target --- src/web/rustdoc.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 5873b1f46..a520930d9 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -98,14 +98,22 @@ 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 = { + let query = ctry!(conn.query("SELECT target_name, default_target + 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): (String, Option) = (row.get(0), row.get(1)); + + if let Some(default) = default { + format!("{}/{}", default, target) + } else { + target + } + }; redirect_to_doc(req, &crate_name, &version, &target_name) } From 049c3e705e9038b42def214f28c0319a37c750b3 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Sun, 22 Jul 2018 15:17:45 -0500 Subject: [PATCH 2/2] check that default-target had a working build before redirecting --- src/web/rustdoc.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index a520930d9..23a7b7505 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -99,17 +99,28 @@ 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 = { - let query = ctry!(conn.query("SELECT target_name, default_target + 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): (String, Option) = (row.get(0), row.get(1)); + let (target, default, doc_targets): (String, Option, Json) = + (row.get(0), row.get(1), row.get(2)); if let Some(default) = default { - format!("{}/{}", default, target) + if targets_contains(&doc_targets, &default) { + format!("{}/{}", default, target) + } else { + target + } } else { target }