diff --git a/crates/radicle-fetch/src/sigrefs.rs b/crates/radicle-fetch/src/sigrefs.rs index a7930473..3ce121c1 100644 --- a/crates/radicle-fetch/src/sigrefs.rs +++ b/crates/radicle-fetch/src/sigrefs.rs @@ -24,28 +24,6 @@ pub mod error { pub type Load = radicle::storage::refs::sigrefs::read::error::Read; } -/// A data carrier that associates that data with whether a given -/// `PublicKey` is a delegate or a non-delegate. -/// -/// Construct a `DelegateStatus` via [`DelegateStatus::empty`], if no -/// data is required, or [`DelegateStatus::new`] if there is data to -/// associate. -#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] -pub(crate) enum DelegateStatus { - Delegate { remote: PublicKey, data: T }, - NonDelegate { remote: PublicKey, data: T }, -} - -impl DelegateStatus { - pub fn new(data: T, remote: PublicKey, delegates: &BTreeSet) -> Self { - if delegates.contains(&remote) { - Self::Delegate { remote, data } - } else { - Self::NonDelegate { remote, data } - } - } -} - pub(crate) fn validate( repo: &impl ValidateRepository, SignedRefsAt { sigrefs, .. }: SignedRefsAt, diff --git a/crates/radicle-fetch/src/state.rs b/crates/radicle-fetch/src/state.rs index 78b7963d..d540812c 100644 --- a/crates/radicle-fetch/src/state.rs +++ b/crates/radicle-fetch/src/state.rs @@ -473,20 +473,13 @@ impl FetchState { continue; } - let remote = sigrefs::DelegateStatus::new(refs, remote, &delegates); - match remote { - sigrefs::DelegateStatus::NonDelegate { - remote, - data: Ok(None), - } => { + match (refs, delegates.contains(&remote)) { + (Ok(None), false) => { log::debug!("Pruning non-delegate {remote} tips, missing 'rad/sigrefs'"); failures.push(sigrefs::Validation::MissingRadSigRefs(remote)); self.prune(&remote); } - sigrefs::DelegateStatus::Delegate { - remote, - data: Ok(None), - } => { + (Ok(None), true) => { log::debug!("Pruning delegate {remote} tips, missing 'rad/sigrefs'"); failures.push(sigrefs::Validation::MissingRadSigRefs(remote)); self.prune(&remote); @@ -498,14 +491,7 @@ impl FetchState { valid_delegates.remove(&remote); failed_delegates.insert(remote); } - sigrefs::DelegateStatus::Delegate { - remote, - data: Err(err), - } - | sigrefs::DelegateStatus::NonDelegate { - remote, - data: Err(err), - } => { + (Err(err), _) => { log::debug!("Pruning {remote} tips due to: {err}"); self.prune(&remote); valid_delegates.remove(&remote); @@ -515,10 +501,7 @@ impl FetchState { source: err, }); } - sigrefs::DelegateStatus::NonDelegate { - remote, - data: Ok(Some(sigrefs)), - } => { + (Ok(Some(refs)), false) => { if let Some(SignedRefsAt { at, .. }) = SignedRefsAt::load(remote, handle.repository())? { @@ -526,7 +509,7 @@ impl FetchState { // diverged. A diverged case is non-fatal for // delegates. if matches!( - repository::ancestry(handle.repository(), at, sigrefs.at)?, + repository::ancestry(handle.repository(), at, refs.at)?, repository::Ancestry::Behind | repository::Ancestry::Diverged ) { self.prune(&remote); @@ -535,7 +518,7 @@ impl FetchState { } let cache = self.as_cached(handle); - if let Some(warns) = sigrefs::validate(&cache, sigrefs)?.as_mut() { + if let Some(warns) = sigrefs::validate(&cache, refs)?.as_mut() { log::debug!( "Pruning non-delegate {remote} tips, due to validation failures" ); @@ -545,18 +528,15 @@ impl FetchState { remotes.insert(remote); } } - sigrefs::DelegateStatus::Delegate { - remote, - data: Ok(Some(sigrefs)), - } => { + (Ok(Some(refs)), true) => { if let Some(SignedRefsAt { at, .. }) = SignedRefsAt::load(remote, handle.repository())? { - let ancestry = repository::ancestry(handle.repository(), at, sigrefs.at)?; + let ancestry = repository::ancestry(handle.repository(), at, refs.at)?; if matches!(ancestry, repository::Ancestry::Behind) { log::trace!( "Advertised `rad/sigrefs` {} is behind {at} for {remote}", - sigrefs.at + refs.at ); self.prune(&remote); continue; @@ -564,14 +544,14 @@ impl FetchState { return Err(error::Protocol::Diverged { remote, current: at, - received: sigrefs.at, + received: refs.at, }); } } let cache = self.as_cached(handle); let mut fails = - sigrefs::validate(&cache, sigrefs)?.unwrap_or(Validations::default()); + sigrefs::validate(&cache, refs)?.unwrap_or(Validations::default()); if !fails.is_empty() { log::debug!("Pruning delegate {remote} tips, due to validation failures"); self.prune(&remote);