diff --git a/crates/radicle-cli/examples/rad-seed-scope.md b/crates/radicle-cli/examples/rad-seed-scope.md new file mode 100644 index 00000000..a5023369 --- /dev/null +++ b/crates/radicle-cli/examples/rad-seed-scope.md @@ -0,0 +1,38 @@ +By default `rad seed` should add a seeding policy with the `followed` scope: + +``` +$ rad seed --no-fetch rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji +✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'followed' +$ rad seed +╭──────────────────────────────────────────────────────────────╮ +│ Repository Name Policy Scope │ +├──────────────────────────────────────────────────────────────┤ +│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji allow followed │ +╰──────────────────────────────────────────────────────────────╯ +``` + +The policy can be updated by explicitly specifying a different scope: + +``` +$ rad seed --no-fetch rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji --scope all +✓ Seeding policy updated for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all' +$ rad seed +╭───────────────────────────────────────────────────────────╮ +│ Repository Name Policy Scope │ +├───────────────────────────────────────────────────────────┤ +│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji allow all │ +╰───────────────────────────────────────────────────────────╯ +``` + +Running `rad seed` again without an explicit scope parameter should not change the existing policy: + +``` +$ rad seed --no-fetch rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji +✓ Seeding policy exists for rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji with scope 'all' +$ rad seed +╭───────────────────────────────────────────────────────────╮ +│ Repository Name Policy Scope │ +├───────────────────────────────────────────────────────────┤ +│ rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji allow all │ +╰───────────────────────────────────────────────────────────╯ +``` diff --git a/crates/radicle-cli/src/commands/seed.rs b/crates/radicle-cli/src/commands/seed.rs index edc31149..05294b13 100644 --- a/crates/radicle-cli/src/commands/seed.rs +++ b/crates/radicle-cli/src/commands/seed.rs @@ -41,10 +41,19 @@ pub fn run(args: Args, ctx: impl term::Context) -> anyhow::Result<()> { pub fn update( rid: RepoId, - scope: Scope, + scope: Option, node: &mut Node, profile: &Profile, ) -> Result<(), anyhow::Error> { + let scope = match scope { + Some(scope) => scope, + None => profile + .policies()? + .seed_policy(&rid)? + .scope() + .unwrap_or(Scope::Followed), + }; + let updated = profile.seed(rid, scope, node)?; let outcome = if updated { "updated" } else { "exists" }; diff --git a/crates/radicle-cli/src/commands/seed/args.rs b/crates/radicle-cli/src/commands/seed/args.rs index d5b331c7..db457061 100644 --- a/crates/radicle-cli/src/commands/seed/args.rs +++ b/crates/radicle-cli/src/commands/seed/args.rs @@ -47,12 +47,8 @@ pub struct Args { timeout: u64, /// Peer follow scope for this repository - #[arg( - long, - default_value_t = Scope::Followed, - value_parser = terminal::args::ScopeParser - )] - pub(super) scope: Scope, + #[arg(long, value_parser = terminal::args::ScopeParser)] + pub(super) scope: Option, /// Verbose output #[arg(long, short)] @@ -65,7 +61,7 @@ pub(super) enum Operation { rids: NonEmpty, should_fetch: bool, settings: SyncSettings, - scope: Scope, + scope: Option, }, } diff --git a/crates/radicle-cli/tests/commands/policy.rs b/crates/radicle-cli/tests/commands/policy.rs index ecbdacaa..8ca61ef7 100644 --- a/crates/radicle-cli/tests/commands/policy.rs +++ b/crates/radicle-cli/tests/commands/policy.rs @@ -9,6 +9,11 @@ fn rad_seed_and_follow() { Environment::alice(["rad-seed-and-follow"]); } +#[test] +fn rad_seed_scope() { + Environment::alice(["rad-seed-scope"]); +} + #[test] fn rad_seed_many() { let mut environment = Environment::new();