cli: move seeding behaviour to `rad seed`

To keep behaviour consistently under subcommands, move the `rad node
seeding` behaviour under `rad seed`. When an `<rid>` isn't
provided then the seeded repositories are listed.

Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
This commit is contained in:
Fintan Halpenny 2023-12-13 20:11:58 +00:00 committed by cloudhead
parent f6e2de30ca
commit e3b3f3c4f4
No known key found for this signature in database
5 changed files with 64 additions and 64 deletions

View File

@ -28,12 +28,12 @@ $ rad follow did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk --alias Bo
✓ Follow policy updated for z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk (Bob) ✓ Follow policy updated for z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk (Bob)
``` ```
Now, when we use the `rad node seeding` command we will see Now, when we use the `rad seed` command we will see
information for repositories that we seed -- in this case a information for repositories that we seed -- in this case a
repository that was already created: repository that was already created:
``` ```
$ rad node seeding $ rad seed
╭───────────────────────────────────────────────────────╮ ╭───────────────────────────────────────────────────────╮
│ RID Scope Policy │ │ RID Scope Policy │
├───────────────────────────────────────────────────────┤ ├───────────────────────────────────────────────────────┤

View File

@ -24,3 +24,14 @@ Now let's seed one of Eve's repositories:
$ rad seed rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --scope followed --no-fetch $ rad seed rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --scope followed --no-fetch
✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed' ✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed'
``` ```
We can list the repositories we are seeding by omitting the RID:
```
$ rad seed
╭───────────────────────────────────────────────────────╮
│ RID Scope Policy │
├───────────────────────────────────────────────────────┤
│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji followed allow │
╰───────────────────────────────────────────────────────╯
```

View File

@ -13,9 +13,7 @@ use crate::terminal::Element as _;
#[path = "node/control.rs"] #[path = "node/control.rs"]
pub mod control; pub mod control;
#[path = "node/events.rs"] #[path = "node/events.rs"]
pub mod events; mod events;
#[path = "node/policies.rs"]
pub mod policies;
#[path = "node/routing.rs"] #[path = "node/routing.rs"]
pub mod routing; pub mod routing;
@ -32,7 +30,6 @@ Usage
rad node logs [-n <lines>] rad node logs [-n <lines>]
rad node connect <nid>@<addr> [<option>...] rad node connect <nid>@<addr> [<option>...]
rad node routing [--rid <rid>] [--nid <nid>] [--json] [<option>...] rad node routing [--rid <rid>] [--nid <nid>] [--json] [<option>...]
rad node seeding [<option>...]
rad node events [--timeout <secs>] [-n <count>] [<option>...] rad node events [--timeout <secs>] [-n <count>] [<option>...]
rad node config rad node config
@ -90,7 +87,6 @@ pub enum Operation {
Status, Status,
Sessions, Sessions,
Stop, Stop,
Seeding,
} }
#[derive(Default, PartialEq, Eq)] #[derive(Default, PartialEq, Eq)]
@ -105,7 +101,6 @@ pub enum OperationName {
Status, Status,
Sessions, Sessions,
Stop, Stop,
Seeding,
} }
impl Args for Options { impl Args for Options {
@ -139,7 +134,6 @@ impl Args for Options {
"start" => op = Some(OperationName::Start), "start" => op = Some(OperationName::Start),
"status" => op = Some(OperationName::Status), "status" => op = Some(OperationName::Status),
"stop" => op = Some(OperationName::Stop), "stop" => op = Some(OperationName::Stop),
"seeding" => op = Some(OperationName::Seeding),
"sessions" => op = Some(OperationName::Sessions), "sessions" => op = Some(OperationName::Sessions),
unknown => anyhow::bail!("unknown operation '{}'", unknown), unknown => anyhow::bail!("unknown operation '{}'", unknown),
@ -201,7 +195,6 @@ impl Args for Options {
OperationName::Status => Operation::Status, OperationName::Status => Operation::Status,
OperationName::Sessions => Operation::Sessions, OperationName::Sessions => Operation::Sessions,
OperationName::Stop => Operation::Stop, OperationName::Stop => Operation::Stop,
OperationName::Seeding => Operation::Seeding,
}; };
Ok((Options { op }, vec![])) Ok((Options { op }, vec![]))
} }
@ -243,7 +236,6 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
Operation::Stop => { Operation::Stop => {
control::stop(node)?; control::stop(node)?;
} }
Operation::Seeding => policies::seeding(&profile)?,
} }
Ok(()) Ok(())

View File

@ -1,31 +0,0 @@
use radicle::node::policy;
use radicle::Profile;
use crate::terminal as term;
use term::Element;
pub fn seeding(profile: &Profile) -> anyhow::Result<()> {
let store = profile.policies()?;
let mut t = term::Table::new(term::table::TableOptions::bordered());
t.push([
term::format::default(String::from("RID")),
term::format::default(String::from("Scope")),
term::format::default(String::from("Policy")),
]);
t.divider();
for policy::Repo { id, scope, policy } in store.seed_policies()? {
let id = id.to_string();
let scope = scope.to_string();
let policy = policy.to_string();
t.push([
term::format::highlight(id),
term::format::secondary(scope),
term::format::secondary(policy),
])
}
t.print();
Ok(())
}

