From af35e6f4d04735c33cc10777d6421a61555db754 Mon Sep 17 00:00:00 2001 From: Lorenz Leutgeb Date: Thu, 5 Jun 2025 20:16:36 +0200 Subject: [PATCH] radicle-cli: Warn when using old names of nodes --- .../examples/rad-warn-old-nodes.md | 55 +++++++++++++++++++ crates/radicle-cli/src/commands/debug.rs | 11 ++++ .../radicle-cli/src/commands/node/control.rs | 4 ++ crates/radicle-cli/src/lib.rs | 2 + crates/radicle-cli/src/warning.rs | 47 ++++++++++++++++ crates/radicle-cli/tests/commands.rs | 15 +++++ 6 files changed, 134 insertions(+) create mode 100644 crates/radicle-cli/examples/rad-warn-old-nodes.md create mode 100644 crates/radicle-cli/src/warning.rs diff --git a/crates/radicle-cli/examples/rad-warn-old-nodes.md b/crates/radicle-cli/examples/rad-warn-old-nodes.md new file mode 100644 index 00000000..1adef0ba --- /dev/null +++ b/crates/radicle-cli/examples/rad-warn-old-nodes.md @@ -0,0 +1,55 @@ +``` +$ rad config push preferredSeeds z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776 +z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776 +$ rad config push node.connect z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776 +z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776 +``` + +Note the warnings that the above configuration causes: + +``` +$ rad debug +{ + "radExe": "[..]", + "radVersion": "[..]", + "radicleNodeVersion": "radicle-node [..]", + "gitRemoteRadVersion": "git-remote-rad [..]", + "gitVersion": "git version [..]", + "sshVersion": "[..]", + "gitHead": "[..]", + "log": { + "filename": "[..]", + "exists": false, + "len": null + }, + "oldLog": { + "filename": "[..]", + "exists": false, + "len": null + }, + "operatingSystem": "[..]", + "arch": "[..]", + "env": { + "PATH": "[..]", + "RAD_HOME": "[..]", + "RAD_KEYGEN_SEED": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "RAD_LOCAL_TIME": "[..]", + "RAD_PASSPHRASE": "", + "RAD_RNG_SEED": "0" + }, + "warnings": [ + "Value of configuration option `node.connect` at index 0 mentions node with address 'ash.radicle.garden:8776', which has been renamed to 'rosa.radicle.xyz:8776'. Please update your configuration.", + "Value of configuration option `preferred_seeds` at index 0 mentions node with address 'seed.radicle.garden:8776', which has been renamed to 'iris.radicle.xyz:8776'. Please update your configuration." + ] +} +``` + +Also, `rad node status` will warn us: + +``` +$ rad node status +! Warning: Value of configuration option `node.connect` at index 0 mentions node with address 'ash.radicle.garden:8776', which has been renamed to 'rosa.radicle.xyz:8776'. Please update your configuration. +! Warning: Value of configuration option `preferred_seeds` at index 0 mentions node with address 'seed.radicle.garden:8776', which has been renamed to 'iris.radicle.xyz:8776'. Please update your configuration. +Node is stopped. +To start it, run `rad node start`. +``` \ No newline at end of file diff --git a/crates/radicle-cli/src/commands/debug.rs b/crates/radicle-cli/src/commands/debug.rs index 85378a57..6e92024a 100644 --- a/crates/radicle-cli/src/commands/debug.rs +++ b/crates/radicle-cli/src/commands/debug.rs @@ -86,6 +86,7 @@ fn debug(profile: Option<&Profile>) -> anyhow::Result<()> { operating_system: std::env::consts::OS, arch: std::env::consts::ARCH, env, + warnings: collect_warnings(profile), }; println!("{}", serde_json::to_string_pretty(&debug).unwrap()); @@ -109,6 +110,9 @@ struct DebugInfo { operating_system: &'static str, arch: &'static str, env: BTreeMap, + + #[serde(skip_serializing_if = "Vec::is_empty")] + warnings: Vec, } #[derive(Debug, Serialize)] @@ -153,3 +157,10 @@ fn stderr_of(bin: &str, args: &[&str]) -> anyhow::Result { let (_, stderr) = output_of(bin, args)?; Ok(stderr) } + +fn collect_warnings(profile: Option<&Profile>) -> Vec { + match profile { + Some(profile) => crate::warning::nodes_renamed(&profile.config), + None => vec!["No Radicle profile found.".to_string()], + } +} diff --git a/crates/radicle-cli/src/commands/node/control.rs b/crates/radicle-cli/src/commands/node/control.rs index 6ad0df38..bcf81b07 100644 --- a/crates/radicle-cli/src/commands/node/control.rs +++ b/crates/radicle-cli/src/commands/node/control.rs @@ -206,6 +206,10 @@ pub fn connect( } pub fn status(node: &Node, profile: &Profile) -> anyhow::Result<()> { + for warning in crate::warning::nodes_renamed(&profile.config) { + term::warning(warning); + } + if node.is_running() { let listen = node .listen_addrs()? diff --git a/crates/radicle-cli/src/lib.rs b/crates/radicle-cli/src/lib.rs index 32019151..88660339 100644 --- a/crates/radicle-cli/src/lib.rs +++ b/crates/radicle-cli/src/lib.rs @@ -7,3 +7,5 @@ pub mod node; pub mod pager; pub mod project; pub mod terminal; + +mod warning; diff --git a/crates/radicle-cli/src/warning.rs b/crates/radicle-cli/src/warning.rs new file mode 100644 index 00000000..1e762899 --- /dev/null +++ b/crates/radicle-cli/src/warning.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; +use std::sync::LazyLock; + +use radicle::node::config::ConnectAddress; +use radicle::node::Address; +use radicle::profile::Config; + +static NODES_RENAMED: LazyLock> = LazyLock::new(|| { + HashMap::from([ + ( + "seed.radicle.garden:8776".parse().unwrap(), + "iris.radicle.xyz:8776".parse().unwrap(), + ), + ( + "ash.radicle.garden:8776".parse().unwrap(), + "rosa.radicle.xyz:8776".parse().unwrap(), + ), + ]) +}); + +fn nodes_renamed_for_option( + option: &'static str, + iter: impl IntoIterator, +) -> Vec { + let mut warnings: Vec = vec![]; + + for (i, value) in iter.into_iter().enumerate() { + let old: Address = value.into(); + if let Some(new) = NODES_RENAMED.get(&old) { + warnings.push(format!( + "Value of configuration option `{option}` at index {i} mentions node with address '{}', which has been renamed to '{}'. Please update your configuration.", + old, new + )); + } + } + + warnings +} + +pub(crate) fn nodes_renamed(config: &Config) -> Vec { + let mut warnings = nodes_renamed_for_option("node.connect", config.node.connect.clone()); + warnings.extend(nodes_renamed_for_option( + "preferred_seeds", + config.preferred_seeds.clone(), + )); + warnings +} diff --git a/crates/radicle-cli/tests/commands.rs b/crates/radicle-cli/tests/commands.rs index dceb2203..0ad5b4ce 100644 --- a/crates/radicle-cli/tests/commands.rs +++ b/crates/radicle-cli/tests/commands.rs @@ -428,6 +428,21 @@ fn rad_config() { .unwrap(); } +#[test] +fn rad_warn_old_nodes() { + let mut environment = Environment::new(); + let profile = environment.profile(config::profile("alice")); + let working = tempfile::tempdir().unwrap(); + + test( + "examples/rad-warn-old-nodes.md", + working.path(), + Some(&profile.home), + [], + ) + .unwrap(); +} + #[test] fn rad_checkout() { let mut environment = Environment::new();