fix(#1896): remove dead forge_notify reason drop-list + auto-unsubscribe
This commit is contained in:
parent
ca44fd56df
commit
9f40bd13f9
4 changed files with 20 additions and 182 deletions
|
|
@ -11,9 +11,8 @@
|
|||
//!
|
||||
//! Activation gates, self-notification filtering, body excerpt +
|
||||
//! truncation + heading escape, wrapper formats (comment / review /
|
||||
//! new-item / state-change), meta suffix, review-request override,
|
||||
//! reason drop-list, and auto-unsubscribe on broad watches all live
|
||||
//! in [`docs/forge.md::Notification poller`](../../../docs/forge.md).
|
||||
//! new-item / state-change), meta suffix, and review-request override
|
||||
//! all live in [`docs/forge.md::Notification poller`](../../../docs/forge.md).
|
||||
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::fmt::Write as _;
|
||||
|
|
@ -119,31 +118,7 @@ pub async fn run(socket: PathBuf) {
|
|||
// socket becoming available right at boot.
|
||||
interval.tick().await;
|
||||
|
||||
// HIVE_FORGE_KEEP_SUBSCRIPTIONS=1 disables auto-unsubscribe for agents
|
||||
// that intentionally consume the full repo notification firehose (e.g. triage).
|
||||
let keep_subscriptions = std::env::var("HIVE_FORGE_KEEP_SUBSCRIPTIONS")
|
||||
.is_ok_and(|v| v == "1" || v.eq_ignore_ascii_case("true"));
|
||||
|
||||
// Optional reason drop-list — comma-separated Forgejo `reason`
|
||||
// values to silently mark-read instead of deliver. See
|
||||
// `docs/forge.md::Reason drop-list` for the drop-vs-allow rationale.
|
||||
let skip_reasons: Vec<String> = std::env::var("HIVE_FORGE_NOTIFY_SKIP_REASONS")
|
||||
.unwrap_or_default()
|
||||
.split(',')
|
||||
.map(str::trim)
|
||||
.filter(|s| !s.is_empty())
|
||||
.map(str::to_owned)
|
||||
.collect();
|
||||
|
||||
if skip_reasons.is_empty() {
|
||||
info!(forge_url = %forge_url, "forge_notify: polling started (all reasons)");
|
||||
} else {
|
||||
info!(forge_url = %forge_url, skip = ?skip_reasons, "forge_notify: polling started");
|
||||
}
|
||||
|
||||
// Repos we have already unsubscribed this process lifetime. Persists
|
||||
// across polls so we don't hammer DELETE on every cycle.
|
||||
let mut unsubbed_repos: HashSet<String> = HashSet::new();
|
||||
info!(forge_url = %forge_url, "forge_notify: polling started");
|
||||
|
||||
// Delivery-dedupe cursor: notification thread id -> the `updated_at`
|
||||
// of the version we last woke the agent for. We no longer mark a
|
||||
|
|
@ -165,11 +140,8 @@ pub async fn run(socket: PathBuf) {
|
|||
&forge_url,
|
||||
&token,
|
||||
&socket,
|
||||
keep_subscriptions,
|
||||
&mut unsubbed_repos,
|
||||
&mut delivered,
|
||||
&own_login,
|
||||
&skip_reasons,
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
|
@ -739,12 +711,6 @@ fn days_from_civil(y: i64, m: i64, d: i64) -> i64 {
|
|||
era * 146_097 + doe - 719_468
|
||||
}
|
||||
|
||||
#[allow(
|
||||
clippy::too_many_arguments,
|
||||
reason = "the notification poll's config + mutable subscription / \
|
||||
delivery-dedupe state, wired once from the poll loop; a struct \
|
||||
would just move the same fields one level out"
|
||||
)]
|
||||
#[allow(
|
||||
clippy::too_many_lines,
|
||||
reason = "single-pass notification poll loop — split would obscure the \
|
||||
|
|
@ -756,11 +722,8 @@ async fn poll_once(
|
|||
forge_url: &str,
|
||||
token: &str,
|
||||
socket: &Path,
|
||||
keep_subscriptions: bool,
|
||||
unsubbed_repos: &mut HashSet<String>,
|
||||
delivered: &mut HashMap<u64, String>,
|
||||
own_login: &str,
|
||||
skip_reasons: &[String],
|
||||
) {
|
||||
let url = format!("{forge_url}/api/v1/notifications?all=false&limit=50");
|
||||
let resp = match client
|
||||
|
|
@ -814,18 +777,6 @@ async fn poll_once(
|
|||
continue;
|
||||
}
|
||||
|
||||
// Reason drop-list: suppress noisy reasons; null/unknown pass
|
||||
// through so directed signals stay deliverable (see
|
||||
// `docs/forge.md::Reason drop-list`).
|
||||
if !skip_reasons.is_empty() {
|
||||
let reason = notif["reason"].as_str().unwrap_or("");
|
||||
if !reason.is_empty() && skip_reasons.iter().any(|r| r == reason) {
|
||||
debug!(%id, %reason, "forge_notify: skipping (reason in drop-list)");
|
||||
mark_read(client, forge_url, token, id).await;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
let body_opt = format_notification(client, token, notif, own_login).await;
|
||||
|
||||
// None means self-echo — mark read silently, no delivery.
|
||||
|
|
@ -850,44 +801,12 @@ async fn poll_once(
|
|||
// deliberate: the hive-forge read-before-comment guard keys
|
||||
// off forge's own unread-state, and the agent reading the
|
||||
// thread via the CLI is what marks it read. Recorded only
|
||||
// here in the Ok arm — a failed delivery hits the Err arm
|
||||
// and `continue`s without recording, so it re-delivers next
|
||||
// tick.
|
||||
// here in the Ok arm — a failed delivery leaves the cursor
|
||||
// untouched, so it re-delivers next tick.
|
||||
delivered.insert(id, updated_at);
|
||||
}
|
||||
Err(e) => {
|
||||
warn!(%id, error = ?e, "forge_notify: deliver failed — leaving unread");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-unsubscribe from broad repo watches after delivering a
|
||||
// `subscribed` notification. Gated by HIVE_FORGE_KEEP_SUBSCRIPTIONS
|
||||
// for triage / firehose agents (see
|
||||
// `docs/forge.md::Auto-unsubscribe on broad watches`).
|
||||
let reason = notif["reason"].as_str().unwrap_or("");
|
||||
if !keep_subscriptions
|
||||
&& reason == "subscribed"
|
||||
&& let Some(repo) = notif["repository"]["full_name"].as_str()
|
||||
&& !unsubbed_repos.contains(repo)
|
||||
{
|
||||
let unsub_url = format!("{forge_url}/api/v1/repos/{repo}/subscription");
|
||||
match client
|
||||
.delete(&unsub_url)
|
||||
.header("Authorization", format!("token {token}"))
|
||||
.send()
|
||||
.await
|
||||
{
|
||||
Ok(r) if r.status().is_success() || r.status().as_u16() == 404 => {
|
||||
debug!(%repo, "forge_notify: unsubscribed from repo watch");
|
||||
unsubbed_repos.insert(repo.to_owned());
|
||||
}
|
||||
Ok(r) => {
|
||||
debug!(%repo, status = %r.status(), "forge_notify: unsub non-2xx (ignored)");
|
||||
}
|
||||
Err(e) => {
|
||||
debug!(%repo, error = ?e, "forge_notify: unsub request failed (ignored)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue