From bfaaf07ce0d501d243acf3073dc57d829e139a27 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Mon, 5 Jun 2023 14:05:14 +0200 Subject: [PATCH] Read rustc_version directly from builds instead of release --- src/web/crate_details.rs | 7 ++-- src/web/mod.rs | 66 +++++++++++++++++++++---------------- src/web/source.rs | 44 +++++++------------------ templates/rustdoc/head.html | 2 ++ 4 files changed, 56 insertions(+), 63 deletions(-) diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index f8350093f..99ecf3737 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -136,7 +136,7 @@ impl CrateDetails { releases.license, releases.documentation_url, releases.default_target, - releases.doc_rustc_version, + builds.rustc_version, doc_coverage.total_items, doc_coverage.documented_items, doc_coverage.total_items_needing_examples, @@ -188,7 +188,10 @@ impl CrateDetails { default_target: krate.get("default_target"), doc_targets: MetaData::parse_doc_targets(krate.get("doc_targets")), yanked: krate.get("yanked"), - rustdoc_css_file: get_correct_docsrs_style_file(krate.get("doc_rustc_version"))?, + rustdoc_css_file: krate + .get::<_, Option<&str>>("rustc_version") + .map(get_correct_docsrs_style_file) + .transpose()?, }; let mut crate_details = CrateDetails { diff --git a/src/web/mod.rs b/src/web/mod.rs index 367aff9d1..df650dba3 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -509,44 +509,54 @@ pub(crate) struct MetaData { pub(crate) yanked: bool, /// CSS file to use depending on the rustdoc version used to generate this version of this /// crate. - pub(crate) rustdoc_css_file: String, + pub(crate) rustdoc_css_file: Option, } impl MetaData { + #[fn_error_context::context("getting metadata for {name} {version}")] fn from_crate( conn: &mut Client, name: &str, version: &str, version_or_latest: &str, ) -> Result { - conn.query_opt( - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.rustdoc_status, - releases.default_target, - releases.doc_targets, - releases.yanked, - releases.doc_rustc_version - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", + let row = conn.query_one( + "SELECT + crates.name, + releases.version, + releases.description, + releases.target_name, + releases.rustdoc_status, + releases.default_target, + releases.doc_targets, + releases.yanked, + builds.rustc_version + FROM releases + INNER JOIN crates ON crates.id = releases.crate_id + LEFT JOIN LATERAL ( + SELECT * FROM builds + WHERE builds.rid = releases.id + ORDER BY builds.build_time + DESC LIMIT 1 + ) AS builds ON true + WHERE crates.name = $1 AND releases.version = $2", &[&name, &version], - )? - .map(|row| MetaData { - name: row.get(0), - version: row.get(1), + )?; + Ok(MetaData { + name: row.get("name"), + version: row.get("version"), version_or_latest: version_or_latest.to_string(), - description: row.get(2), - target_name: row.get(3), - rustdoc_status: row.get(4), - default_target: row.get(5), - doc_targets: MetaData::parse_doc_targets(row.get(6)), - yanked: row.get(7), - rustdoc_css_file: get_correct_docsrs_style_file(row.get(8)).unwrap(), + description: row.get("description"), + target_name: row.get("target_name"), + rustdoc_status: row.get("rustdoc_status"), + default_target: row.get("default_target"), + doc_targets: MetaData::parse_doc_targets(row.get("doc_targets")), + yanked: row.get("yanked"), + rustdoc_css_file: row + .get::<_, Option<&str>>("rustc_version") + .map(get_correct_docsrs_style_file) + .transpose()?, }) - .ok_or_else(|| anyhow!("missing metadata for {} {}", name, version)) } fn parse_doc_targets(targets: Value) -> Vec { @@ -938,7 +948,7 @@ mod test { "arm64-unknown-linux-gnu".to_string(), ], yanked: false, - rustdoc_css_file: "rustdoc.css".to_string(), + rustdoc_css_file: Some("rustdoc.css".to_string()), }; let correct_json = json!({ @@ -1016,7 +1026,7 @@ mod test { default_target: "x86_64-unknown-linux-gnu".to_string(), doc_targets: vec![], yanked: false, - rustdoc_css_file: "rustdoc.css".to_string(), + rustdoc_css_file: Some("rustdoc.css".to_string()), }, ); Ok(()) diff --git a/src/web/source.rs b/src/web/source.rs index f45802e5a..df74d7e1b 100644 --- a/src/web/source.rs +++ b/src/web/source.rs @@ -2,7 +2,7 @@ use super::{error::AxumResult, match_version_axum}; use crate::{ db::Pool, impl_axum_webpage, - utils::{get_correct_docsrs_style_file, spawn_blocking}, + utils::spawn_blocking, web::{ cache::CachePolicy, error::AxumNope, file::File as DbFile, headers::CanonicalUrl, MatchSemver, MetaData, @@ -75,29 +75,18 @@ impl FileList { version_or_latest: &str, folder: &str, ) -> Result> { - let row = match conn.query_opt( - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.rustdoc_status, - releases.files, - releases.default_target, - releases.doc_targets, - releases.yanked, - releases.doc_rustc_version - FROM releases - LEFT OUTER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", + let Some(row) = conn.query_opt( + "SELECT releases.files + FROM releases + LEFT OUTER JOIN crates ON crates.id = releases.crate_id + WHERE crates.name = $1 AND releases.version = $2", &[&name, &version], - )? { - Some(row) => row, - None => return Ok(None), + )? + else { + return Ok(None); }; - let files = if let Some(files) = row.try_get::<_, Option>(5)? { - files - } else { + let Some(files) = row.try_get::<_, Option>("files")? else { return Ok(None); }; @@ -143,18 +132,7 @@ impl FileList { }); Ok(Some(FileList { - metadata: MetaData { - name: row.get(0), - version: row.get(1), - version_or_latest: version_or_latest.to_string(), - description: row.get(2), - target_name: row.get(3), - rustdoc_status: row.get(4), - default_target: row.get(6), - doc_targets: MetaData::parse_doc_targets(row.get(7)), - yanked: row.get(8), - rustdoc_css_file: get_correct_docsrs_style_file(row.get(9))?, - }, + metadata: MetaData::from_crate(conn, name, version, version_or_latest)?, files: file_list, })) } else { diff --git a/templates/rustdoc/head.html b/templates/rustdoc/head.html index f3678c940..827111009 100644 --- a/templates/rustdoc/head.html +++ b/templates/rustdoc/head.html @@ -1,5 +1,7 @@ {%- import "macros.html" as macros -%} + {% if metadata.rustdoc_css_file %} + {% endif %}