Skip to content

Commit c5573e9

Browse files
committed
show in-progress builds on build queue page
1 parent 4f029e1 commit c5573e9

12 files changed

+152
-79
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
@@ -107,21 +107,24 @@ pub(crate) async fn build_list_json_handler(
107107
get_builds(&mut conn, &name, &version)
108108
.await?
109109
.iter()
110-
.map(|build| {
110+
.filter_map(|build| {
111+
if build.build_status == BuildStatus::InProgress {
112+
return None;
113+
}
111114
// for backwards compatibility in this API, we
112115
// * convert the build status to a boolean
113116
// * already filter out in-progress builds
114117
//
115118
// even when we start showing in-progress builds in the UI,
116119
// we might still not show them here for backwards
117120
// compatibility.
118-
serde_json::json!({
121+
Some(serde_json::json!({
119122
"id": build.id,
120123
"rustc_version": build.rustc_version,
121124
"docsrs_version": build.docsrs_version,
122125
"build_status": build.build_status.is_success(),
123126
"build_time": build.build_time,
124-
})
127+
}))
125128
})
126129
.collect::<Vec<_>>(),
127130
),
@@ -245,8 +248,7 @@ async fn get_builds(
245248
INNER JOIN crates ON releases.crate_id = crates.id
246249
WHERE
247250
crates.name = $1 AND
248-
releases.version = $2 AND
249-
builds.build_status != 'in_progress'
251+
releases.version = $2
250252
ORDER BY id DESC"#,
251253
name,
252254
version.to_string(),
@@ -548,29 +550,25 @@ mod tests {
548550

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

551-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
552-
// show releases without builds anywhere.
553-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
554-
555-
// assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
556-
// let page = kuchikiki::parse_html().one(response.text()?);
553+
assert_cache_control(&response, CachePolicy::NoCaching, &env.config());
554+
let page = kuchikiki::parse_html().one(response.text()?);
557555

558-
// let rows: Vec<_> = page
559-
// .select("ul > li a.release")
560-
// .unwrap()
561-
// .map(|row| row.text_contents())
562-
// .collect();
556+
let rows: Vec<_> = page
557+
.select("ul > li a.release")
558+
.unwrap()
559+
.map(|row| row.text_contents())
560+
.collect();
563561

564-
// assert!(rows.is_empty());
562+
assert!(rows.is_empty());
565563

566-
// let warning = page
567-
// .select_first(".warning")
568-
// .expect("missing warning element")
569-
// .text_contents();
564+
let warning = page
565+
.select_first(".warning")
566+
.expect("missing warning element")
567+
.text_contents();
570568

571-
// assert!(warning.contains("has not built"));
572-
// assert!(warning.contains("queued"));
573-
// assert!(warning.contains("open an issue"));
569+
assert!(warning.contains("has not built"));
570+
assert!(warning.contains("queued"));
571+
assert!(warning.contains("open an issue"));
574572

575573
Ok(())
576574
});

src/web/crate_details.rs

+17-21
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,7 @@ pub(crate) async fn releases_for_crate(
374374
FROM releases
375375
INNER JOIN release_build_status ON releases.id = release_build_status.rid
376376
WHERE
377-
releases.crate_id = $1 AND
378-
release_build_status.build_status != 'in_progress'"#,
377+
releases.crate_id = $1"#,
379378
crate_id,
380379
)
381380
.fetch(&mut *conn)
@@ -1341,25 +1340,22 @@ mod tests {
13411340
.create()?;
13421341

13431342
let response = env.frontend().get("/crate/foo/latest").send()?;
1344-
// FIXME: temporarily we don't show in-progress releases anywhere, which means we don't
1345-
// show releases without builds anywhere.
1346-
assert_eq!(response.status(), StatusCode::NOT_FOUND);
1347-
1348-
// let page = kuchikiki::parse_html().one(response.text()?);
1349-
// let link = page
1350-
// .select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1351-
// .unwrap();
1352-
1353-
// assert_eq!(
1354-
// link.as_node()
1355-
// .as_element()
1356-
// .unwrap()
1357-
// .attributes
1358-
// .borrow()
1359-
// .get("title")
1360-
// .unwrap(),
1361-
// "foo-0.1.0 is currently being built"
1362-
// );
1343+
1344+
let page = kuchikiki::parse_html().one(response.text()?);
1345+
let link = page
1346+
.select_first("a.pure-menu-link[href='/crate/foo/0.1.0']")
1347+
.unwrap();
1348+
1349+
assert_eq!(
1350+
link.as_node()
1351+
.as_element()
1352+
.unwrap()
1353+
.attributes
1354+
.borrow()
1355+
.get("title")
1356+
.unwrap(),
1357+
"foo-0.1.0 is currently being built"
1358+
);
13631359

13641360
Ok(())
13651361
});

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

+25-5
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,8 @@ pub(crate) async fn activity_handler(mut conn: DbConnection) -> AxumResult<impl
784784
struct BuildQueuePage {
785785
description: &'static str,
786786
queue: Vec<QueuedCrate>,
787-
active_deployments: Vec<String>,
787+
active_cdn_deployments: Vec<String>,
788+
in_progress_builds: Vec<(String, String)>,
788789
csp_nonce: String,
789790
}
790791

@@ -793,8 +794,9 @@ impl_axum_webpage! { BuildQueuePage }
793794
pub(crate) async fn build_queue_handler(
794795
Extension(build_queue): Extension<Arc<BuildQueue>>,
795796
Extension(pool): Extension<Pool>,
797+
mut conn: DbConnection,
796798
) -> AxumResult<impl IntoResponse> {
797-
let (queue, active_deployments) = spawn_blocking(move || {
799+
let (queue, active_cdn_deployments) = spawn_blocking(move || {
798800
let mut queue = build_queue.queued_crates()?;
799801
for krate in queue.iter_mut() {
800802
// The priority here is inverted: in the database if a crate has a higher priority it
@@ -820,10 +822,28 @@ pub(crate) async fn build_queue_handler(
820822
})
821823
.await?;
822824

825+
let in_progress_builds: Vec<(String, String)> = sqlx::query!(
826+
r#"SELECT
827+
crates.name,
828+
releases.version
829+
FROM builds
830+
INNER JOIN releases ON releases.id = builds.rid
831+
INNER JOIN crates ON releases.crate_id = crates.id
832+
WHERE
833+
builds.build_status = 'in_progress'
834+
ORDER BY builds.id ASC"#
835+
)
836+
.fetch_all(&mut *conn)
837+
.await?
838+
.into_iter()
839+
.map(|rec| (rec.name, rec.version))
840+
.collect();
841+
823842
Ok(BuildQueuePage {
824843
description: "crate documentation scheduled to build & deploy",
825844
queue,
826-
active_deployments,
845+
active_cdn_deployments,
846+
in_progress_builds,
827847
csp_nonce: String::new(),
828848
})
829849
}
@@ -1695,9 +1715,9 @@ mod tests {
16951715

16961716
let empty = kuchikiki::parse_html().one(web.get("/releases/queue").send()?.text()?);
16971717
assert!(empty
1698-
.select(".release > strong")
1718+
.select(".release > div > strong")
16991719
.expect("missing heading")
1700-
.any(|el| el.text_contents().contains("active CDN deployments")));
1720+
.any(|el| dbg!(el.text_contents()).contains("active CDN deployments")));
17011721

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

templates/crate/builds.html

+8-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@
3333
<ul>
3434
{%- for build in builds -%}
3535
<li>
36+
{%- if build.build_status != "in_progress" %}
3637
<a href="/crate/{{ metadata.name }}/{{ metadata.version }}/builds/{{ build.id }}" class="release">
38+
{%- else -%}
39+
<div class="build-in-progress">
40+
{%- endif %}
3741
<div class="pure-g">
3842
<div class="pure-u-1 pure-u-sm-1-24 build">
3943
{%- if build.build_status == "success" -%}
@@ -68,12 +72,15 @@
6872
{%- endif -%}
6973
</div>
7074
</div>
75+
{%- if build.build_status != "in_progress" %}
7176
</a>
77+
{%- else -%}
78+
</div>
79+
{%- endif %}
7280
</li>
7381
{%- endfor -%}
7482
</ul>
7583
{%- else -%}
76-
{# FIXME: temporarily this will never be shown since we hide in-progress releases for now #}
7784
<div class="warning">
7885
docs.rs has not built {{ metadata.name }}-{{ metadata.version }}
7986
<br>

templates/releases/build_queue.html

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

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

4769
<div class="release">
4870
<strong>Build Queue</strong>

templates/style/style.scss

+5-3
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ div.recent-releases-container {
280280
background-color: var(--background-color);
281281
}
282282

283-
.release {
283+
.release, .build-in-progress {
284284
display: block;
285285
border-bottom: 1px solid var(--color-border);
286286
padding: 0.4em $search-result-right-left-padding;
@@ -297,11 +297,13 @@ div.recent-releases-container {
297297
}
298298

299299
.release:hover,
300-
a.release:focus {
300+
a.release:focus,
301+
.build-in-progress:hover {
301302
background-color: var(--color-background-code);
302303
}
303304

304-
li:last-of-type .release {
305+
li:last-of-type .release,
306+
li:last-of-type .build-in-progress {
305307
border-bottom: none;
306308
}
307309

0 commit comments

Comments
 (0)