Compare commits

...

3 commits

Author SHA1 Message Date
e523607cbc Improve design
Highlight that there are build details available with a `[details]`
link which wasn't obvious before.
2025-11-14 22:16:32 +01:00
5b62eaff57 Add more information 2025-11-14 22:01:29 +01:00
Jens Reidel
9c71be05a8 Sign me up for some target notifications
Signed-off-by: Jens Reidel <adrian@travitia.xyz>
2025-11-14 21:43:12 +01:00
7 changed files with 78 additions and 25 deletions

View file

@ -53,8 +53,10 @@ async fn main_inner() -> Result<()> {
)
.await?;
let notification_repo = format!("https://github.com/{github_owner}/{github_repo}");
let builder = build::background_builder(db.clone(), github_client);
let server = web::webserver(db);
let server = web::webserver(db, notification_repo);
tokio::select! {
result = builder => {

View file

@ -7,7 +7,24 @@ use crate::db::{Db, FullBuildInfo, NotificationIssue, NotificationStatus, Status
pub const TABLE_FILE: &str = file!();
pub const TABLE_LINE: u32 = line!() + 1;
const TARGET_NOTIFICATIONS: &[(&str, &[&str])] = &[("armv7-sony-vita-newlibeabihf", &["pheki"])];
const TARGET_NOTIFICATIONS: &[(&str, &[&str])] = &[
("aarch64-unknown-linux-musl", &["Gelbpunkt", "famfo"]),
(
"aarch64_be-unknown-linux-musl",
&["Gelbpunkt", "neuschaefer"],
),
("aarch64_be-unknown-none-softfloat", &["Gelbpunkt"]),
("armv7-sony-vita-newlibeabihf", &["pheki"]),
("mips64-unknown-linux-muslabi64", &["Gelbpunkt"]),
(
"powerpc64-unknown-linux-musl",
&["Gelbpunkt", "famfo", "neuschaefer"],
),
(
"powerpc64le-unknown-linux-musl",
&["Gelbpunkt", "famfo", "neuschaefer"],
),
];
pub fn notification_pr_url() -> String {
format!("https://github.com/Noratrieb/does-it-build/blob/main/{TABLE_FILE}#L{TABLE_LINE}")

View file

@ -19,9 +19,10 @@ use crate::{
#[derive(Clone)]
pub struct AppState {
pub db: Db,
notification_repo: String,
}
pub async fn webserver(db: Db) -> Result<()> {
pub async fn webserver(db: Db, notification_repo: String) -> Result<()> {
let app = Router::new()
.route("/", get(web_root))
.route("/build", get(web_build))
@ -29,7 +30,10 @@ pub async fn webserver(db: Db) -> Result<()> {
.route("/nightly", get(web_nightly))
.route("/index.css", get(index_css))
.route("/index.js", get(index_js))
.with_state(AppState { db });
.with_state(AppState {
db,
notification_repo,
});
info!("Serving website on port 3000 (commit {})", crate::VERSION);
@ -80,6 +84,7 @@ async fn web_build(State(state): State<AppState>, Query(query): Query<BuildQuery
status: Status,
build_date: Option<String>,
build_duration_s: Option<f32>,
notification_pr_url: String,
does_it_build_version: Option<String>,
}
@ -109,6 +114,7 @@ async fn web_build(State(state): State<AppState>, Query(query): Query<BuildQuery
build_duration_s: build
.build_duration_ms
.map(|build_duration_ms| (build_duration_ms as f32) / 1000.0),
notification_pr_url: notification::notification_pr_url(),
does_it_build_version: build.does_it_build_version,
};
Html(page.render().unwrap()).into_response()
@ -139,6 +145,8 @@ async fn web_target(State(state): State<AppState>, Query(query): Query<TargetQue
showing_failures: bool,
notification_pr_url: String,
maintainers: Option<&'static [&'static str]>,
open_notification_issue_number: Option<i64>,
notification_repo: String,
}
let filter_failures = query.failures.unwrap_or(false);
@ -176,6 +184,14 @@ async fn web_target(State(state): State<AppState>, Query(query): Query<TargetQue
let maintainers = notification::maintainers_for_target(&query.target);
let notification_issue = state
.db
.find_existing_notification(&query.target)
.await
.map_err(|err| {
error!(?err, "Error finding existing notification");
});
let page = TargetPage {
status,
target: query.target,
@ -184,6 +200,11 @@ async fn web_target(State(state): State<AppState>, Query(query): Query<TargetQue
showing_failures: filter_failures,
notification_pr_url: notification::notification_pr_url(),
maintainers,
open_notification_issue_number: notification_issue
.ok()
.flatten()
.map(|issue| issue.issue_number),
notification_repo: state.notification_repo,
};
Html(page.render().unwrap()).into_response()

View file

@ -18,7 +18,7 @@ table {
th,
td {
padding: 2px 5px;
padding: 2px 10px;
}
tr:not(:last-child) {
@ -40,32 +40,28 @@ tr:not(:last-child) {
background-color: light-dark(lightgray, rgb(85, 85, 85));
}
.target-header {
writing-mode: sideways-lr;
}
.build-indicator-big {
padding: 10px;
margin-top: 20px;
}
.build-cell {
.build-details-link {
display: flex;
align-items: center;
text-decoration: none;
}
.build-details-emoji {
padding: 5px;
font-size: 2rem;
}
.build-info-a {
color: black;
text-decoration: none;
height: 100%;
width: 100%;
padding: 5px;
.build-details-text {
text-decoration: underline;
}
.footer {
margin-top: 20px;
display: flex;
align-items: center;
gap: 10px;
margin-top: 40px;
}
@media (prefers-color-scheme: dark) {

View file

@ -14,6 +14,11 @@
<a href="/target?target={{target}}">{{target}}</a> ({{mode}})
</h1>
<a href="/">Home</a>
<p>
🔔 does-it-build supports sending notifications to target maintainers via
GitHub issues. You can add yourself with
<a href="{{notification_pr_url}}">a PR</a>. 🔔
</p>
<div class="{{status}} build-indicator-big">{{status}}</div>
{% if let Some(rustflags) = rustflags %}
<p>

View file

@ -52,8 +52,11 @@
<td><a href="/target?target={{build.0}}">{{ build.0 }}</a></td>
{% match build.2 %} {% when Some with (build) %}
<td class="build-cell">
<a class="build-info-a" href="{{ build.link() }}">
<span> {{ build.status.to_emoji() }} </span>
<a href="{{ build.link() }}" class="build-details-link">
<span class="build-details-emoji">
{{ build.status.to_emoji() }}
</span>
<span class="build-details-text">[details]</span>
</a>
</td>
{% when None %}

View file

@ -1,4 +1,4 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
@ -38,6 +38,12 @@
{% endfor %}
</p>
{% endif %}
{% if let Some(issue) = open_notification_issue_number %}
<p>
There is currently an open issue with a maintainer ping:
<a href="{{notification_repo}}/issues/{{issue}}">{{notification_repo}}/issues/{{issue}}</a>
</p>
{% endif %}
{% if showing_failures %}
<p>
<a href="/target?target={{target}}">show all</a>
@ -57,8 +63,11 @@
<td><a href="/nightly?nightly={{build.0}}">{{ build.0 }}</a></td>
{% match build.2 %} {% when Some with (build) %}
<td class="build-cell">
<a class="build-info-a" href="{{ build.link() }}">
<span> {{ build.status.to_emoji() }} </span>
<a href="{{ build.link() }}" class="build-details-link">
<span class="build-details-emoji">
{{ build.status.to_emoji() }}
</span>
<span class="build-details-text">[details]</span>
</a>
</td>
{% when None %}