Skip to content

Commit f19952a

Browse files
committed
show in-progress builds on build queue page
1 parent bbf1c3f commit f19952a

11 files changed

+140
-75
lines changed

Diff for: .sqlx/query-1dae7bb925d677bb997ec28130f7de41c195510e87fa643a4cae57864552962c.json renamed to .sqlx/query-162c05df1f44bb48d087b6e6e4b3a8ab868b6d0cc20143b176522c0791a7023c.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .sqlx/query-3cb4dcb5778c77148aeb8dfc7f942ad45269ad7aab9e9c08fdaa9cb218dbc752.json

+26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .sqlx/query-e579486925d3d1927232675b2a03d5f8dd826d7136cdbba1331faf6e64c1f5eb.json renamed to .sqlx/query-771731efe02694173d758c04a4ec616e0171b05f09b71795af14270961fa8bd0.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: migrations/20240624085737_build-status-idx.down.sql

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP INDEX builds_build_status_idx;

Diff for: migrations/20240624085737_build-status-idx.up.sql

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE INDEX builds_build_status_idx ON builds USING btree (build_status ASC);

Diff for: src/web/builds.rs

+22-24
Original file line numberDiff line numberDiff line change
@@ -90,21 +90,24 @@ pub(crate) async fn build_list_json_handler(
9090
get_builds(&mut conn, &name, &version)
9191
.await?
9292
.iter()
93-
.map(|build| {
93+
.filter_map(|build| {
94+
if build.build_status == BuildStatus::InProgress {
95+
return None;
96+
}
9497
// for backwards compatibility in this API, we
9598
// * convert the build status to a boolean
9699
// * already filter out in-progress builds
97100
//
98101
// even when we start showing in-progress builds in the UI,
99102
// we might still not show them here for backwards
100103
// compatibility.
101-
serde_json::json!({
104+
Some(serde_json::json!({
102105
"id": build.id,
103106
"rustc_version": build.rustc_version,
104107
"docsrs_version": build.docsrs_version,
105108
"build_status": build.build_status.is_success(),
106109
"build_time": build.build_time,
107-
})
110+
}))
108111
})
109112
.collect::<Vec<_>>(),
110113
),
@@ -131,8 +134,7 @@ async fn get_builds(
131134
INNER JOIN crates ON releases.crate_id = crates.id
132135
WHERE
133136
crates.name = $1 AND
134-
releases.version = $2 AND
135-
builds.build_status != 'in_progress'
137+
releases.version = $2
136138
ORDER BY id DESC"#,
137139
name,
138140
version.to_string(),
@@ -326,29 +328,25 @@ mod tests {
326328

327329
let response = env.frontend().get("/crate/foo/0.1.0/builds").send()?;
328330

329-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
330-
// show releases without builds anywhere.
331-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
332-
333-
// assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
334-
// let page = kuchikiki::parse_html().one(response.text()?);
331+
assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
332+
let page = kuchikiki::parse_html().one(response.text()?);
335333

336-
// let rows: Vec<_> = page
337-
// .select("ul > li a.release")
338-
// .unwrap()
339-
// .map(|row| row.text_contents())
340-
// .collect();
334+
let rows: Vec<_> = page
335+
.select("ul > li a.release")
336+
.unwrap()
337+
.map(|row| row.text_contents())
338+
.collect();
341339

342-
// assert!(rows.is_empty());
340+
assert!(rows.is_empty());
343341

344-
// let warning = page
345-
// .select_first(".warning")
346-
// .expect("missing warning element")
347-
// .text_contents();
342+
let warning = page
343+
.select_first(".warning")
344+
.expect("missing warning element")
345+
.text_contents();
348346

349-
// assert!(warning.contains("has not built"));
350-
// assert!(warning.contains("queued"));
351-
// assert!(warning.contains("open an issue"));
347+
assert!(warning.contains("has not built"));
348+
assert!(warning.contains("queued"));
349+
assert!(warning.contains("open an issue"));
352350

353351
Ok(())
354352
});

Diff for: src/web/crate_details.rs

+17-21
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,7 @@ pub(crate) async fn releases_for_crate(
385385
FROM releases
386386
INNER JOIN release_build_status ON releases.id = release_build_status.rid
387387
WHERE
388-
releases.crate_id = $1 AND
389-
release_build_status.build_status != 'in_progress'"#,
388+
releases.crate_id = $1"#,
390389
crate_id,
391390
)
392391
.fetch(&mut *conn)
@@ -1260,25 +1259,22 @@ mod tests {
12601259
.create()?;
12611260

12621261
let response = env.frontend().get("/crate/foo/latest").send()?;
1263-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
1264-
// show releases without builds anywhere.
1265-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
1266-
1267-
// let page = kuchikiki::parse_html().one(response.text()?);
1268-
// let link = page
1269-
// .select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1270-
// .unwrap();
1271-
1272-
// assert_eq!(
1273-
// link.as_node()
1274-
// .as_element()
1275-
// .unwrap()
1276-
// .attributes
1277-
// .borrow()
1278-
// .get("title")
1279-
// .unwrap(),
1280-
// "foo-0.1.0 is currently being built"
1281-
// );
1262+
1263+
let page = kuchikiki::parse_html().one(response.text()?);
1264+
let link = page
1265+
.select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1266+
.unwrap();
1267+
1268+
assert_eq!(
1269+
link.as_node()
1270+
.as_element()
1271+
.unwrap()
1272+
.attributes
1273+
.borrow()
1274+
.get("title")
1275+
.unwrap(),
1276+
"foo-0.1.0 is currently being built"
1277+
);
12821278

12831279
Ok(())
12841280
});

Diff for: src/web/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ async fn match_version(
306306
};
307307

308308
// when matching semver requirements, we only want to look at non-yanked releases.
309-
let flt = |r: &&Release| r.yanked == Some(false);
309+
let flt = |r: &&Release| r.yanked.is_none() || r.yanked == Some(false);
310310

311311
if let Some(release) = releases
312312
.iter()

Diff for: src/web/releases.rs

+24-4
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,8 @@ pub(crate) async fn activity_handler(mut conn: DbConnection) -> AxumResult<impl
739739
struct BuildQueuePage {
740740
description: &'static str,
741741
queue: Vec<QueuedCrate>,
742-
active_deployments: Vec<String>,
742+
active_cdn_deployments: Vec<String>,
743+
in_progress_builds: Vec<(String, String)>,
743744
}
744745

745746
impl_axum_webpage! {
@@ -749,6 +750,7 @@ impl_axum_webpage! {
749750
pub(crate) async fn build_queue_handler(
750751
Extension(build_queue): Extension<Arc<BuildQueue>>,
751752
Extension(pool): Extension<Pool>,
753+
mut conn: DbConnection,
752754
) -> AxumResult<impl IntoResponse> {
753755
let (queue, active_deployments) = spawn_blocking(move || {
754756
let mut queue = build_queue.queued_crates()?;
@@ -776,10 +778,28 @@ pub(crate) async fn build_queue_handler(
776778
})
777779
.await?;
778780

781+
let in_progress_builds: Vec<(String, String)> = sqlx::query!(
782+
r#"SELECT
783+
crates.name,
784+
releases.version
785+
FROM builds
786+
INNER JOIN releases ON releases.id = builds.rid
787+
INNER JOIN crates ON releases.crate_id = crates.id
788+
WHERE
789+
builds.build_status = 'in_progress'
790+
ORDER BY builds.id ASC"#
791+
)
792+
.fetch_all(&mut *conn)
793+
.await?
794+
.into_iter()
795+
.map(|rec| (rec.name, rec.version))
796+
.collect();
797+
779798
Ok(BuildQueuePage {
780799
description: "crate documentation scheduled to build & deploy",
781800
queue,
782-
active_deployments,
801+
active_cdn_deployments: active_deployments,
802+
in_progress_builds,
783803
})
784804
}
785805

@@ -1600,9 +1620,9 @@ mod tests {
16001620

16011621
let empty = kuchikiki::parse_html().one(web.get("/releases/queue").send()?.text()?);
16021622
assert!(empty
1603-
.select(".release > strong")
1623+
.select(".release > div > strong")
16041624
.expect("missing heading")
1605-
.any(|el| el.text_contents().contains("active CDN deployments")));
1625+
.any(|el| dbg!(el.text_contents()).contains("active CDN deployments")));
16061626

16071627
let full = kuchikiki::parse_html().one(web.get("/releases/queue").send()?.text()?);
16081628
let items = full

Diff for: templates/crate/builds.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
<ul>
4343
{%- for build in builds -%}
4444
<li>
45+
{%- if build.build_status != "in_progress" %}
4546
<a href="/crate/{{ metadata.name }}/{{ metadata.version }}/builds/{{ build.id }}" class="release">
47+
{%- endif %}
4648
<div class="pure-g">
4749
<div class="pure-u-1 pure-u-sm-1-24 build">
4850
{%- if build.build_status == "success" -%}
@@ -77,12 +79,13 @@
7779
{%- endif -%}
7880
</div>
7981
</div>
82+
{%- if build.build_status != "in_progress" %}
8083
</a>
84+
{%- endif %}
8185
</li>
8286
{%- endfor -%}
8387
</ul>
8488
{%- else -%}
85-
{# FIXME: temporarily this will never be shown since we hide in-progress releases for now #}
8689
<div class="warning">
8790
docs.rs has not built {{ metadata.name }}-{{ metadata.version }}
8891
<br>

Diff for: templates/releases/build_queue.html

+40-20
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,54 @@
1010
{%- block body -%}
1111
<div class="container">
1212
<div class="recent-releases-container">
13-
{%- if active_deployments %}
14-
<div class="release">
15-
<strong>active CDN deployments</strong>
13+
<div class="release pure-g">
14+
<div class="pure-u-1-2">
15+
<strong>currently being built</strong>
16+
</div>
17+
<div class="pure-u-1-2">
18+
{%- if active_cdn_deployments %}
19+
<strong>active CDN deployments</strong>
20+
{%- endif %}
21+
</div>
1622
</div>
1723

1824
<div class = "pure-g">
1925
<div class="pure-u-1-2">
20-
<ol class="queue-list">
21-
{% for krate in active_deployments -%}
22-
<li>
23-
<a href="https://docs.rs/{{ krate }}">
24-
{{ krate }}
25-
</a>
26-
</li>
27-
{%- endfor %}
28-
</ol>
26+
{%- if in_progress_builds %}
27+
<ol class="queue-list">
28+
{% for release in in_progress_builds -%}
29+
<li>
30+
<a href="/crate/{{ release.0 }}/{{ release.1 }}/builds">
31+
{{ release.0 }} {{ release.1 }}
32+
</a>
33+
</li>
34+
{%- endfor %}
35+
</ol>
36+
{%- else %}
37+
<strong>There is nothing currently being built</strong>
38+
{%- endif %}
2939
</div>
3040
<div class="pure-u-1-2">
31-
<div class="about">
32-
<p>
33-
After the build finishes it may take up to 20 minutes for all documentation
34-
pages to be up-to-date and available to everybody.
35-
</p>
36-
<p>Especially <code>/latest/</code> URLs might be affected.</p>
37-
</div>
41+
{%- if active_cdn_deployments %}
42+
<ol class="queue-list">
43+
{% for krate in active_cdn_deployments -%}
44+
<li>
45+
<a href="/{{ krate }}">
46+
{{ krate }}
47+
</a>
48+
</li>
49+
{%- endfor %}
50+
</ol>
51+
<div class="about">
52+
<p>
53+
After the build finishes it may take up to 20 minutes for all documentation
54+
pages to be up-to-date and available to everybody.
55+
</p>
56+
<p>Especially <code>/latest/</code> URLs might be affected.</p>
57+
</div>
58+
{%- endif %}
3859
</div>
3960
</div>
40-
{%- endif %}
4161

4262
<div class="release">
4363
<strong>Build Queue</strong>

0 commit comments

Comments
 (0)