From 0fbfbc5721b09eb2b998640004cdcfae7b7e5486 Mon Sep 17 00:00:00 2001 From: cloudhead Date: Fri, 19 Jan 2024 16:30:24 +0100 Subject: [PATCH] Make sure `preferredSeeds` has a default If the user already has a config, the preferred seeds list is not populated. We fix that here by giving it a default value. --- radicle-cli/src/commands/init.rs | 4 ++-- radicle-cli/tests/commands.rs | 8 ++++---- radicle-node/src/test/environment.rs | 5 ++--- radicle-remote-helper/src/push.rs | 2 +- radicle/src/profile.rs | 30 +++++++++++++++++++++++++--- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/radicle-cli/src/commands/init.rs b/radicle-cli/src/commands/init.rs index 1073334c..0b41a6cb 100644 --- a/radicle-cli/src/commands/init.rs +++ b/radicle-cli/src/commands/init.rs @@ -373,7 +373,7 @@ fn sync( } // Connect to preferred seeds in case we aren't connected. - for seed in &config.preferred_seeds { + for seed in config.preferred_seeds.iter() { if !sessions.iter().any(|s| s.nid == seed.id) { commands::rad_node::control::connect( node, @@ -421,7 +421,7 @@ fn sync( )); spinner.finish(); - for seed in &config.preferred_seeds { + for seed in config.preferred_seeds.iter() { if replicas.contains(&seed.id) { return Ok(SyncResult::Synced { result: Some(config.public_explorer.url(seed.addr.host.to_string(), rid)), diff --git a/radicle-cli/tests/commands.rs b/radicle-cli/tests/commands.rs index ae973a24..1a888785 100644 --- a/radicle-cli/tests/commands.rs +++ b/radicle-cli/tests/commands.rs @@ -10,7 +10,7 @@ use radicle::node::Handle as _; use radicle::node::{Alias, DEFAULT_TIMEOUT}; use radicle::prelude::Id; use radicle::profile; -use radicle::profile::Home; +use radicle::profile::{Home, PreferredSeeds}; use radicle::storage::{ReadStorage, RemoteRepository}; use radicle::test::fixtures; @@ -1213,7 +1213,7 @@ fn rad_init_sync_preferred() { .spawn(); let bob = environment.profile(profile::Config { - preferred_seeds: vec![alice.address()], + preferred_seeds: PreferredSeeds::from(vec![alice.address()]), ..config::profile("bob") }); let mut bob = Node::new(bob).spawn(); @@ -1245,7 +1245,7 @@ fn rad_init_sync_timeout() { .spawn(); let bob = environment.profile(profile::Config { - preferred_seeds: vec![alice.address()], + preferred_seeds: PreferredSeeds::from(vec![alice.address()]), ..config::profile("bob") }); let mut bob = Node::new(bob).spawn(); @@ -1821,7 +1821,7 @@ fn rad_patch_open_explore() { .spawn(); let bob = environment.profile(profile::Config { - preferred_seeds: vec![seed.address()], + preferred_seeds: PreferredSeeds::from(vec![seed.address()]), ..config::profile("bob") }); let mut bob = Node::new(bob).spawn(); diff --git a/radicle-node/src/test/environment.rs b/radicle-node/src/test/environment.rs index 64648dc8..f736bc38 100644 --- a/radicle-node/src/test/environment.rs +++ b/radicle-node/src/test/environment.rs @@ -23,8 +23,7 @@ use radicle::node::Database; use radicle::node::{Alias, POLICIES_DB_FILE}; use radicle::node::{ConnectOptions, Handle as _}; use radicle::profile; -use radicle::profile::Home; -use radicle::profile::Profile; +use radicle::profile::{Home, PreferredSeeds, Profile}; use radicle::rad; use radicle::storage::{ReadStorage as _, RemoteRepository as _, SignRepository as _}; use radicle::test::fixtures; @@ -92,7 +91,7 @@ impl Environment { node: node::Config::test(alias), cli: cli::Config { hints: false }, public_explorer: explorer::Explorer::default(), - preferred_seeds: vec![], + preferred_seeds: PreferredSeeds::from(vec![]), } } diff --git a/radicle-remote-helper/src/push.rs b/radicle-remote-helper/src/push.rs index c81311f5..1fefae51 100644 --- a/radicle-remote-helper/src/push.rs +++ b/radicle-remote-helper/src/push.rs @@ -672,7 +672,7 @@ fn sync( } let mut urls = Vec::new(); - for seed in &profile.config.preferred_seeds { + for seed in profile.config.preferred_seeds.iter() { if replicated.contains(&seed.id) { for resource in updated { let url = profile diff --git a/radicle/src/profile.rs b/radicle/src/profile.rs index 71042505..1c9caad5 100644 --- a/radicle/src/profile.rs +++ b/radicle/src/profile.rs @@ -14,7 +14,7 @@ use std::io::Write; use std::path::{Path, PathBuf}; use std::{fs, io, str::FromStr}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use thiserror::Error; use crate::crypto::ssh::agent::Agent; @@ -122,7 +122,7 @@ pub struct Config { /// Preferred seeds. These seeds will be used for explorer links /// and in other situations when a seed needs to be chosen. #[serde(default)] - pub preferred_seeds: Vec, + pub preferred_seeds: PreferredSeeds, /// CLI configuration. #[serde(default)] pub cli: cli::Config, @@ -135,7 +135,7 @@ impl Config { pub fn new(alias: Alias) -> Self { Self { public_explorer: Explorer::default(), - preferred_seeds: vec![node::config::seeds::RADICLE_COMMUNITY_NODE.clone()], + preferred_seeds: PreferredSeeds::default(), cli: cli::Config::default(), node: node::Config::new(alias), } @@ -189,6 +189,30 @@ impl Config { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(transparent)] +pub struct PreferredSeeds(Vec); + +impl From> for PreferredSeeds { + fn from(value: Vec) -> Self { + Self(value) + } +} + +impl Default for PreferredSeeds { + fn default() -> Self { + Self(vec![node::config::seeds::RADICLE_COMMUNITY_NODE.clone()]) + } +} + +impl std::ops::Deref for PreferredSeeds { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + #[derive(Debug, Clone)] pub struct Profile { pub home: Home,