fc-common: update notifications to handle all BuildStatus variants

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I99db557ae204f3a4ffec6be70386ecc16a6a6964
This commit is contained in:
raf 2026-02-16 13:00:15 +03:00
commit 5b7648220c
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -48,8 +48,9 @@ pub async fn dispatch_build_finished(
}
// 5. Email notification
let is_failure = !build.status.is_success();
if let Some(ref email_config) = config.email
&& (!email_config.on_failure_only || build.status == BuildStatus::Failed)
&& (!email_config.on_failure_only || is_failure)
{
send_email_notification(email_config, build, project).await;
}
@ -57,10 +58,18 @@ pub async fn dispatch_build_finished(
async fn run_command_notification(cmd: &str, build: &Build, project: &Project) {
let status_str = match build.status {
BuildStatus::Completed => "success",
BuildStatus::Failed => "failure",
BuildStatus::Succeeded | BuildStatus::CachedFailure => "success",
BuildStatus::Failed
| BuildStatus::DependencyFailed
| BuildStatus::FailedWithOutput
| BuildStatus::Timeout
| BuildStatus::LogLimitExceeded
| BuildStatus::NarSizeLimitExceeded
| BuildStatus::NonDeterministic => "failure",
BuildStatus::Cancelled => "cancelled",
_ => "unknown",
BuildStatus::Aborted => "aborted",
BuildStatus::UnsupportedSystem => "skipped",
BuildStatus::Pending | BuildStatus::Running => "pending",
};
let result = tokio::process::Command::new("sh")
@ -107,11 +116,21 @@ async fn set_github_status(
};
let (state, description) = match build.status {
BuildStatus::Completed => ("success", "Build succeeded"),
BuildStatus::Failed => ("failure", "Build failed"),
BuildStatus::Succeeded | BuildStatus::CachedFailure => {
("success", "Build succeeded")
},
BuildStatus::Failed
| BuildStatus::DependencyFailed
| BuildStatus::FailedWithOutput
| BuildStatus::NonDeterministic => ("failure", "Build failed"),
BuildStatus::Running => ("pending", "Build in progress"),
BuildStatus::Pending => ("pending", "Build queued"),
BuildStatus::Cancelled => ("error", "Build cancelled"),
BuildStatus::Aborted => ("error", "Build aborted"),
BuildStatus::Timeout => ("error", "Build timed out"),
BuildStatus::UnsupportedSystem => ("error", "Unsupported system"),
BuildStatus::LogLimitExceeded => ("error", "Log limit exceeded"),
BuildStatus::NarSizeLimitExceeded => ("error", "NAR size limit exceeded"),
};
let url =
@ -160,11 +179,21 @@ async fn set_gitea_status(
};
let (state, description) = match build.status {
BuildStatus::Completed => ("success", "Build succeeded"),
BuildStatus::Failed => ("failure", "Build failed"),
BuildStatus::Succeeded | BuildStatus::CachedFailure => {
("success", "Build succeeded")
},
BuildStatus::Failed
| BuildStatus::DependencyFailed
| BuildStatus::FailedWithOutput
| BuildStatus::NonDeterministic => ("failure", "Build failed"),
BuildStatus::Running => ("pending", "Build in progress"),
BuildStatus::Pending => ("pending", "Build queued"),
BuildStatus::Cancelled => ("error", "Build cancelled"),
BuildStatus::Aborted => ("error", "Build aborted"),
BuildStatus::Timeout => ("error", "Build timed out"),
BuildStatus::UnsupportedSystem => ("error", "Unsupported system"),
BuildStatus::LogLimitExceeded => ("error", "Log limit exceeded"),
BuildStatus::NarSizeLimitExceeded => ("error", "NAR size limit exceeded"),
};
let url = format!("{base_url}/api/v1/repos/{owner}/{repo}/statuses/{commit}");
@ -211,11 +240,21 @@ async fn set_gitlab_status(
// GitLab uses different state names
let (state, description) = match build.status {
BuildStatus::Completed => ("success", "Build succeeded"),
BuildStatus::Failed => ("failed", "Build failed"),
BuildStatus::Succeeded | BuildStatus::CachedFailure => {
("success", "Build succeeded")
},
BuildStatus::Failed
| BuildStatus::DependencyFailed
| BuildStatus::FailedWithOutput
| BuildStatus::NonDeterministic => ("failed", "Build failed"),
BuildStatus::Running => ("running", "Build in progress"),
BuildStatus::Pending => ("pending", "Build queued"),
BuildStatus::Cancelled => ("canceled", "Build cancelled"),
BuildStatus::Aborted => ("canceled", "Build aborted"),
BuildStatus::Timeout => ("failed", "Build timed out"),
BuildStatus::UnsupportedSystem => ("skipped", "Unsupported system"),
BuildStatus::LogLimitExceeded => ("failed", "Log limit exceeded"),
BuildStatus::NarSizeLimitExceeded => ("failed", "NAR size limit exceeded"),
};
// URL-encode the project path for the API
@ -318,10 +357,18 @@ async fn send_email_notification(
};
let status_str = match build.status {
BuildStatus::Completed => "SUCCESS",
BuildStatus::Failed => "FAILURE",
BuildStatus::Succeeded | BuildStatus::CachedFailure => "SUCCESS",
BuildStatus::Failed
| BuildStatus::DependencyFailed
| BuildStatus::FailedWithOutput
| BuildStatus::Timeout
| BuildStatus::LogLimitExceeded
| BuildStatus::NarSizeLimitExceeded
| BuildStatus::NonDeterministic => "FAILURE",
BuildStatus::Cancelled => "CANCELLED",
_ => "UNKNOWN",
BuildStatus::Aborted => "ABORTED",
BuildStatus::UnsupportedSystem => "UNSUPPORTED",
BuildStatus::Pending | BuildStatus::Running => "PENDING",
};
let subject = format!(