From 58a74d46627597e5b47f90dea335cbf73f0e456d Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Fri, 2 Jun 2023 14:23:19 +0200 Subject: [PATCH 1/2] Read build-status directly from builds instead of release --- src/web/crate_details.rs | 28 ++++++++++++++++++++-------- src/web/releases.rs | 4 ++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 58ddbc350..f8350093f 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -117,7 +117,7 @@ impl CrateDetails { releases.readme, releases.description_long, releases.release_time, - releases.build_status, + COALESCE(builds.build_status, false) as build_status, releases.rustdoc_status, releases.archive_storage, releases.repository_url, @@ -145,6 +145,12 @@ impl CrateDetails { INNER JOIN crates ON releases.crate_id = crates.id LEFT JOIN doc_coverage ON doc_coverage.release_id = releases.id LEFT JOIN repositories ON releases.repository_id = repositories.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;"; let rows = conn.query(query, &[&name, &version])?; @@ -305,14 +311,20 @@ pub(crate) fn releases_for_crate( let mut releases: Vec = conn .query( "SELECT - id, - version, - build_status, - yanked, - is_library, - rustdoc_status, - target_name + releases.id, + releases.version, + COALESCE(builds.build_status, false) as build_status, + releases.yanked, + releases.is_library, + releases.rustdoc_status, + releases.target_name FROM releases + LEFT JOIN LATERAL ( + SELECT build_status FROM builds + WHERE builds.rid = releases.id + ORDER BY builds.build_time + DESC LIMIT 1 + ) AS builds ON true WHERE releases.crate_id = $1", &[&crate_id], diff --git a/src/web/releases.rs b/src/web/releases.rs index 58a299919..ffb8fa97f 100644 --- a/src/web/releases.rs +++ b/src/web/releases.rs @@ -90,7 +90,7 @@ pub(crate) fn get_releases( INNER JOIN builds ON releases.id = builds.rid LEFT JOIN repositories ON releases.repository_id = repositories.id WHERE - ((NOT $3) OR (releases.build_status = FALSE AND releases.is_library = TRUE)) + ((NOT $3) OR (builds.build_status = FALSE AND releases.is_library = TRUE)) AND {0} IS NOT NULL ORDER BY {0} DESC @@ -658,7 +658,7 @@ pub(crate) async fn activity_handler( SELECT release_time::date AS date_, COUNT(*) AS counts, - SUM(CAST((is_library = TRUE AND build_status = FALSE) AS INT)) AS failures + SUM(CAST((is_library = TRUE AND (SELECT builds.build_status FROM builds WHERE builds.rid = releases.id ORDER BY builds.build_time DESC LIMIT 1) = FALSE) AS INT)) AS failures FROM releases WHERE From bfaaf07ce0d501d243acf3073dc57d829e139a27 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Mon, 5 Jun 2023 14:05:14 +0200 Subject: [PATCH 2/2] 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 %}