Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions crates/bin/docs_rs_web/src/handlers/builds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct Build {
id: BuildId,
rustc_version: Option<String>,
pub rustc_version: Option<String>,
docsrs_version: Option<String>,
build_status: BuildStatus,
build_time: Option<DateTime<Utc>>,
pub build_status: BuildStatus,
pub build_time: Option<DateTime<Utc>>,
build_duration: Option<Duration>,
memory_peak: Option<i64>,
errors: Option<String>,
Expand Down Expand Up @@ -179,7 +179,7 @@ pub(crate) async fn build_trigger_rebuild_handler(
Ok((StatusCode::CREATED, Json(serde_json::json!({}))))
}

async fn get_builds(
pub(super) async fn get_builds(
conn: &mut sqlx::PgConnection,
name: &KrateName,
version: &Version,
Expand Down
11 changes: 11 additions & 0 deletions crates/bin/docs_rs_web/src/handlers/crate_details.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::{
DbConnection,
rustdoc::{PageKind, RustdocParams},
},
handlers::builds::{self, Build},
impl_axum_webpage,
match_release::{MatchedRelease, match_version},
metadata::MetaData,
Expand Down Expand Up @@ -45,6 +46,7 @@ pub(crate) struct CrateDetails {
build_status: BuildStatus,
pub latest_build_id: Option<BuildId>,
last_successful_build: Option<Version>,
pub latest_build: Option<Build>,
pub rustdoc_status: Option<bool>,
pub archive_storage: bool,
pub repository_url: Option<String>,
Expand Down Expand Up @@ -218,6 +220,14 @@ impl CrateDetails {
.map(Into::into)
.collect();

let builds = builds::get_builds(conn, &krate.name, version).await?;
let latest_build = builds
.into_iter()
.filter(|build| {
build.build_status == BuildStatus::Success && build.build_time.is_some()
})
.max_by_key(|build| build.build_time);

let mut crate_details = CrateDetails {
name: krate.name,
version: version.clone(),
Expand All @@ -230,6 +240,7 @@ impl CrateDetails {
build_status: krate.build_status,
latest_build_id: krate.latest_build_id,
last_successful_build: None,
latest_build,
rustdoc_status: krate.rustdoc_status,
archive_storage: krate.archive_storage,
repository_url: krate.repository_url,
Expand Down
12 changes: 12 additions & 0 deletions crates/bin/docs_rs_web/src/handlers/rustdoc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ use axum_extra::{
headers::{ContentType, ETag, Header as _, HeaderMapExt as _},
typed_header::TypedHeader,
};
use chrono::{DateTime, Utc};
use docs_rs_cargo_metadata::Dependency;
use docs_rs_database::Pool;
use docs_rs_headers::{ETagComputer, IfNoneMatch, X_ROBOTS_TAG};
Expand Down Expand Up @@ -397,6 +398,8 @@ pub struct LimitedCrateDetails {
dependencies: Vec<Dependency>,
total_items: Option<i32>,
documented_items: Option<i32>,
latest_build_time: Option<DateTime<Utc>>,
latest_build_rustc_version: Option<String>,
}

impl From<CrateDetails> for LimitedCrateDetails {
Expand All @@ -410,9 +413,16 @@ impl From<CrateDetails> for LimitedCrateDetails {
dependencies,
total_items,
documented_items,
latest_build,
..
} = value;

let (latest_build_time, latest_build_rustc_version) = if let Some(b) = latest_build {
(b.build_time, b.rustc_version)
} else {
(None, None)
};

Self {
total_items,
documented_items,
Expand All @@ -422,6 +432,8 @@ impl From<CrateDetails> for LimitedCrateDetails {
repository_url,
owners,
dependencies,
latest_build_time,
latest_build_rustc_version,
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions crates/bin/docs_rs_web/templates/rustdoc/topbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@
</span>
</li>
{%- endif -%}
{%- if let Some(time) = krate.latest_build_time -%}
<li class="pure-menu-item">
<span class="pure-menu-link description" title="{% if let Some(version) = krate.latest_build_rustc_version -%} Built with {{ version }} {%- else -%} Version unavailable {%- endif -%} ">
{{ crate::icons::IconGears.render_solid(false, false, "") }} {{ time.format("%d %B %Y") }}
</span>
</li>
{%- endif -%}
</ul>

<div class="pure-g menu-item-divided">
Expand Down
4 changes: 2 additions & 2 deletions gui-tests/crate-topbar-dropdown-menu.goml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ click: "#nav-search-form .crate-dropdown"
wait-for: |active_crate_dropdown_selector|

store-value: (crate_main_info_items, ".package-details-menu > ul > .pure-menu-item")
// There should be 3 items.
assert-count: (|crate_main_info_items|, 3)
// There should be 4 items.
assert-count: (|crate_main_info_items|, 4)

// Now we check the paddings with various widths.
call-function: ("check-padding", {"width": 900})
Expand Down
Loading