feat: receive and render canonical ref update events

Cope with the fact that the node can now emit events for canonical
refs changing. This does NOT yet add a filter on canonical ref
updates. But at least the Ci broker shouldn't crash any more.

Signed-off-by: Lars Wirzenius <liw@liw.fi>
This commit is contained in:
Lars Wirzenius
2025-09-19 08:41:27 +03:00
parent 6f29315b46
commit 3782dc2b7b
3 changed files with 47 additions and 18 deletions
+13 -18
View File
@@ -12,7 +12,7 @@ use radicle::{
storage::RefUpdate,
};
use crate::refs::{ref_string, TagName};
use crate::refs::{ref_string, GenericRefName, TagName};
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
#[non_exhaustive]
@@ -74,6 +74,12 @@ pub enum CiEventV1 {
patch: PatchId,
new_tip: Oid,
},
CanonicalRefUpdated {
from_node: NodeId,
repo: RepoId,
refname: GenericRefName,
target: Oid,
},
}
impl CiEvent {
@@ -88,6 +94,7 @@ impl CiEvent {
Self::V1(CiEventV1::TagDeleted { from_node, .. }) => Some(from_node),
Self::V1(CiEventV1::PatchCreated { from_node, .. }) => Some(from_node),
Self::V1(CiEventV1::PatchUpdated { from_node, .. }) => Some(from_node),
Self::V1(CiEventV1::CanonicalRefUpdated { from_node, .. }) => Some(from_node),
}
}
@@ -102,6 +109,7 @@ impl CiEvent {
Self::V1(CiEventV1::TagDeleted { repo, .. }) => Some(repo),
Self::V1(CiEventV1::PatchCreated { repo, .. }) => Some(repo),
Self::V1(CiEventV1::PatchUpdated { repo, .. }) => Some(repo),
Self::V1(CiEventV1::CanonicalRefUpdated { repo, .. }) => Some(repo),
}
}
@@ -111,39 +119,25 @@ impl CiEvent {
Self::V1(CiEventV1::BranchCreated { branch, .. }) => Some(branch),
Self::V1(CiEventV1::BranchUpdated { branch, .. }) => Some(branch),
Self::V1(CiEventV1::BranchDeleted { branch, .. }) => Some(branch),
Self::V1(CiEventV1::TagCreated { .. }) => None,
Self::V1(CiEventV1::TagUpdated { .. }) => None,
Self::V1(CiEventV1::TagDeleted { .. }) => None,
Self::V1(CiEventV1::PatchCreated { .. }) => None,
Self::V1(CiEventV1::PatchUpdated { .. }) => None,
_ => None,
}
}
pub fn tag(&self) -> Option<&TagName> {
match self {
Self::V1(CiEventV1::Shutdown) => None,
Self::V1(CiEventV1::BranchCreated { .. }) => None,
Self::V1(CiEventV1::BranchUpdated { .. }) => None,
Self::V1(CiEventV1::BranchDeleted { .. }) => None,
Self::V1(CiEventV1::TagCreated { tag, .. }) => Some(tag),
Self::V1(CiEventV1::TagUpdated { tag, .. }) => Some(tag),
Self::V1(CiEventV1::TagDeleted { tag, .. }) => Some(tag),
Self::V1(CiEventV1::PatchCreated { .. }) => None,
Self::V1(CiEventV1::PatchUpdated { .. }) => None,
_ => None,
}
}
pub fn patch_id(&self) -> Option<&PatchId> {
match self {
Self::V1(CiEventV1::Shutdown) => None,
Self::V1(CiEventV1::BranchCreated { .. }) => None,
Self::V1(CiEventV1::BranchUpdated { .. }) => None,
Self::V1(CiEventV1::BranchDeleted { .. }) => None,
Self::V1(CiEventV1::TagCreated { .. }) => None,
Self::V1(CiEventV1::TagUpdated { .. }) => None,
Self::V1(CiEventV1::TagDeleted { .. }) => None,
Self::V1(CiEventV1::PatchCreated { patch, .. }) => Some(patch),
Self::V1(CiEventV1::PatchUpdated { patch, .. }) => Some(patch),
_ => None,
}
}
@@ -158,6 +152,7 @@ impl CiEvent {
Self::V1(CiEventV1::TagDeleted { tip, .. }) => Some(tip),
Self::V1(CiEventV1::PatchCreated { new_tip, .. }) => Some(new_tip),
Self::V1(CiEventV1::PatchUpdated { new_tip, .. }) => Some(new_tip),
Self::V1(CiEventV1::CanonicalRefUpdated { target, .. }) => Some(target),
}
}
+6
View File
@@ -280,6 +280,12 @@ impl PageData {
patch,
new_tip,
}) => render_event(repo, self.repo_alias(*repo), &patch.to_string(), new_tip),
CiEvent::V1(CiEventV1::CanonicalRefUpdated {
from_node: _,
repo,
refname,
target,
}) => render_event(repo, self.repo_alias(*repo), refname.as_str(), target),
};
table.push_child(
+28
View File
@@ -9,6 +9,34 @@ use radicle::{
git::{BranchName, Component, Namespaced, Qualified, RefStr, RefString},
};
/// A generic ref name.
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
pub struct GenericRefName(RefString);
impl GenericRefName {
pub fn as_str(&self) -> &str {
self.as_ref()
}
}
impl AsRef<str> for GenericRefName {
fn as_ref(&self) -> &str {
self.0.as_str()
}
}
impl From<Qualified<'_>> for GenericRefName {
fn from(from: Qualified<'_>) -> Self {
Self::from(&from)
}
}
impl From<&Qualified<'_>> for GenericRefName {
fn from(from: &Qualified<'_>) -> Self {
Self(from.to_ref_string())
}
}
/// A tag name.
///
/// This is exactly like a [`RefString`], but meant to have stronger