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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 48 additions & 1 deletion crates/bin/docs_rs_web/src/handlers/builds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ pub(crate) struct Build {
build_status: BuildStatus,
build_time: Option<DateTime<Utc>>,
build_duration: Option<Duration>,
memory_peak: Option<i64>,
errors: Option<String>,
}

Expand Down Expand Up @@ -210,6 +211,7 @@ async fn get_builds(
ELSE (builds.build_finished - builds.build_started)
END
END AS "build_duration?: Duration",
builds.memory_peak,
builds.errors
FROM builds
INNER JOIN releases ON releases.id = builds.rid
Expand Down Expand Up @@ -275,7 +277,9 @@ mod tests {
.collect();

assert_eq!(rows.len(), 1);
assert_eq!(rows[0].chars().filter(|&c| c == '—').count(), 3);
// Should have 4 mdashes: rustc_version, docsrs_version, build_time, build_duration
// (peak_memory_bytes shows "100 MB" from the dummy value)
assert_eq!(rows[0].chars().filter(|&c| c == '—').count(), 4);

Ok(())
});
Expand Down Expand Up @@ -328,6 +332,49 @@ mod tests {
});
}

#[test]
fn build_list_shows_memory() {
async_wrapper(|env| async move {
// Use a specific memory value: 256 MiB = 256 * 1024 * 1024 = 268435456 bytes
// filesizeformat uses decimal (1000-based), so this will display as ~268.43 MB
let test_memory_bytes: u64 = 256 * 1024 * 1024;

env.fake_release()
.await
.name("foo")
.version("0.1.0")
.builds(vec![
FakeBuild::default()
.rustc_version("rustc (blabla 2019-01-01)")
.docsrs_version("docs.rs 1.0.0")
.memory_peak(test_memory_bytes),
])
.create()
.await?;

let response = env.web_app().await.get("/crate/foo/0.1.0/builds").await?;
let page = kuchikiki::parse_html().one(response.text().await?);

// Check that memory column exists with tooltip
let memory_cells: Vec<_> = page
.select("div.memory[title='Peak memory usage']")
.unwrap()
.collect();
assert_eq!(memory_cells.len(), 1, "Should have one memory cell");

// Check that the specific memory value is displayed
// 256 MiB (268435456 bytes) is formatted as "268.43 MB" by filesizeformat
let memory_text = memory_cells[0].text_contents().trim().to_string();
assert!(
memory_text.contains("268") && memory_text.contains("MB"),
"Memory column should contain '268.xx MB' (from 256 MiB input), got: '{}'",
memory_text
);

Ok(())
});
}

#[tokio::test(flavor = "multi_thread")]
async fn build_trigger_rebuild_missing_config() -> Result<()> {
let env = TestEnvironment::builder()
Expand Down
23 changes: 17 additions & 6 deletions crates/bin/docs_rs_web/templates/crate/builds.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@
{{ crate::icons::IconX.render_solid(false, false, "") }}
{%- endif -%}
</div> {#- -#}
<div class="pure-u-1 pure-u-sm-9-24">
<div class="pure-u-1 pure-u-sm-7-24">
{%- if let Some(rustc_version) = build.rustc_version -%}
{{ rustc_version }}
{%- else -%}
&mdash;
{%- endif -%}
</div> {#- -#}
<div class="pure-u-1 pure-u-sm-8-24">
<div class="pure-u-1 pure-u-sm-6-24">
{%- if let Some(docsrs_version) = build.docsrs_version -%}
{{ docsrs_version }}
{%- else -%}
Expand All @@ -61,13 +61,21 @@
&mdash;
{%- endif -%}
</div>
<div class="pure-u-1 pure-u-sm-3-24 duration">
<div class="pure-u-1 pure-u-sm-4-24 duration">
{%- if let Some(build_duration) = build.build_duration -%}
took {{ build_duration|format_duration }}
{%- else -%}
&mdash;
{%- endif -%}
</div>
<div class="pure-u-1 pure-u-sm-3-24 memory" title="Peak memory usage">
{%- if let Some(memory_peak) = build.memory_peak -%}
{{ crate::icons::IconMemory.render_solid(false, false, "") }}
{{ memory_peak|filesizeformat }}
{%- else -%}
&mdash;
{%- endif -%}
</div>
</div> {#- -#}
</a>
{%- else -%}
Expand All @@ -76,22 +84,25 @@
<div class="pure-u-1 pure-u-sm-1-24 build">
{{- crate::icons::IconGear.render_solid(false, true, "") -}}
</div> {#- -#}
<div class="pure-u-1 pure-u-sm-9-24 build"> {#- -#}
<div class="pure-u-1 pure-u-sm-7-24 build"> {#- -#}
<a href="/releases/queue" class="normal">in progress</a> {#- -#}
</div>
<div class="pure-u-1 pure-u-sm-8-24">
<div class="pure-u-1 pure-u-sm-6-24">
&mdash;
</div> {#- -#}
<div class="pure-u-1 pure-u-sm-3-24 date">
&mdash;
</div> {#- -#}
<div class="pure-u-1 pure-u-sm-3-24 duration">
<div class="pure-u-1 pure-u-sm-4-24 duration">
{%- if let Some(build_duration) = build.build_duration -%}
since {{ build_duration|format_duration }}
{%- else -%}
&mdash;
{%- endif -%}
</div>
<div class="pure-u-1 pure-u-sm-3-24 memory" title="Peak memory usage">
&mdash;
</div>
</div>
</div>
{%- endif -%}
Expand Down
10 changes: 9 additions & 1 deletion crates/bin/docs_rs_web/templates/style/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -387,14 +387,22 @@ div.recent-releases-container {
}

.date,
.duration {
.duration,
.memory {
font-weight: normal;

@media #{$media-sm} {
text-align: right;
}
}

.memory {
@media #{$media-sm} {
padding-left: 1em;
white-space: nowrap;
}
}

div.pagination {
text-align: center;
margin: 1em;
Expand Down
11 changes: 10 additions & 1 deletion crates/lib/docs_rs_test_fakes/src/legacy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ pub struct FakeBuild {
rustc_version: String,
docsrs_version: String,
build_status: BuildStatus,
memory_peak: Option<u64>,
}

const DEFAULT_CONTENT: &[u8] =
Expand Down Expand Up @@ -692,6 +693,13 @@ impl FakeBuild {
}
}

pub fn memory_peak(self, memory_peak: u64) -> Self {
Self {
memory_peak: Some(memory_peak),
..self
}
}

async fn create(
&self,
conn: &mut sqlx::PgConnection,
Expand All @@ -708,7 +716,7 @@ impl FakeBuild {
&self.docsrs_version,
self.build_status,
Some(42),
Some(23),
self.memory_peak,
None::<&SimpleBuildError>,
)
.await?;
Expand Down Expand Up @@ -752,6 +760,7 @@ impl Default for FakeBuild {
rustc_version: "rustc 2.0.0-nightly (000000000 1970-01-01)".into(),
docsrs_version: "docs.rs 1.0.0 (000000000 1970-01-01)".into(),
build_status: BuildStatus::Success,
memory_peak: Some(23),
}
}
}
Loading