diff --git a/radicle-cli/src/commands/node.rs b/radicle-cli/src/commands/node.rs index caa49791..7dd0def4 100644 --- a/radicle-cli/src/commands/node.rs +++ b/radicle-cli/src/commands/node.rs @@ -1,7 +1,7 @@ use std::ffi::OsString; use anyhow::anyhow; -use radicle::node::{Address, Node, NodeId}; +use radicle::node::{Address, Node, NodeId, TRACKING_DB_FILE}; use crate::terminal as term; use crate::terminal::args::{Args, Error, Help}; @@ -152,8 +152,10 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { control::stop(node)?; } Operation::Tracking { mode } => { - let node = Node::new(profile.socket()); - tracking::run(&node, mode)? + let store = radicle::node::tracking::store::Config::open( + profile.home.node().join(TRACKING_DB_FILE), + )?; + tracking::run(&store, mode)? } } diff --git a/radicle-cli/src/commands/node/tracking.rs b/radicle-cli/src/commands/node/tracking.rs index cee85dce..4d0e95cb 100644 --- a/radicle-cli/src/commands/node/tracking.rs +++ b/radicle-cli/src/commands/node/tracking.rs @@ -1,24 +1,23 @@ -use radicle::node::{tracking, Handle as _}; +use radicle::node::tracking; use radicle::prelude::Did; -use radicle::Node; use crate::terminal as term; use super::TrackingMode; -pub fn run(node: &Node, mode: TrackingMode) -> anyhow::Result<()> { +pub fn run(store: &tracking::store::Config, mode: TrackingMode) -> anyhow::Result<()> { match mode { - TrackingMode::Repos => print_repos(node)?, - TrackingMode::Nodes => print_nodes(node)?, + TrackingMode::Repos => print_repos(store)?, + TrackingMode::Nodes => print_nodes(store)?, } Ok(()) } -fn print_repos(node: &Node) -> anyhow::Result<()> { +fn print_repos(store: &tracking::store::Config) -> anyhow::Result<()> { let mut t = term::Table::new(term::table::TableOptions::default()); t.push(["RID", "Scope", "Policy"]); t.push(["---", "-----", "------"]); - for tracking::Repo { id, scope, policy } in node.repo_policies()? { + for tracking::Repo { id, scope, policy } in store.repo_entries()? { t.push([ term::format::highlight(id.to_string()), term::format::secondary(scope.to_string()), @@ -29,11 +28,11 @@ fn print_repos(node: &Node) -> anyhow::Result<()> { Ok(()) } -fn print_nodes(node: &Node) -> anyhow::Result<()> { +fn print_nodes(store: &tracking::store::Config) -> anyhow::Result<()> { let mut t = term::Table::new(term::table::TableOptions::default()); t.push(["DID", "Alias", "Policy"]); t.push(["---", "-----", "------"]); - for tracking::Node { id, alias, policy } in node.node_policies()? { + for tracking::Node { id, alias, policy } in store.node_entries()? { t.push([ term::format::highlight(Did::from(id).to_string()), match alias { diff --git a/radicle-node/src/control.rs b/radicle-node/src/control.rs index 2643e560..6be429af 100644 --- a/radicle-node/src/control.rs +++ b/radicle-node/src/control.rs @@ -131,15 +131,6 @@ fn command>( } } } - CommandName::RepoPolicies => match handle.repo_policies() { - Ok(ts) => { - for t in ts.into_iter() { - serde_json::to_writer(&mut writer, &t)?; - writeln!(writer)?; - } - } - Err(e) => return Err(CommandError::Runtime(e)), - }, CommandName::TrackNode => { let (node, alias) = match cmd.args.as_slice() { [node] => (node.as_str(), None), @@ -171,15 +162,6 @@ fn command>( } } } - CommandName::NodePolicies => match handle.node_policies() { - Ok(ts) => { - for t in ts.into_iter() { - serde_json::to_writer(&mut writer, &t)?; - writeln!(writer)?; - } - } - Err(e) => return Err(CommandError::Runtime(e)), - }, CommandName::AnnounceRefs => { let rid: Id = parse::arg(cmd)?; diff --git a/radicle-node/src/runtime.rs b/radicle-node/src/runtime.rs index cb9e9585..966e91fb 100644 --- a/radicle-node/src/runtime.rs +++ b/radicle-node/src/runtime.rs @@ -14,6 +14,7 @@ use thiserror::Error; use radicle::git; use radicle::node::Handle as _; +use radicle::node::{ADDRESS_DB_FILE, ROUTING_DB_FILE, TRACKING_DB_FILE}; use radicle::profile::Home; use radicle::Storage; @@ -30,15 +31,6 @@ use crate::{service, LocalTime}; pub use handle::Error as HandleError; pub use handle::Handle; -/// Directory in `$RAD_HOME` under which node-specific files are stored. -pub const NODE_DIR: &str = "node"; -/// Filename of routing table database under [`NODE_DIR`]. -pub const ROUTING_DB_FILE: &str = "routing.db"; -/// Filename of address database under [`NODE_DIR`]. -pub const ADDRESS_DB_FILE: &str = "addresses.db"; -/// Filename of tracking table database under [`NODE_DIR`]. -pub const TRACKING_DB_FILE: &str = "tracking.db"; - /// A client error. #[derive(Error, Debug)] pub enum Error { diff --git a/radicle-node/src/runtime/handle.rs b/radicle-node/src/runtime/handle.rs index 2c2205d8..4f58f5f0 100644 --- a/radicle-node/src/runtime/handle.rs +++ b/radicle-node/src/runtime/handle.rs @@ -109,10 +109,7 @@ impl Handle { impl radicle::node::Handle for Handle { type Sessions = Sessions; type Error = Error; - type Routing = chan::Receiver<(Id, NodeId)>; - type RepoPolicies = chan::Receiver; - type NodePolicies = chan::Receiver; fn is_running(&self) -> bool { true @@ -136,40 +133,6 @@ impl radicle::node::Handle for Handle { receiver.recv().map_err(Error::from) } - fn repo_policies(&self) -> Result { - let (sender, receiver) = chan::unbounded(); - let query: Arc = Arc::new(move |state| { - for t in state.repo_policies()? { - if sender.send(t).is_err() { - break; - } - } - Ok(()) - }); - let (err_sender, err_receiver) = chan::bounded(1); - self.command(service::Command::QueryState(query, err_sender))?; - err_receiver.recv()??; - - Ok(receiver) - } - - fn node_policies(&self) -> Result { - let (sender, receiver) = chan::unbounded(); - let query: Arc = Arc::new(move |state| { - for t in state.node_policies()? { - if sender.send(t).is_err() { - break; - } - } - Ok(()) - }); - let (err_sender, err_receiver) = chan::bounded(1); - self.command(service::Command::QueryState(query, err_sender))?; - err_receiver.recv()??; - - Ok(receiver) - } - fn track_node(&mut self, id: NodeId, alias: Option) -> Result { let (sender, receiver) = chan::bounded(1); self.command(service::Command::TrackNode(id, alias, sender))?; diff --git a/radicle-node/src/service.rs b/radicle-node/src/service.rs index 4b583c0e..ac1b83ac 100644 --- a/radicle-node/src/service.rs +++ b/radicle-node/src/service.rs @@ -1501,10 +1501,6 @@ pub trait ServiceState { fn config(&self) -> &Config; /// Get reference to routing table. fn routing(&self) -> &dyn routing::Store; - /// Get the tracked repos. - fn repo_policies(&self) -> Result, tracking::Error>; - /// Get the tracked nodes. - fn node_policies(&self) -> Result, tracking::Error>; } impl ServiceState for Service @@ -1540,14 +1536,6 @@ where fn routing(&self) -> &dyn routing::Store { &self.routing } - - fn repo_policies(&self) -> Result, tracking::Error> { - Ok(self.tracking.repo_entries()?.collect()) - } - - fn node_policies(&self) -> Result, tracking::Error> { - Ok(self.tracking.node_entries()?.collect()) - } } /// Disconnect reason. diff --git a/radicle-node/src/test/handle.rs b/radicle-node/src/test/handle.rs index 07efa209..f2e6067c 100644 --- a/radicle-node/src/test/handle.rs +++ b/radicle-node/src/test/handle.rs @@ -21,8 +21,6 @@ impl radicle::node::Handle for Handle { type Error = HandleError; type Sessions = service::Sessions; type Routing = Vec<(Id, NodeId)>; - type RepoPolicies = Vec; - type NodePolicies = Vec; fn is_running(&self) -> bool { true @@ -40,32 +38,6 @@ impl radicle::node::Handle for Handle { Ok(FetchResult::from(Ok::, Self::Error>(vec![]))) } - fn repo_policies(&self) -> Result { - Ok(self - .tracking_repos - .iter() - .copied() - .map(|id| tracking::Repo { - id, - scope: tracking::Scope::All, - policy: tracking::Policy::Track, - }) - .collect()) - } - - fn node_policies(&self) -> Result { - Ok(self - .tracking_nodes - .iter() - .copied() - .map(|id| tracking::Node { - id, - alias: None, - policy: tracking::Policy::Track, - }) - .collect()) - } - fn track_repo(&mut self, id: Id, _scope: tracking::Scope) -> Result { Ok(self.tracking_repos.insert(id)) } diff --git a/radicle/src/node.rs b/radicle/src/node.rs index 00aa6438..815584e4 100644 --- a/radicle/src/node.rs +++ b/radicle/src/node.rs @@ -25,6 +25,12 @@ pub use features::Features; pub const DEFAULT_SOCKET_NAME: &str = "radicle.sock"; /// Default radicle protocol port. pub const DEFAULT_PORT: u16 = 8776; +/// Filename of routing table database under the node directory. +pub const ROUTING_DB_FILE: &str = "routing.db"; +/// Filename of address database under the node directory. +pub const ADDRESS_DB_FILE: &str = "addresses.db"; +/// Filename of tracking table database under the node directory. +pub const TRACKING_DB_FILE: &str = "tracking.db"; /// Result of a command, on the node control socket. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -125,14 +131,10 @@ pub enum CommandName { TrackRepo, /// Untrack the given repository. UntrackRepo, - /// Get the repository tracking policies. - RepoPolicies, /// Track the given node. TrackNode, /// Untrack the given node. UntrackNode, - /// Get the node tracking policies. - NodePolicies, /// Get the node's inventory. Inventory, /// Get the node's routing table. @@ -380,8 +382,6 @@ pub trait Handle { type Error: std::error::Error + Send + Sync + 'static; type Routing: IntoIterator; - type RepoPolicies: IntoIterator; - type NodePolicies: IntoIterator; /// Check if the node is running. to a peer. fn is_running(&self) -> bool; @@ -400,10 +400,6 @@ pub trait Handle { fn untrack_repo(&mut self, id: Id) -> Result; /// Untrack the given node. fn untrack_node(&mut self, id: NodeId) -> Result; - /// Get the tracking information for all tracked or blocked repos in storage. - fn repo_policies(&self) -> Result; - /// Get the tracking information for all tracked or blocked nodes in storage. - fn node_policies(&self) -> Result; /// Notify the service that a project has been updated, and announce local refs. fn announce_refs(&mut self, id: Id) -> Result<(), Self::Error>; /// Announce local inventory. @@ -464,9 +460,6 @@ impl Node { impl Handle for Node { type Sessions = (); type Error = Error; - - type RepoPolicies = Vec; - type NodePolicies = Vec; type Routing = Vec<(Id, NodeId)>; fn is_running(&self) -> bool { @@ -510,24 +503,6 @@ impl Handle for Node { Ok(result) } - fn repo_policies(&self) -> Result, Self::Error> { - let mut repos = Vec::new(); - for result in self.call::<&str, _>(CommandName::RepoPolicies, [])? { - let repo = result?; - repos.push(repo); - } - Ok(repos) - } - - fn node_policies(&self) -> Result, Self::Error> { - let mut repos = Vec::new(); - for result in self.call::<&str, _>(CommandName::NodePolicies, [])? { - let repo = result?; - repos.push(repo); - } - Ok(repos) - } - fn track_node(&mut self, id: NodeId, alias: Option) -> Result { let id = id.to_human(); let args = if let Some(alias) = alias.as_deref() {