upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/purgatory
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-26 15:38:51 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-26 15:38:51 +0000
commita2ecfc5a63311570f0f90c7ee40117e289639cb8 (patch)
tree0c5208cb7d606be4b431cda813b09dcc64a50e23 /src/purgatory
parentb13c6d924f7de5ff34405254b8bb21adf33c78c0 (diff)
fix: ignore peeled tag entries (^{}) in state event ref parsing
State events (kind 30618) can include refs/tags/<name>^{} entries which are git's notation for the dereferenced commit behind an annotated tag. These are not real git refs and are never sent as part of a push. extract_refs_from_state and RepositoryState::from_event were treating them as real refs, causing can_satisfy_state to reject valid annotated tag pushes: the would-be state after the push lacked the spurious ^{} entry, so the exact-equality check always failed.
Diffstat (limited to 'src/purgatory')
-rw-r--r--src/purgatory/helpers.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/purgatory/helpers.rs b/src/purgatory/helpers.rs
index a9f6e66..319711b 100644
--- a/src/purgatory/helpers.rs
+++ b/src/purgatory/helpers.rs
@@ -58,7 +58,11 @@ pub fn extract_refs_from_state(event: &Event) -> Vec<RefPair> {
58 let ref_str = ref_name.as_ref(); 58 let ref_str = ref_name.as_ref();
59 59
60 // Only process refs/heads/* and refs/tags/* 60 // Only process refs/heads/* and refs/tags/*
61 if ref_str.starts_with("refs/heads/") || ref_str.starts_with("refs/tags/") { 61 // Exclude peeled tag notation (e.g. "refs/tags/v1.0.0^{}") — these are
62 // git's internal dereference markers, not real refs that get pushed.
63 if (ref_str.starts_with("refs/heads/") || ref_str.starts_with("refs/tags/"))
64 && !ref_str.ends_with("^{}")
65 {
62 // Get the object SHA (first value in tag) 66 // Get the object SHA (first value in tag)
63 let parts = tag.clone().to_vec(); 67 let parts = tag.clone().to_vec();
64 if parts.len() >= 2 { 68 if parts.len() >= 2 {