fetch: Remove `DelegateStatus`
This `enum` is only used in `state.rs` and a very thin wrapper around `delegates.contains`.
This commit is contained in:
parent
363a7231e5
commit
35d71f5909
|
|
@ -24,28 +24,6 @@ pub mod error {
|
||||||
pub type Load = radicle::storage::refs::sigrefs::read::error::Read;
|
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<T = ()> {
|
|
||||||
Delegate { remote: PublicKey, data: T },
|
|
||||||
NonDelegate { remote: PublicKey, data: T },
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> DelegateStatus<T> {
|
|
||||||
pub fn new(data: T, remote: PublicKey, delegates: &BTreeSet<PublicKey>) -> Self {
|
|
||||||
if delegates.contains(&remote) {
|
|
||||||
Self::Delegate { remote, data }
|
|
||||||
} else {
|
|
||||||
Self::NonDelegate { remote, data }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn validate(
|
pub(crate) fn validate(
|
||||||
repo: &impl ValidateRepository,
|
repo: &impl ValidateRepository,
|
||||||
SignedRefsAt { sigrefs, .. }: SignedRefsAt,
|
SignedRefsAt { sigrefs, .. }: SignedRefsAt,
|
||||||
|
|
|
||||||
|
|
@ -473,20 +473,13 @@ impl FetchState {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let remote = sigrefs::DelegateStatus::new(refs, remote, &delegates);
|
match (refs, delegates.contains(&remote)) {
|
||||||
match remote {
|
(Ok(None), false) => {
|
||||||
sigrefs::DelegateStatus::NonDelegate {
|
|
||||||
remote,
|
|
||||||
data: Ok(None),
|
|
||||||
} => {
|
|
||||||
log::debug!("Pruning non-delegate {remote} tips, missing 'rad/sigrefs'");
|
log::debug!("Pruning non-delegate {remote} tips, missing 'rad/sigrefs'");
|
||||||
failures.push(sigrefs::Validation::MissingRadSigRefs(remote));
|
failures.push(sigrefs::Validation::MissingRadSigRefs(remote));
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
}
|
}
|
||||||
sigrefs::DelegateStatus::Delegate {
|
(Ok(None), true) => {
|
||||||
remote,
|
|
||||||
data: Ok(None),
|
|
||||||
} => {
|
|
||||||
log::debug!("Pruning delegate {remote} tips, missing 'rad/sigrefs'");
|
log::debug!("Pruning delegate {remote} tips, missing 'rad/sigrefs'");
|
||||||
failures.push(sigrefs::Validation::MissingRadSigRefs(remote));
|
failures.push(sigrefs::Validation::MissingRadSigRefs(remote));
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
|
|
@ -498,14 +491,7 @@ impl FetchState {
|
||||||
valid_delegates.remove(&remote);
|
valid_delegates.remove(&remote);
|
||||||
failed_delegates.insert(remote);
|
failed_delegates.insert(remote);
|
||||||
}
|
}
|
||||||
sigrefs::DelegateStatus::Delegate {
|
(Err(err), _) => {
|
||||||
remote,
|
|
||||||
data: Err(err),
|
|
||||||
}
|
|
||||||
| sigrefs::DelegateStatus::NonDelegate {
|
|
||||||
remote,
|
|
||||||
data: Err(err),
|
|
||||||
} => {
|
|
||||||
log::debug!("Pruning {remote} tips due to: {err}");
|
log::debug!("Pruning {remote} tips due to: {err}");
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
valid_delegates.remove(&remote);
|
valid_delegates.remove(&remote);
|
||||||
|
|
@ -515,10 +501,7 @@ impl FetchState {
|
||||||
source: err,
|
source: err,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
sigrefs::DelegateStatus::NonDelegate {
|
(Ok(Some(refs)), false) => {
|
||||||
remote,
|
|
||||||
data: Ok(Some(sigrefs)),
|
|
||||||
} => {
|
|
||||||
if let Some(SignedRefsAt { at, .. }) =
|
if let Some(SignedRefsAt { at, .. }) =
|
||||||
SignedRefsAt::load(remote, handle.repository())?
|
SignedRefsAt::load(remote, handle.repository())?
|
||||||
{
|
{
|
||||||
|
|
@ -526,7 +509,7 @@ impl FetchState {
|
||||||
// diverged. A diverged case is non-fatal for
|
// diverged. A diverged case is non-fatal for
|
||||||
// delegates.
|
// delegates.
|
||||||
if matches!(
|
if matches!(
|
||||||
repository::ancestry(handle.repository(), at, sigrefs.at)?,
|
repository::ancestry(handle.repository(), at, refs.at)?,
|
||||||
repository::Ancestry::Behind | repository::Ancestry::Diverged
|
repository::Ancestry::Behind | repository::Ancestry::Diverged
|
||||||
) {
|
) {
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
|
|
@ -535,7 +518,7 @@ impl FetchState {
|
||||||
}
|
}
|
||||||
|
|
||||||
let cache = self.as_cached(handle);
|
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!(
|
log::debug!(
|
||||||
"Pruning non-delegate {remote} tips, due to validation failures"
|
"Pruning non-delegate {remote} tips, due to validation failures"
|
||||||
);
|
);
|
||||||
|
|
@ -545,18 +528,15 @@ impl FetchState {
|
||||||
remotes.insert(remote);
|
remotes.insert(remote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sigrefs::DelegateStatus::Delegate {
|
(Ok(Some(refs)), true) => {
|
||||||
remote,
|
|
||||||
data: Ok(Some(sigrefs)),
|
|
||||||
} => {
|
|
||||||
if let Some(SignedRefsAt { at, .. }) =
|
if let Some(SignedRefsAt { at, .. }) =
|
||||||
SignedRefsAt::load(remote, handle.repository())?
|
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) {
|
if matches!(ancestry, repository::Ancestry::Behind) {
|
||||||
log::trace!(
|
log::trace!(
|
||||||
"Advertised `rad/sigrefs` {} is behind {at} for {remote}",
|
"Advertised `rad/sigrefs` {} is behind {at} for {remote}",
|
||||||
sigrefs.at
|
refs.at
|
||||||
);
|
);
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -564,14 +544,14 @@ impl FetchState {
|
||||||
return Err(error::Protocol::Diverged {
|
return Err(error::Protocol::Diverged {
|
||||||
remote,
|
remote,
|
||||||
current: at,
|
current: at,
|
||||||
received: sigrefs.at,
|
received: refs.at,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let cache = self.as_cached(handle);
|
let cache = self.as_cached(handle);
|
||||||
let mut fails =
|
let mut fails =
|
||||||
sigrefs::validate(&cache, sigrefs)?.unwrap_or(Validations::default());
|
sigrefs::validate(&cache, refs)?.unwrap_or(Validations::default());
|
||||||
if !fails.is_empty() {
|
if !fails.is_empty() {
|
||||||
log::debug!("Pruning delegate {remote} tips, due to validation failures");
|
log::debug!("Pruning delegate {remote} tips, due to validation failures");
|
||||||
self.prune(&remote);
|
self.prune(&remote);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue