diff --git a/.sqlx/query-9ae6841c8cdba0bdbb518d2ee0fdfd0374f2b8e650fa12c3931da3ee2e1ed82c.json b/.sqlx/query-118390f408685404fa25f1de88df56c6f943b5530760163ff8a667fac627626f.json similarity index 75% rename from .sqlx/query-9ae6841c8cdba0bdbb518d2ee0fdfd0374f2b8e650fa12c3931da3ee2e1ed82c.json rename to .sqlx/query-118390f408685404fa25f1de88df56c6f943b5530760163ff8a667fac627626f.json index 4c7b5b71e..496380a0c 100644 --- a/.sqlx/query-9ae6841c8cdba0bdbb518d2ee0fdfd0374f2b8e650fa12c3931da3ee2e1ed82c.json +++ b/.sqlx/query-118390f408685404fa25f1de88df56c6f943b5530760163ff8a667fac627626f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n releases.id as \"id: ReleaseId\",\n releases.version,\n release_build_status.build_status as \"build_status!: BuildStatus\",\n releases.yanked,\n releases.is_library,\n releases.rustdoc_status,\n releases.target_name\n FROM releases\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n WHERE\n releases.crate_id = $1", + "query": "SELECT\n releases.id as \"id: ReleaseId\",\n releases.version,\n release_build_status.build_status as \"build_status!: BuildStatus\",\n releases.yanked,\n releases.is_library,\n releases.rustdoc_status,\n releases.release_time,\n releases.target_name\n FROM releases\n INNER JOIN release_build_status ON releases.id = release_build_status.rid\n WHERE\n releases.crate_id = $1", "describe": { "columns": [ { @@ -46,6 +46,11 @@ }, { "ordinal": 6, + "name": "release_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, "name": "target_name", "type_info": "Varchar" } @@ -62,8 +67,9 @@ true, true, true, + true, true ] }, - "hash": "9ae6841c8cdba0bdbb518d2ee0fdfd0374f2b8e650fa12c3931da3ee2e1ed82c" + "hash": "118390f408685404fa25f1de88df56c6f943b5530760163ff8a667fac627626f" } diff --git a/.sqlx/query-bc0b3932dc2f8bd2b8a9f5a312262eafefd3b80b3322116448901aa55f2d89e7.json b/.sqlx/query-bc0b3932dc2f8bd2b8a9f5a312262eafefd3b80b3322116448901aa55f2d89e7.json index d9cbc56c1..847813ccf 100644 --- a/.sqlx/query-bc0b3932dc2f8bd2b8a9f5a312262eafefd3b80b3322116448901aa55f2d89e7.json +++ b/.sqlx/query-bc0b3932dc2f8bd2b8a9f5a312262eafefd3b80b3322116448901aa55f2d89e7.json @@ -56,7 +56,7 @@ true, true, true, - false, + true, null ] }, diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 61f51027e..3f23834e0 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -100,6 +100,7 @@ pub(crate) struct Release { pub is_library: Option, pub rustdoc_status: Option, pub target_name: Option, + pub release_time: Option>, } impl CrateDetails { @@ -382,6 +383,7 @@ pub(crate) async fn releases_for_crate( releases.yanked, releases.is_library, releases.rustdoc_status, + releases.release_time, releases.target_name FROM releases INNER JOIN release_build_status ON releases.id = release_build_status.rid @@ -412,6 +414,7 @@ pub(crate) async fn releases_for_crate( is_library: row.is_library, rustdoc_status: row.rustdoc_status, target_name: row.target_name, + release_time: row.release_time, })) }) .try_collect() @@ -1143,7 +1146,10 @@ mod tests { .await?; let mut conn = db.async_conn().await; - let details = crate_details(&mut conn, "foo", "0.2.0", None).await; + let mut details = crate_details(&mut conn, "foo", "0.2.0", None).await; + for detail in &mut details.releases { + detail.release_time = None; + } assert_eq!( details.releases, @@ -1156,6 +1162,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[0].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.12.0")?, @@ -1165,6 +1172,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[1].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.3.0")?, @@ -1174,6 +1182,7 @@ mod tests { rustdoc_status: Some(false), id: details.releases[2].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.2.0")?, @@ -1183,6 +1192,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[3].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.2.0-alpha")?, @@ -1192,6 +1202,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[4].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.1.1")?, @@ -1201,6 +1212,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[5].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.1.0")?, @@ -1210,6 +1222,7 @@ mod tests { rustdoc_status: Some(true), id: details.releases[6].id, target_name: Some("foo".to_owned()), + release_time: None, }, Release { version: semver::Version::parse("0.0.1")?, @@ -1219,6 +1232,7 @@ mod tests { rustdoc_status: Some(false), id: details.releases[7].id, target_name: Some("foo".to_owned()), + release_time: None, }, ] ); diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index c62f64f9d..1e05f6c93 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -954,6 +954,7 @@ mod test { web::{cache::CachePolicy, encode_url_path}, }; use anyhow::Context; + use chrono::{NaiveDate, Utc}; use kuchikiki::traits::TendrilSink; use reqwest::StatusCode; use std::collections::BTreeMap; @@ -2319,7 +2320,7 @@ mod test { let anchor = page .select(&selector) .unwrap() - .find(|a| a.text_contents().trim() == version) + .find(|a| a.text_contents().trim().split(" ").next().unwrap() == version) .unwrap(); let attributes = anchor.as_node().as_element().unwrap().attributes.borrow(); let classes = attributes.get("class").unwrap(); @@ -2333,6 +2334,59 @@ mod test { }) } + #[test] + fn test_crate_release_version_and_date() { + async_wrapper(|env| async move { + env.fake_release() + .await + .name("hexponent") + .version("0.3.0") + .release_time( + NaiveDate::from_ymd_opt(2021, 1, 12) + .unwrap() + .and_hms_milli_opt(0, 0, 0, 0) + .unwrap() + .and_local_timezone(Utc) + .unwrap(), + ) + .create() + .await?; + env.fake_release() + .await + .name("hexponent") + .version("0.2.0") + .release_time( + NaiveDate::from_ymd_opt(2020, 12, 1) + .unwrap() + .and_hms_milli_opt(0, 0, 0, 0) + .unwrap() + .and_local_timezone(Utc) + .unwrap(), + ) + .create() + .await?; + let web = env.web_app().await; + + let status = |version, date| { + let web = web.clone(); + async move { + let page = kuchikiki::parse_html() + .one(web.get("/crate/hexponent/0.3.0").await?.text().await?); + let selector = format!(r#"ul > li a[href="/crate/hexponent/{version}"]"#); + let full = format!("{version} ({date})"); + Result::::Ok(page.select(&selector).unwrap().any(|a| { + eprintln!("++++++> {:?}", a.text_contents()); + a.text_contents().trim() == full + })) + } + }; + + assert!(status("0.3.0", "2021/01/12").await?); + assert!(status("0.2.0", "2020/12/01").await?); + Ok(()) + }) + } + #[test_case(true)] #[test_case(false)] fn test_no_trailing_rustdoc_slash(archive_storage: bool) { diff --git a/templates/macros.html b/templates/macros.html index 94f48f21b..d139f8601 100644 --- a/templates/macros.html +++ b/templates/macros.html @@ -8,7 +8,7 @@
  • {# safe: allow passing in HTML #} - {{ text|safe }} + {{ text|safe -}}
  • {% endmacro active_link %} @@ -23,7 +23,7 @@ {% macro menu_link(href, text, target) %}
  • - {{ text }} + {{- text -}}
  • {% endmacro menu_link %} @@ -142,13 +142,16 @@ {% if !title.is_empty() %} title="{{ title }}"{% endif %} {% if retain_fragment %}data-fragment="retain"{% endif %} > - {% if warning %} - {{ crate::icons::IconTriangleExclamation.render_solid(false, false, "") }} - {% endif %} - {% if release.build_status == "in_progress" %} - {{ crate::icons::IconGear.render_solid(true, true, "") }} - {% endif %} - {{ release.version }} + {%- if warning -%} + {{ crate::icons::IconTriangleExclamation.render_solid(false, false, "") -}} + {%+ endif -%} + {% if release.build_status == "in_progress" -%} + {{ crate::icons::IconGear.render_solid(true, true, "") -}} + {%+ endif -%} + {{ release.version }} + {%- if let Some(release_time) = release.release_time -%} + {# +#} ({{ release_time.format("%Y/%m/%d") }}) + {%- endif -%} {%- endfor -%} diff --git a/templates/rustdoc/topbar.html b/templates/rustdoc/topbar.html index 0d55b5889..d9eed2d4c 100644 --- a/templates/rustdoc/topbar.html +++ b/templates/rustdoc/topbar.html @@ -39,7 +39,7 @@ {%- if metadata.req_version.to_string() == "latest" -%}
  • {%- endif -%}