Skip to content

Commit b7c9322

Browse files
committed
show in-progress builds on build queue page
1 parent e579f2d commit b7c9322

11 files changed

+140
-75
lines changed

.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.

.sqlx/query-3cb4dcb5778c77148aeb8dfc7f942ad45269ad7aab9e9c08fdaa9cb218dbc752.json

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

.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.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP INDEX builds_build_status_idx;
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);

src/web/builds.rs

+22-24
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,24 @@ pub(crate) async fn build_list_json_handler(
117117
get_builds(&mut conn, &name, &version)
118118
.await?
119119
.iter()
120-
.map(|build| {
120+
.filter_map(|build| {
121+
if build.build_status == BuildStatus::InProgress {
122+
return None;
123+
}
121124
// for backwards compatibility in this API, we
122125
// * convert the build status to a boolean
123126
// * already filter out in-progress builds
124127
//
125128
// even when we start showing in-progress builds in the UI,
126129
// we might still not show them here for backwards
127130
// compatibility.
128-
serde_json::json!({
131+
Some(serde_json::json!({
129132
"id": build.id,
130133
"rustc_version": build.rustc_version,
131134
"docsrs_version": build.docsrs_version,
132135
"build_status": build.build_status.is_success(),
133136
"build_time": build.build_time,
134-
})
137+
}))
135138
})
136139
.collect::<Vec<_>>(),
137140
),
@@ -255,8 +258,7 @@ async fn get_builds(
255258
INNER JOIN crates ON releases.crate_id = crates.id
256259
WHERE
257260
crates.name = $1 AND
258-
releases.version = $2 AND
259-
builds.build_status != 'in_progress'
261+
releases.version = $2
260262
ORDER BY id DESC"#,
261263
name,
262264
version.to_string(),
@@ -558,29 +560,25 @@ mod tests {
558560

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

561-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
562-
// show releases without builds anywhere.
563-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
564-
565-
// assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
566-
// let page = kuchikiki::parse_html().one(response.text()?);
563+
assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
564+
let page = kuchikiki::parse_html().one(response.text()?);
567565

568-
// let rows: Vec<_> = page
569-
// .select("ul > li a.release")
570-
// .unwrap()
571-
// .map(|row| row.text_contents())
572-
// .collect();
566+
let rows: Vec<_> = page
567+
.select("ul > li a.release")
568+
.unwrap()
569+
.map(|row| row.text_contents())
570+
.collect();
573571

574-
// assert!(rows.is_empty());
572+
assert!(rows.is_empty());
575573

576-
// let warning = page
577-
// .select_first(".warning")
578-
// .expect("missing warning element")
579-
// .text_contents();
574+
let warning = page
575+
.select_first(".warning")
576+
.expect("missing warning element")
577+
.text_contents();
580578

581-
// assert!(warning.contains("has not built"));
582-
// assert!(warning.contains("queued"));
583-
// assert!(warning.contains("open an issue"));
579+
assert!(warning.contains("has not built"));
580+
assert!(warning.contains("queued"));
581+
assert!(warning.contains("open an issue"));
584582

585583
Ok(())
586584
});

src/web/crate_details.rs

+17-21
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,7 @@ pub(crate) async fn releases_for_crate(
375375
FROM releases
376376
INNER JOIN release_build_status ON releases.id = release_build_status.rid
377377
WHERE
378-
releases.crate_id = $1 AND
379-
release_build_status.build_status != 'in_progress'"#,
378+
releases.crate_id = $1"#,
380379
crate_id,
381380
)
382381
.fetch(&mut *conn)
@@ -1292,25 +1291,22 @@ mod tests {
12921291
.create()?;
12931292

12941293
let response = env.frontend().get("/crate/foo/latest").send()?;
1295-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
1296-
// show releases without builds anywhere.
1297-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
1298-
1299-
// let page = kuchikiki::parse_html().one(response.text()?);
1300-
// let link = page
1301-
// .select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1302-
// .unwrap();
1303-
1304-
// assert_eq!(
1305-
// link.as_node()
1306-
// .as_element()
1307-
// .unwrap()
1308-
// .attributes
1309-
// .borrow()
1310-
// .get("title")
1311-
// .unwrap(),
1312-
// "foo-0.1.0 is currently being built"
1313-
// );
1294+
1295+
let page = kuchikiki::parse_html().one(response.text()?);
1296+
let link = page
1297+
.select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1298+
.unwrap();
1299+
1300+
assert_eq!(
1301+
link.as_node()
1302+
.as_element()
1303+
.unwrap()
1304+
.attributes
1305+
.borrow()
1306+
.get("title")
1307+
.unwrap(),
1308+
"foo-0.1.0 is currently being built"
1309+
);
13141310

13151311
Ok(())
13161312
});

src/web/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ async fn match_version(
308308
};
309309

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

313313
if let Some(release) = releases
314314
.iter()

src/web/releases.rs

+24-4
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,8 @@ pub(crate) async fn activity_handler(mut conn: DbConnection) -> AxumResult<impl
808808
struct BuildQueuePage {
809809
description: &'static str,
810810
queue: Vec<QueuedCrate>,
811-
active_deployments: Vec<String>,
811+
active_cdn_deployments: Vec<String>,
812+
in_progress_builds: Vec<(String, String)>,
812813
csp_nonce: String,
813814
}
814815

@@ -823,6 +824,7 @@ impl BuildQueuePage {
823824
pub(crate) async fn build_queue_handler(
824825
Extension(build_queue): Extension<Arc<BuildQueue>>,
825826
Extension(pool): Extension<Pool>,
827+
mut conn: DbConnection,
826828
) -> AxumResult<impl IntoResponse> {
827829
let (queue, active_deployments) = spawn_blocking(move || {
828830
let mut queue = build_queue.queued_crates()?;
@@ -850,10 +852,28 @@ pub(crate) async fn build_queue_handler(
850852
})
851853
.await?;
852854

855+
let in_progress_builds: Vec<(String, String)> = sqlx::query!(
856+
r#"SELECT
857+
crates.name,
858+
releases.version
859+
FROM builds
860+
INNER JOIN releases ON releases.id = builds.rid
861+
INNER JOIN crates ON releases.crate_id = crates.id
862+
WHERE
863+
builds.build_status = 'in_progress'
864+
ORDER BY builds.id ASC"#
865+
)
866+
.fetch_all(&mut *conn)
867+
.await?
868+
.into_iter()
869+
.map(|rec| (rec.name, rec.version))
870+
.collect();
871+
853872
Ok(BuildQueuePage {
854873
description: "crate documentation scheduled to build & deploy",
855874
queue,
856-
active_deployments,
875+
active_cdn_deployments: active_deployments,
876+
in_progress_builds,
857877
csp_nonce: String::new(),
858878
})
859879
}
@@ -1725,9 +1745,9 @@ mod tests {
17251745

17261746
let empty = kuchikiki::parse_html().one(web.get("/releases/queue").send()?.text()?);
17271747
assert!(empty
1728-
.select(".release > strong")
1748+
.select(".release > div > strong")
17291749
.expect("missing heading")
1730-
.any(|el| el.text_contents().contains("active CDN deployments")));
1750+
.any(|el| dbg!(el.text_contents()).contains("active CDN deployments")));
17311751

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

templates/crate/builds.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@
3939
<ul>
4040
{%- for build in builds -%}
4141
<li>
42+
{%- if build.build_status != "in_progress" %}
4243
<a href="/crate/{{ metadata.name }}/{{ metadata.version }}/builds/{{ build.id }}" class="release">
44+
{%- endif %}
4345
<div class="pure-g">
4446
<div class="pure-u-1 pure-u-sm-1-24 build">
4547
{%- if build.build_status == "success" -%}
@@ -74,12 +76,13 @@
7476
{%- endif -%}
7577
</div>
7678
</div>
79+
{%- if build.build_status != "in_progress" %}
7780
</a>
81+
{%- endif %}
7882
</li>
7983
{%- endfor -%}
8084
</ul>
8185
{%- else -%}
82-
{# FIXME: temporarily this will never be shown since we hide in-progress releases for now #}
8386
<div class="warning">
8487
docs.rs has not built {{ metadata.name }}-{{ metadata.version }}
8588
<br>

templates/releases/build_queue.html

+40-20
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,54 @@
1616
{%- block body -%}
1717
<div class="container">
1818
<div class="recent-releases-container">
19-
{%- if !active_deployments.is_empty() %}
20-
<div class="release">
21-
<strong>active CDN deployments</strong>
19+
<div class="release pure-g">
20+
<div class="pure-u-1-2">
21+
<strong>currently being built</strong>
22+
</div>
23+
<div class="pure-u-1-2">
24+
{%- if !active_cdn_deployments.is_empty() %}
25+
<strong>active CDN deployments</strong>
26+
{%- endif %}
27+
</div>
2228
</div>
2329

2430
<div class = "pure-g">
2531
<div class="pure-u-1-2">
26-
<ol class="queue-list">
27-
{% for krate in active_deployments -%}
28-
<li>
29-
<a href="https://docs.rs/{{ krate }}">
30-
{{ krate }}
31-
</a>
32-
</li>
33-
{%- endfor %}
34-
</ol>
32+
{%- if !in_progress_builds.is_empty() %}
33+
<ol class="queue-list">
34+
{% for release in in_progress_builds -%}
35+
<li>
36+
<a href="/crate/{{ release.0 }}/{{ release.1 }}/builds">
37+
{{ release.0 }} {{ release.1 }}
38+
</a>
39+
</li>
40+
{%- endfor %}
41+
</ol>
42+
{%- else %}
43+
<strong>There is nothing currently being built</strong>
44+
{%- endif %}
3545
</div>
3646
<div class="pure-u-1-2">
37-
<div class="about">
38-
<p>
39-
After the build finishes it may take up to 20 minutes for all documentation
40-
pages to be up-to-date and available to everybody.
41-
</p>
42-
<p>Especially <code>/latest/</code> URLs might be affected.</p>
43-
</div>
47+
{%- if !active_cdn_deployments.is_empty() %}
48+
<ol class="queue-list">
49+
{% for krate in active_cdn_deployments -%}
50+
<li>
51+
<a href="/{{ krate }}">
52+
{{ krate }}
53+
</a>
54+
</li>
55+
{%- endfor %}
56+
</ol>
57+
<div class="about">
58+
<p>
59+
After the build finishes it may take up to 20 minutes for all documentation
60+
pages to be up-to-date and available to everybody.
61+
</p>
62+
<p>Especially <code>/latest/</code> URLs might be affected.</p>
63+
</div>
64+
{%- endif %}
4465
</div>
4566
</div>
46-
{%- endif %}
4767

4868
<div class="release">
4969
<strong>Build Queue</strong>

0 commit comments

Comments
 (0)