View File

@ -3,9 +3,11 @@ use std::time;
use anyhow::anyhow; use anyhow::anyhow;
use radicle::node::policy;
use radicle::node::policy::Scope; use radicle::node::policy::Scope;
use radicle::node::Handle; use radicle::node::Handle;
use radicle::{prelude::*, Node}; use radicle::{prelude::*, Node};
use radicle_term::Element as _;
use crate::commands::rad_sync as sync; use crate::commands::rad_sync as sync;
use crate::terminal::args::{Args, Error, Help}; use crate::terminal::args::{Args, Error, Help};
@ -18,10 +20,13 @@ pub const HELP: Help = Help {
usage: r#" usage: r#"
Usage Usage
rad seed <rid> [-d | --delete] [--[no-]fetch] [--scope <scope>] [<option>...] rad seed [<rid>] [-d | --delete] [--[no-]fetch] [--scope <scope>] [<option>...]
The `seed` command takes a Repository ID (<rid>) and updates the seeding policy The `seed` command, when no Repository ID (<rid>) is provided, will list the
for that repository. By default, a seeding policy will be created or updated. repositories being seeded.
When a Repository ID (<rid>) is provided it updates the seeding policy for
that repository. By default, a seeding policy will be created or updated.
To delete a policy, use the `--delete` flag. To delete a policy, use the `--delete` flag.
When seeding a repository, a scope can be specified: this can be either `all` or When seeding a repository, a scope can be specified: this can be either `all` or
@ -41,8 +46,9 @@ Options
#[derive(Debug)] #[derive(Debug)]
pub enum Operation { pub enum Operation {
Seed { fetch: bool, scope: Scope }, Seed { rid: Id, fetch: bool, scope: Scope },
Unseed, List,
Unseed { rid: Id },
} }
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)] #[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
@ -54,7 +60,6 @@ pub enum OperationName {
#[derive(Debug)] #[derive(Debug)]
pub struct Options { pub struct Options {
pub rid: Id,
pub op: Operation, pub op: Operation,
pub verbose: bool, pub verbose: bool,
} }
@ -98,33 +103,29 @@ impl Args for Options {
} }
} }
let op = match op.unwrap_or_default() { let op = match rid {
OperationName::Seed => Operation::Seed { Some(rid) => match op.unwrap_or_default() {
fetch: fetch.unwrap_or(true), OperationName::Seed => Operation::Seed {
scope: scope.unwrap_or(Scope::All), rid,
fetch: fetch.unwrap_or(true),
scope: scope.unwrap_or(Scope::All),
},
OperationName::Unseed => Operation::Unseed { rid },
}, },
OperationName::Unseed => Operation::Unseed, None => Operation::List,
}; };
Ok(( Ok((Options { op, verbose }, vec![]))
Options {
rid: rid.ok_or_else(|| anyhow!("a Repository ID must be specified"))?,
op,
verbose,
},
vec![],
))
} }
} }
pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
let profile = ctx.profile()?; let profile = ctx.profile()?;
let mut node = radicle::Node::new(profile.socket()); let mut node = radicle::Node::new(profile.socket());
let rid = options.rid;
match options.op { match options.op {
Operation::Unseed => delete(rid, &mut node, &profile)?, Operation::Unseed { rid } => delete(rid, &mut node, &profile)?,
Operation::Seed { fetch, scope } => { Operation::Seed { rid, fetch, scope } => {
update(rid, scope, &mut node, &profile)?; update(rid, scope, &mut node, &profile)?;
if fetch && node.is_running() { if fetch && node.is_running() {
@ -136,6 +137,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
)?; )?;
} }
} }
Operation::List => seeding(&profile)?,
} }
Ok(()) Ok(())
@ -164,3 +166,29 @@ pub fn delete(rid: Id, node: &mut Node, profile: &Profile) -> anyhow::Result<()>
} }
Ok(()) Ok(())
} }
pub fn seeding(profile: &Profile) -> anyhow::Result<()> {
let store = profile.policies()?;
let mut t = term::Table::new(term::table::TableOptions::bordered());
t.push([
term::format::default(String::from("RID")),
term::format::default(String::from("Scope")),
term::format::default(String::from("Policy")),
]);
t.divider();
for policy::Repo { id, scope, policy } in store.seed_policies()? {
let id = id.to_string();
let scope = scope.to_string();
let policy = policy.to_string();
t.push([
term::format::highlight(id),
term::format::secondary(scope),
term::format::secondary(policy),
])
}
t.print();
Ok(())
}