From 786e0b6b2e93a4e216d97d50598bcc6a7d1acc70 Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Thu, 23 Mar 2023 11:00:41 +0800 Subject: [PATCH 01/28] Support cargo owner add --- res.txt | 876 ++++++++++++++++++++++++++ src/bin/cargo/commands/owner.rs | 98 ++- src/cargo/ops/registry.rs | 118 ++-- tests/testsuite/alt_registry.rs | 19 +- tests/testsuite/credential_process.rs | 2 +- tests/testsuite/owner.rs | 10 +- 6 files changed, 1046 insertions(+), 77 deletions(-) create mode 100644 res.txt diff --git a/res.txt b/res.txt new file mode 100644 index 00000000000..839d4ccaec3 --- /dev/null +++ b/res.txt @@ -0,0 +1,876 @@ +a === Command { + name: "owner", + long_flag: None, + short_flag: None, + display_name: None, + bin_name: None, + author: None, + version: None, + long_version: None, + about: Some( + StyledStr { + pieces: [ + ( + None, + "Manage the owners of a crate on the registry", + ), + ], + }, + ), + long_about: None, + before_help: None, + before_long_help: None, + after_help: Some( + StyledStr { + pieces: [ + ( + None, + "Run `cargo help owner` for more detailed information.\n", + ), + ], + }, + ), + after_long_help: None, + aliases: [], + short_flag_aliases: [], + long_flag_aliases: [], + usage_str: Some( + StyledStr { + pieces: [ + ( + None, + "cargo owner add OWNER_NAME [OPTIONS] \n cargo owner remove OWNER_NAME [OPTIONS]\n cargo owner list [OPTIONS]", + ), + ], + }, + ), + usage_name: None, + help_str: None, + disp_ord: None, + term_w: None, + max_w: None, + template: None, + settings: AppFlags( + ARG_REQUIRED_ELSE_HELP | COLOR_AUTO, + ), + g_settings: AppFlags( + COLOR_AUTO, + ), + args: MKeyMap { + args: [ + Arg { + id: "crate", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "quiet", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Do not print cargo log messages", + ), + ], + }, + ), + long_help: None, + action: Some( + SetTrue, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: Some( + 'q', + ), + long: Some( + "quiet", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 0, + ), + val_names: [], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "index", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Registry index to modify owners for", + ), + ], + }, + ), + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: Some( + "index", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 4, + ), + val_names: [ + "INDEX", + ], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "token", + help: Some( + StyledStr { + pieces: [ + ( + None, + "API token to use when authenticating", + ), + ], + }, + ), + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: Some( + "token", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 5, + ), + val_names: [ + "TOKEN", + ], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "registry", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Registry to use", + ), + ], + }, + ), + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: Some( + "registry", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 6, + ), + val_names: [ + "REGISTRY", + ], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + ], + keys: [], + }, + subcommands: [ + Command { + name: "add", + long_flag: None, + short_flag: None, + display_name: None, + bin_name: None, + author: None, + version: None, + long_version: None, + about: Some( + StyledStr { + pieces: [ + ( + None, + "Name of a user or team to invite as an owner", + ), + ], + }, + ), + long_about: None, + before_help: None, + before_long_help: None, + after_help: None, + after_long_help: None, + aliases: [], + short_flag_aliases: [], + long_flag_aliases: [], + usage_str: Some( + StyledStr { + pieces: [ + ( + None, + "cargo owner add [OWNER_NAME] [OPTIONS]", + ), + ], + }, + ), + usage_name: None, + help_str: None, + disp_ord: Some( + 1, + ), + term_w: None, + max_w: None, + template: None, + settings: AppFlags( + COLOR_AUTO, + ), + g_settings: AppFlags( + COLOR_AUTO, + ), + args: MKeyMap { + args: [ + Arg { + id: "quiet", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Do not print cargo log messages", + ), + ], + }, + ), + long_help: None, + action: Some( + SetTrue, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: Some( + 'q', + ), + long: Some( + "quiet", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 0, + ), + val_names: [], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "ownername", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + REQUIRED, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [ + "OWNER_NAME", + ], + num_vals: Some( + 1, + ), + val_delim: Some( + ',', + ), + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "cratename", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [ + "CRATE_NAME", + ], + num_vals: Some( + 1, + ), + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + ], + keys: [], + }, + subcommands: [], + replacers: FlatMap { + keys: [], + values: [], + }, + groups: [], + current_help_heading: None, + current_disp_ord: Some( + 1, + ), + subcommand_value_name: None, + subcommand_heading: None, + external_value_parser: None, + long_help_exists: false, + }, + Command { + name: "remove", + long_flag: None, + short_flag: None, + display_name: None, + bin_name: None, + author: None, + version: None, + long_version: None, + about: Some( + StyledStr { + pieces: [ + ( + None, + "Name of a user or team to remove as an owner", + ), + ], + }, + ), + long_about: None, + before_help: None, + before_long_help: None, + after_help: None, + after_long_help: None, + aliases: [], + short_flag_aliases: [], + long_flag_aliases: [], + usage_str: Some( + StyledStr { + pieces: [ + ( + None, + "cargo owner remove [OWNER_NAME] [OPTIONS]", + ), + ], + }, + ), + usage_name: None, + help_str: None, + disp_ord: Some( + 2, + ), + term_w: None, + max_w: None, + template: None, + settings: AppFlags( + COLOR_AUTO, + ), + g_settings: AppFlags( + COLOR_AUTO, + ), + args: MKeyMap { + args: [ + Arg { + id: "quiet", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Do not print cargo log messages", + ), + ], + }, + ), + long_help: None, + action: Some( + SetTrue, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: Some( + 'q', + ), + long: Some( + "quiet", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 0, + ), + val_names: [], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "ownername", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + REQUIRED, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [ + "OWNER_NAME", + ], + num_vals: Some( + 1, + ), + val_delim: Some( + ',', + ), + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "cratename", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [ + "CRATE_NAME", + ], + num_vals: Some( + 1, + ), + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + ], + keys: [], + }, + subcommands: [], + replacers: FlatMap { + keys: [], + values: [], + }, + groups: [], + current_help_heading: None, + current_disp_ord: Some( + 1, + ), + subcommand_value_name: None, + subcommand_heading: None, + external_value_parser: None, + long_help_exists: false, + }, + Command { + name: "list", + long_flag: None, + short_flag: None, + display_name: None, + bin_name: None, + author: None, + version: None, + long_version: None, + about: Some( + StyledStr { + pieces: [ + ( + None, + "List owners of a crate", + ), + ], + }, + ), + long_about: None, + before_help: None, + before_long_help: None, + after_help: None, + after_long_help: None, + aliases: [], + short_flag_aliases: [], + long_flag_aliases: [], + usage_str: Some( + StyledStr { + pieces: [ + ( + None, + "cargo owner list [OPTIONS]", + ), + ], + }, + ), + usage_name: None, + help_str: None, + disp_ord: Some( + 3, + ), + term_w: None, + max_w: None, + template: None, + settings: AppFlags( + COLOR_AUTO, + ), + g_settings: AppFlags( + COLOR_AUTO, + ), + args: MKeyMap { + args: [ + Arg { + id: "quiet", + help: Some( + StyledStr { + pieces: [ + ( + None, + "Do not print cargo log messages", + ), + ], + }, + ), + long_help: None, + action: Some( + SetTrue, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: Some( + 'q', + ), + long: Some( + "quiet", + ), + aliases: [], + short_aliases: [], + disp_ord: Some( + 0, + ), + val_names: [], + num_vals: None, + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + Arg { + id: "cratename", + help: None, + long_help: None, + action: Some( + Set, + ), + value_parser: None, + blacklist: [], + settings: ArgFlags( + NO_OP, + ), + overrides: [], + groups: [], + requires: [], + r_ifs: [], + r_unless: [], + short: None, + long: None, + aliases: [], + short_aliases: [], + disp_ord: None, + val_names: [ + "CRATE_NAME", + ], + num_vals: Some( + 1, + ), + val_delim: None, + default_vals: [], + default_vals_ifs: [], + terminator: None, + index: None, + help_heading: Some( + None, + ), + value_hint: None, + default_missing_vals: [], + }, + ], + keys: [], + }, + subcommands: [], + replacers: FlatMap { + keys: [], + values: [], + }, + groups: [], + current_help_heading: None, + current_disp_ord: Some( + 1, + ), + subcommand_value_name: None, + subcommand_heading: None, + external_value_parser: None, + long_help_exists: false, + }, + ], + replacers: FlatMap { + keys: [], + values: [], + }, + groups: [], + current_help_heading: None, + current_disp_ord: Some( + 7, + ), + subcommand_value_name: None, + subcommand_heading: None, + external_value_parser: None, + long_help_exists: false, +} diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 493072b7b3a..69b5d80e61b 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -6,25 +6,68 @@ use cargo::util::auth::Secret; pub fn cli() -> Command { subcommand("owner") .about("Manage the owners of a crate on the registry") - .arg_quiet() .arg(Arg::new("crate").action(ArgAction::Set)) - .arg( - multi_opt( - "add", - "LOGIN", - "Name of a user or team to invite as an owner", - ) - .short('a'), - ) - .arg( - multi_opt( - "remove", - "LOGIN", - "Name of a user or team to remove as an owner", - ) - .short('r'), + .arg_required_else_help(true) + .override_usage( + "\ + cargo owner [OPTIONS] add OWNER_NAME + cargo owner [OPTIONS] remove OWNER_NAME + cargo owner [OPTIONS] list ", ) - .arg(flag("list", "List owners of a crate").short('l')) + .arg_quiet() + .subcommands([ + Command::new("add") + .about("Name of a user or team to invite as an owner") + .override_usage( + "\ + cargo owner [OPTIONS] add [OWNER_NAME] ", + ) + .arg_quiet() + .args([ + Arg::new("ownername") + .action(ArgAction::Set) + .required(true) + .num_args(1) + .value_delimiter(',') + .value_name("OWNER_NAME"), + Arg::new("cratename") + .action(ArgAction::Set) + .num_args(1) + .value_name("CRATE_NAME"), + ]), + Command::new("remove") + .about("Name of a user or team to remove as an owner") + .override_usage( + "\ + cargo owner [OPTIONS] remove [OWNER_NAME] ", + ) + .arg_quiet() + .args([ + Arg::new("ownername") + .action(ArgAction::Set) + .required(true) + .num_args(1) + .value_delimiter(',') + .value_name("OWNER_NAME"), + Arg::new("cratename") + .action(ArgAction::Set) + .num_args(1) + .value_name("CRATE_NAME"), + ]), + Command::new("list") + .about("List owners of a crate") + .override_usage( + "\ + cargo owner [OPTIONS] list ", + ) + .arg_quiet() + .arg( + Arg::new("cratename") + .action(ArgAction::Set) + .num_args(1) + .value_name("CRATE_NAME"), + ), + ]) .arg(opt("index", "Registry index to modify owners for").value_name("INDEX")) .arg(opt("token", "API token to use when authenticating").value_name("TOKEN")) .arg(opt("registry", "Registry to use").value_name("REGISTRY")) @@ -33,19 +76,24 @@ pub fn cli() -> Command { pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { let registry = args.registry(config)?; + + let Some((sc, arg)) = args.subcommand() else { + return Err(CliError::new( + anyhow::format_err!( + "you need to specify the subcommands to be operated: add, remove or list." + ), + 101, + )); + }; + let opts = OwnersOptions { - krate: args.get_one::("crate").cloned(), token: args.get_one::("token").cloned().map(Secret::from), index: args.get_one::("index").cloned(), - to_add: args - .get_many::("add") - .map(|xs| xs.cloned().collect()), - to_remove: args - .get_many::("remove") - .map(|xs| xs.cloned().collect()), - list: args.flag("list"), + subcommand: Some(sc.to_owned()), + subcommand_arg: Some(arg.clone()), registry, }; + ops::modify_owners(config, &opts)?; Ok(()) } diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 07ae318ddfe..999911bc4fb 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -39,6 +39,8 @@ use crate::util::{truncate_with_ellipsis, IntoUrl}; use crate::util::{Progress, ProgressStyle}; use crate::{drop_print, drop_println, version}; +use crate::util::command_prelude::ArgMatches; + /// Registry settings loaded from config files. /// /// This is loaded based on the `--registry` flag and the config settings. @@ -958,18 +960,21 @@ pub fn registry_logout(config: &Config, reg: Option<&str>) -> CargoResult<()> { } pub struct OwnersOptions { - pub krate: Option, pub token: Option>, pub index: Option, - pub to_add: Option>, - pub to_remove: Option>, - pub list: bool, + pub subcommand: Option, + pub subcommand_arg: Option, pub registry: Option, } pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { - let name = match opts.krate { - Some(ref name) => name.clone(), + let name = match opts + .subcommand_arg + .as_ref() + .unwrap() + .get_one::("cratename") + { + Some(ref name) => name.clone().to_string(), None => { let manifest_path = find_root_manifest_for_wd(config.cwd())?; let ws = Workspace::new(&manifest_path, config)?; @@ -988,49 +993,74 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { Some(mutation), )?; - if let Some(ref v) = opts.to_add { - let v = v.iter().map(|s| &s[..]).collect::>(); - let msg = registry.add_owners(&name, &v).with_context(|| { - format!( - "failed to invite owners to crate `{}` on registry at {}", - name, - registry.host() - ) - })?; + match opts.subcommand.as_ref().map(|s| s.as_str()) { + Some("add") => { + let v = opts + .subcommand_arg + .as_ref() + .unwrap() + .get_many::("ownername") + .map(|s| s.collect::>()) + .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) + .unwrap(); + println!("v name == {:#?}", v); + let msg = registry.add_owners(&name, &v).with_context(|| { + format!( + "failed to invite owners to crate `{}` on registry at {}", + name, + registry.host() + ) + })?; - config.shell().status("Owner", msg)?; - } + config.shell().status("Owner", msg)?; + } - if let Some(ref v) = opts.to_remove { - let v = v.iter().map(|s| &s[..]).collect::>(); - config - .shell() - .status("Owner", format!("removing {:?} from crate {}", v, name))?; - registry.remove_owners(&name, &v).with_context(|| { - format!( - "failed to remove owners from crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - } + Some("remove") => { + let v = opts + .subcommand_arg + .as_ref() + .unwrap() + .get_many::("ownername") + .map(|s| s.collect::>()) + .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) + .unwrap(); + config + .shell() + .status("Owner", format!("removing {:?} from crate {}", v, name))?; + registry.remove_owners(&name, &v).with_context(|| { + format!( + "failed to remove owners from crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + } - if opts.list { - let owners = registry.list_owners(&name).with_context(|| { - format!( - "failed to list owners of crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - for owner in owners.iter() { - drop_print!(config, "{}", owner.login); - match (owner.name.as_ref(), owner.email.as_ref()) { - (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), - (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), - (None, None) => drop_println!(config), + Some("list") => { + let owners = registry.list_owners(&name).with_context(|| { + format!( + "failed to list owners of crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + for owner in owners.iter() { + drop_print!(config, "{}", owner.login); + match (owner.name.as_ref(), owner.email.as_ref()) { + (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), + (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), + (None, None) => drop_println!(config), + } } } + + _ => { + anyhow::bail!( + " + You have entered an incorrect subcommand. \ + Run the `--help` command to obtain more information." + ); + } } Ok(()) diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 26bd864b008..1e9cf264b11 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -760,7 +760,7 @@ fn no_api() { .with_stderr_contains(&err) .run(); - p.cargo("owner --registry alternative --list") + p.cargo("owner --registry alternative list") .with_status(101) .with_stderr_contains(&err) .run(); @@ -1364,7 +1364,7 @@ fn both_index_and_default() { let p = project().file("src/lib.rs", "").build(); for cmd in &[ "publish", - "owner", + // "owner add someone", "search", "yank --version 1.0.0", "install foo", @@ -1376,6 +1376,21 @@ fn both_index_and_default() { .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") .run(); } + p.cargo("owner --index=index_url add someone") + .env("CARGO_REGISTRY_DEFAULT", "undefined") + .with_status(101) + .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") + .run(); +} + +#[cargo_test] +fn owner_index_and_default() { + let p = project().file("src/lib.rs", "").build(); + p.cargo("owner --index=index_url add someone") + .env("CARGO_REGISTRY_DEFAULT", "undefined") + .with_status(101) + .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") + .run(); } #[cargo_test] diff --git a/tests/testsuite/credential_process.rs b/tests/testsuite/credential_process.rs index ced8c34a09f..78309aef4ba 100644 --- a/tests/testsuite/credential_process.rs +++ b/tests/testsuite/credential_process.rs @@ -411,7 +411,7 @@ fn yank() { fn owner() { let (p, _t) = get_token_test(); - p.cargo("owner --add username --registry alternative -Z credential-process") + p.cargo("owner --registry alternative -Z credential-process add username") .masquerade_as_nightly_cargo(&["credential-process"]) .with_stderr( "\ diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index 9fc960c9277..5fdf18b5c09 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -47,7 +47,7 @@ fn simple_list() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner -l") + p.cargo("owner list") .replace_crates_io(registry.index_url()) .with_stdout( "\ @@ -78,7 +78,7 @@ fn simple_add() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner -a username") + p.cargo("owner add username") .replace_crates_io(registry.index_url()) .with_status(101) .with_stderr( @@ -116,7 +116,7 @@ fn simple_add_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner -a username") + p.cargo("owner add username") .arg("-Zregistry-auth") .masquerade_as_nightly_cargo(&["registry-auth"]) .replace_crates_io(registry.index_url()) @@ -144,7 +144,7 @@ fn simple_remove() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner -r username") + p.cargo("owner remove username") .replace_crates_io(registry.index_url()) .with_status(101) .with_stderr( @@ -183,7 +183,7 @@ fn simple_remove_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner -r username") + p.cargo("owner remove username") .arg("-Zregistry-auth") .replace_crates_io(registry.index_url()) .masquerade_as_nightly_cargo(&["registry-auth"]) From 5862698f356cbf9a096d34cf470b2e01319b8a94 Mon Sep 17 00:00:00 2001 From: heisenberg <46313511+QiangHeisenberg@users.noreply.github.com> Date: Thu, 23 Mar 2023 11:35:42 +0800 Subject: [PATCH 02/28] Delete res.txt --- res.txt | 876 -------------------------------------------------------- 1 file changed, 876 deletions(-) delete mode 100644 res.txt diff --git a/res.txt b/res.txt deleted file mode 100644 index 839d4ccaec3..00000000000 --- a/res.txt +++ /dev/null @@ -1,876 +0,0 @@ -a === Command { - name: "owner", - long_flag: None, - short_flag: None, - display_name: None, - bin_name: None, - author: None, - version: None, - long_version: None, - about: Some( - StyledStr { - pieces: [ - ( - None, - "Manage the owners of a crate on the registry", - ), - ], - }, - ), - long_about: None, - before_help: None, - before_long_help: None, - after_help: Some( - StyledStr { - pieces: [ - ( - None, - "Run `cargo help owner` for more detailed information.\n", - ), - ], - }, - ), - after_long_help: None, - aliases: [], - short_flag_aliases: [], - long_flag_aliases: [], - usage_str: Some( - StyledStr { - pieces: [ - ( - None, - "cargo owner add OWNER_NAME [OPTIONS] \n cargo owner remove OWNER_NAME [OPTIONS]\n cargo owner list [OPTIONS]", - ), - ], - }, - ), - usage_name: None, - help_str: None, - disp_ord: None, - term_w: None, - max_w: None, - template: None, - settings: AppFlags( - ARG_REQUIRED_ELSE_HELP | COLOR_AUTO, - ), - g_settings: AppFlags( - COLOR_AUTO, - ), - args: MKeyMap { - args: [ - Arg { - id: "crate", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "quiet", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Do not print cargo log messages", - ), - ], - }, - ), - long_help: None, - action: Some( - SetTrue, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: Some( - 'q', - ), - long: Some( - "quiet", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 0, - ), - val_names: [], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "index", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Registry index to modify owners for", - ), - ], - }, - ), - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: Some( - "index", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 4, - ), - val_names: [ - "INDEX", - ], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "token", - help: Some( - StyledStr { - pieces: [ - ( - None, - "API token to use when authenticating", - ), - ], - }, - ), - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: Some( - "token", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 5, - ), - val_names: [ - "TOKEN", - ], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "registry", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Registry to use", - ), - ], - }, - ), - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: Some( - "registry", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 6, - ), - val_names: [ - "REGISTRY", - ], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - ], - keys: [], - }, - subcommands: [ - Command { - name: "add", - long_flag: None, - short_flag: None, - display_name: None, - bin_name: None, - author: None, - version: None, - long_version: None, - about: Some( - StyledStr { - pieces: [ - ( - None, - "Name of a user or team to invite as an owner", - ), - ], - }, - ), - long_about: None, - before_help: None, - before_long_help: None, - after_help: None, - after_long_help: None, - aliases: [], - short_flag_aliases: [], - long_flag_aliases: [], - usage_str: Some( - StyledStr { - pieces: [ - ( - None, - "cargo owner add [OWNER_NAME] [OPTIONS]", - ), - ], - }, - ), - usage_name: None, - help_str: None, - disp_ord: Some( - 1, - ), - term_w: None, - max_w: None, - template: None, - settings: AppFlags( - COLOR_AUTO, - ), - g_settings: AppFlags( - COLOR_AUTO, - ), - args: MKeyMap { - args: [ - Arg { - id: "quiet", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Do not print cargo log messages", - ), - ], - }, - ), - long_help: None, - action: Some( - SetTrue, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: Some( - 'q', - ), - long: Some( - "quiet", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 0, - ), - val_names: [], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "ownername", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - REQUIRED, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [ - "OWNER_NAME", - ], - num_vals: Some( - 1, - ), - val_delim: Some( - ',', - ), - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "cratename", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [ - "CRATE_NAME", - ], - num_vals: Some( - 1, - ), - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - ], - keys: [], - }, - subcommands: [], - replacers: FlatMap { - keys: [], - values: [], - }, - groups: [], - current_help_heading: None, - current_disp_ord: Some( - 1, - ), - subcommand_value_name: None, - subcommand_heading: None, - external_value_parser: None, - long_help_exists: false, - }, - Command { - name: "remove", - long_flag: None, - short_flag: None, - display_name: None, - bin_name: None, - author: None, - version: None, - long_version: None, - about: Some( - StyledStr { - pieces: [ - ( - None, - "Name of a user or team to remove as an owner", - ), - ], - }, - ), - long_about: None, - before_help: None, - before_long_help: None, - after_help: None, - after_long_help: None, - aliases: [], - short_flag_aliases: [], - long_flag_aliases: [], - usage_str: Some( - StyledStr { - pieces: [ - ( - None, - "cargo owner remove [OWNER_NAME] [OPTIONS]", - ), - ], - }, - ), - usage_name: None, - help_str: None, - disp_ord: Some( - 2, - ), - term_w: None, - max_w: None, - template: None, - settings: AppFlags( - COLOR_AUTO, - ), - g_settings: AppFlags( - COLOR_AUTO, - ), - args: MKeyMap { - args: [ - Arg { - id: "quiet", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Do not print cargo log messages", - ), - ], - }, - ), - long_help: None, - action: Some( - SetTrue, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: Some( - 'q', - ), - long: Some( - "quiet", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 0, - ), - val_names: [], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "ownername", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - REQUIRED, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [ - "OWNER_NAME", - ], - num_vals: Some( - 1, - ), - val_delim: Some( - ',', - ), - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "cratename", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [ - "CRATE_NAME", - ], - num_vals: Some( - 1, - ), - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - ], - keys: [], - }, - subcommands: [], - replacers: FlatMap { - keys: [], - values: [], - }, - groups: [], - current_help_heading: None, - current_disp_ord: Some( - 1, - ), - subcommand_value_name: None, - subcommand_heading: None, - external_value_parser: None, - long_help_exists: false, - }, - Command { - name: "list", - long_flag: None, - short_flag: None, - display_name: None, - bin_name: None, - author: None, - version: None, - long_version: None, - about: Some( - StyledStr { - pieces: [ - ( - None, - "List owners of a crate", - ), - ], - }, - ), - long_about: None, - before_help: None, - before_long_help: None, - after_help: None, - after_long_help: None, - aliases: [], - short_flag_aliases: [], - long_flag_aliases: [], - usage_str: Some( - StyledStr { - pieces: [ - ( - None, - "cargo owner list [OPTIONS]", - ), - ], - }, - ), - usage_name: None, - help_str: None, - disp_ord: Some( - 3, - ), - term_w: None, - max_w: None, - template: None, - settings: AppFlags( - COLOR_AUTO, - ), - g_settings: AppFlags( - COLOR_AUTO, - ), - args: MKeyMap { - args: [ - Arg { - id: "quiet", - help: Some( - StyledStr { - pieces: [ - ( - None, - "Do not print cargo log messages", - ), - ], - }, - ), - long_help: None, - action: Some( - SetTrue, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: Some( - 'q', - ), - long: Some( - "quiet", - ), - aliases: [], - short_aliases: [], - disp_ord: Some( - 0, - ), - val_names: [], - num_vals: None, - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - Arg { - id: "cratename", - help: None, - long_help: None, - action: Some( - Set, - ), - value_parser: None, - blacklist: [], - settings: ArgFlags( - NO_OP, - ), - overrides: [], - groups: [], - requires: [], - r_ifs: [], - r_unless: [], - short: None, - long: None, - aliases: [], - short_aliases: [], - disp_ord: None, - val_names: [ - "CRATE_NAME", - ], - num_vals: Some( - 1, - ), - val_delim: None, - default_vals: [], - default_vals_ifs: [], - terminator: None, - index: None, - help_heading: Some( - None, - ), - value_hint: None, - default_missing_vals: [], - }, - ], - keys: [], - }, - subcommands: [], - replacers: FlatMap { - keys: [], - values: [], - }, - groups: [], - current_help_heading: None, - current_disp_ord: Some( - 1, - ), - subcommand_value_name: None, - subcommand_heading: None, - external_value_parser: None, - long_help_exists: false, - }, - ], - replacers: FlatMap { - keys: [], - values: [], - }, - groups: [], - current_help_heading: None, - current_disp_ord: Some( - 7, - ), - subcommand_value_name: None, - subcommand_heading: None, - external_value_parser: None, - long_help_exists: false, -} From 8914b1ab9f5b5ff80d777a923f98fdce9dd730ba Mon Sep 17 00:00:00 2001 From: heisenberg <46313511+QiangHeisenberg@users.noreply.github.com> Date: Thu, 23 Mar 2023 12:09:11 +0800 Subject: [PATCH 03/28] Update registry.rs --- src/cargo/ops/registry.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 999911bc4fb..f98bb135470 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -1003,7 +1003,6 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { .map(|s| s.collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) .unwrap(); - println!("v name == {:#?}", v); let msg = registry.add_owners(&name, &v).with_context(|| { format!( "failed to invite owners to crate `{}` on registry at {}", From baf302014ad932494c8214ba61c6c01efaf63c03 Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Sun, 2 Apr 2023 16:46:09 +0800 Subject: [PATCH 04/28] Added test cases and modified document descriptions. --- res.txt | 1264 +++++++++++++++++++++++++++ src/cargo/ops/registry.rs | 1 - src/doc/src/commands/cargo-owner.md | 31 +- src/doc/src/reference/publishing.md | 10 +- tests/testsuite/alt_registry.rs | 1 - tests/testsuite/owner.rs | 122 +++ 6 files changed, 1407 insertions(+), 22 deletions(-) create mode 100644 res.txt diff --git a/res.txt b/res.txt new file mode 100644 index 00000000000..12494baeb90 --- /dev/null +++ b/res.txt @@ -0,0 +1,1264 @@ + +running 1 test +aaaa +running `/home/heisen/temp/temp-temp/cargo/target/debug/cargo owner` +res === Err( + ProcessError { + desc: "process didn't exit successfully: `/home/heisen/temp/temp-temp/cargo/target/debug/cargo owner` (exit status: 1)\n--- stderr\nManage the owners of a crate on the registry\n\nUsage: cargo owner [OPTIONS] add OWNER_NAME \n cargo owner [OPTIONS] remove OWNER_NAME \n cargo owner [OPTIONS] list \n\nCommands:\n add Name of a user or team to invite as an owner\n remove Name of a user or team to remove as an owner\n list List owners of a crate\n\nArguments:\n [crate] \n\nOptions:\n -q, --quiet Do not print cargo log messages\n -v, --verbose... Use verbose output (-vv very verbose/build.rs output)\n --index Registry index to modify owners for\n --color Coloring: auto, always, never\n --token API token to use when authenticating\n --registry Registry to use\n --frozen Require Cargo.lock and cache are up to date\n --locked Require Cargo.lock is up to date\n --offline Run without accessing the network\n --config Override a configuration value\n -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details\n -h, --help Print help\n\nRun `cargo help owner` for more detailed information.\n", + code: Some( + 1, + ), + stdout: Some( + [], + ), + stderr: Some( + [ + 77, + 97, + 110, + 97, + 103, + 101, + 32, + 116, + 104, + 101, + 32, + 111, + 119, + 110, + 101, + 114, + 115, + 32, + 111, + 102, + 32, + 97, + 32, + 99, + 114, + 97, + 116, + 101, + 32, + 111, + 110, + 32, + 116, + 104, + 101, + 32, + 114, + 101, + 103, + 105, + 115, + 116, + 114, + 121, + 10, + 10, + 85, + 115, + 97, + 103, + 101, + 58, + 32, + 99, + 97, + 114, + 103, + 111, + 32, + 111, + 119, + 110, + 101, + 114, + 32, + 91, + 79, + 80, + 84, + 73, + 79, + 78, + 83, + 93, + 32, + 97, + 100, + 100, + 32, + 32, + 32, + 32, + 79, + 87, + 78, + 69, + 82, + 95, + 78, + 65, + 77, + 69, + 32, + 60, + 67, + 82, + 65, + 84, + 69, + 95, + 78, + 65, + 77, + 69, + 62, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 99, + 97, + 114, + 103, + 111, + 32, + 111, + 119, + 110, + 101, + 114, + 32, + 91, + 79, + 80, + 84, + 73, + 79, + 78, + 83, + 93, + 32, + 114, + 101, + 109, + 111, + 118, + 101, + 32, + 79, + 87, + 78, + 69, + 82, + 95, + 78, + 65, + 77, + 69, + 32, + 60, + 67, + 82, + 65, + 84, + 69, + 95, + 78, + 65, + 77, + 69, + 62, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 99, + 97, + 114, + 103, + 111, + 32, + 111, + 119, + 110, + 101, + 114, + 32, + 91, + 79, + 80, + 84, + 73, + 79, + 78, + 83, + 93, + 32, + 108, + 105, + 115, + 116, + 32, + 32, + 32, + 60, + 67, + 82, + 65, + 84, + 69, + 95, + 78, + 65, + 77, + 69, + 62, + 10, + 10, + 67, + 111, + 109, + 109, + 97, + 110, + 100, + 115, + 58, + 10, + 32, + 32, + 97, + 100, + 100, + 32, + 32, + 32, + 32, + 32, + 78, + 97, + 109, + 101, + 32, + 111, + 102, + 32, + 97, + 32, + 117, + 115, + 101, + 114, + 32, + 111, + 114, + 32, + 116, + 101, + 97, + 109, + 32, + 116, + 111, + 32, + 105, + 110, + 118, + 105, + 116, + 101, + 32, + 97, + 115, + 32, + 97, + 110, + 32, + 111, + 119, + 110, + 101, + 114, + 10, + 32, + 32, + 114, + 101, + 109, + 111, + 118, + 101, + 32, + 32, + 78, + 97, + 109, + 101, + 32, + 111, + 102, + 32, + 97, + 32, + 117, + 115, + 101, + 114, + 32, + 111, + 114, + 32, + 116, + 101, + 97, + 109, + 32, + 116, + 111, + 32, + 114, + 101, + 109, + 111, + 118, + 101, + 32, + 97, + 115, + 32, + 97, + 110, + 32, + 111, + 119, + 110, + 101, + 114, + 10, + 32, + 32, + 108, + 105, + 115, + 116, + 32, + 32, + 32, + 32, + 76, + 105, + 115, + 116, + 32, + 111, + 119, + 110, + 101, + 114, + 115, + 32, + 111, + 102, + 32, + 97, + 32, + 99, + 114, + 97, + 116, + 101, + 10, + 10, + 65, + 114, + 103, + 117, + 109, + 101, + 110, + 116, + 115, + 58, + 10, + 32, + 32, + 91, + 99, + 114, + 97, + 116, + 101, + 93, + 32, + 32, + 10, + 10, + 79, + 112, + 116, + 105, + 111, + 110, + 115, + 58, + 10, + 32, + 32, + 45, + 113, + 44, + 32, + 45, + 45, + 113, + 117, + 105, + 101, + 116, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 68, + 111, + 32, + 110, + 111, + 116, + 32, + 112, + 114, + 105, + 110, + 116, + 32, + 99, + 97, + 114, + 103, + 111, + 32, + 108, + 111, + 103, + 32, + 109, + 101, + 115, + 115, + 97, + 103, + 101, + 115, + 10, + 32, + 32, + 45, + 118, + 44, + 32, + 45, + 45, + 118, + 101, + 114, + 98, + 111, + 115, + 101, + 46, + 46, + 46, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 85, + 115, + 101, + 32, + 118, + 101, + 114, + 98, + 111, + 115, + 101, + 32, + 111, + 117, + 116, + 112, + 117, + 116, + 32, + 40, + 45, + 118, + 118, + 32, + 118, + 101, + 114, + 121, + 32, + 118, + 101, + 114, + 98, + 111, + 115, + 101, + 47, + 98, + 117, + 105, + 108, + 100, + 46, + 114, + 115, + 32, + 111, + 117, + 116, + 112, + 117, + 116, + 41, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 105, + 110, + 100, + 101, + 120, + 32, + 60, + 73, + 78, + 68, + 69, + 88, + 62, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 82, + 101, + 103, + 105, + 115, + 116, + 114, + 121, + 32, + 105, + 110, + 100, + 101, + 120, + 32, + 116, + 111, + 32, + 109, + 111, + 100, + 105, + 102, + 121, + 32, + 111, + 119, + 110, + 101, + 114, + 115, + 32, + 102, + 111, + 114, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 99, + 111, + 108, + 111, + 114, + 32, + 60, + 87, + 72, + 69, + 78, + 62, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 67, + 111, + 108, + 111, + 114, + 105, + 110, + 103, + 58, + 32, + 97, + 117, + 116, + 111, + 44, + 32, + 97, + 108, + 119, + 97, + 121, + 115, + 44, + 32, + 110, + 101, + 118, + 101, + 114, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 116, + 111, + 107, + 101, + 110, + 32, + 60, + 84, + 79, + 75, + 69, + 78, + 62, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 65, + 80, + 73, + 32, + 116, + 111, + 107, + 101, + 110, + 32, + 116, + 111, + 32, + 117, + 115, + 101, + 32, + 119, + 104, + 101, + 110, + 32, + 97, + 117, + 116, + 104, + 101, + 110, + 116, + 105, + 99, + 97, + 116, + 105, + 110, + 103, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 114, + 101, + 103, + 105, + 115, + 116, + 114, + 121, + 32, + 60, + 82, + 69, + 71, + 73, + 83, + 84, + 82, + 89, + 62, + 32, + 32, + 82, + 101, + 103, + 105, + 115, + 116, + 114, + 121, + 32, + 116, + 111, + 32, + 117, + 115, + 101, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 102, + 114, + 111, + 122, + 101, + 110, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 82, + 101, + 113, + 117, + 105, + 114, + 101, + 32, + 67, + 97, + 114, + 103, + 111, + 46, + 108, + 111, + 99, + 107, + 32, + 97, + 110, + 100, + 32, + 99, + 97, + 99, + 104, + 101, + 32, + 97, + 114, + 101, + 32, + 117, + 112, + 32, + 116, + 111, + 32, + 100, + 97, + 116, + 101, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 108, + 111, + 99, + 107, + 101, + 100, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 82, + 101, + 113, + 117, + 105, + 114, + 101, + 32, + 67, + 97, + 114, + 103, + 111, + 46, + 108, + 111, + 99, + 107, + 32, + 105, + 115, + 32, + 117, + 112, + 32, + 116, + 111, + 32, + 100, + 97, + 116, + 101, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 111, + 102, + 102, + 108, + 105, + 110, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 82, + 117, + 110, + 32, + 119, + 105, + 116, + 104, + 111, + 117, + 116, + 32, + 97, + 99, + 99, + 101, + 115, + 115, + 105, + 110, + 103, + 32, + 116, + 104, + 101, + 32, + 110, + 101, + 116, + 119, + 111, + 114, + 107, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 45, + 45, + 99, + 111, + 110, + 102, + 105, + 103, + 32, + 60, + 75, + 69, + 89, + 61, + 86, + 65, + 76, + 85, + 69, + 62, + 32, + 32, + 32, + 79, + 118, + 101, + 114, + 114, + 105, + 100, + 101, + 32, + 97, + 32, + 99, + 111, + 110, + 102, + 105, + 103, + 117, + 114, + 97, + 116, + 105, + 111, + 110, + 32, + 118, + 97, + 108, + 117, + 101, + 10, + 32, + 32, + 45, + 90, + 32, + 60, + 70, + 76, + 65, + 71, + 62, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 85, + 110, + 115, + 116, + 97, + 98, + 108, + 101, + 32, + 40, + 110, + 105, + 103, + 104, + 116, + 108, + 121, + 45, + 111, + 110, + 108, + 121, + 41, + 32, + 102, + 108, + 97, + 103, + 115, + 32, + 116, + 111, + 32, + 67, + 97, + 114, + 103, + 111, + 44, + 32, + 115, + 101, + 101, + 32, + 39, + 99, + 97, + 114, + 103, + 111, + 32, + 45, + 90, + 32, + 104, + 101, + 108, + 112, + 39, + 32, + 102, + 111, + 114, + 32, + 100, + 101, + 116, + 97, + 105, + 108, + 115, + 10, + 32, + 32, + 45, + 104, + 44, + 32, + 45, + 45, + 104, + 101, + 108, + 112, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 80, + 114, + 105, + 110, + 116, + 32, + 104, + 101, + 108, + 112, + 10, + 10, + 82, + 117, + 110, + 32, + 96, + 99, + 97, + 114, + 103, + 111, + 32, + 104, + 101, + 108, + 112, + 32, + 111, + 119, + 110, + 101, + 114, + 96, + 32, + 102, + 111, + 114, + 32, + 109, + 111, + 114, + 101, + 32, + 100, + 101, + 116, + 97, + 105, + 108, + 101, + 100, + 32, + 105, + 110, + 102, + 111, + 114, + 109, + 97, + 116, + 105, + 111, + 110, + 46, + 10, + ], + ), + }, +) +test owner::owner_no_subcommand_return_help ... FAILED + +failures: + +failures: + owner::owner_no_subcommand_return_help + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2811 filtered out; finished in 0.26s + diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 999911bc4fb..f98bb135470 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -1003,7 +1003,6 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { .map(|s| s.collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) .unwrap(); - println!("v name == {:#?}", v); let msg = registry.add_owners(&name, &v).with_context(|| { format!( "failed to invite owners to crate `{}` on registry at {}", diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index 17740a2ec37..b3cbebddef4 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `--add` _login_ [_crate_]\ -`cargo owner` [_options_] `--remove` _login_ [_crate_]\ -`cargo owner` [_options_] `--list` [_crate_] +`cargo owner` [_options_] `add` _login_ [_crate_]\ +`cargo owner` [_options_] `remove` _login_ [_crate_]\ +`cargo owner` [_options_] `list` [_crate_] ## DESCRIPTION @@ -27,24 +27,25 @@ information about owners and publishing. ## OPTIONS -### Owner Options +### Subcommand
-
-a
-
--add login
+
add login
Invite the given user or team as an owner.
- -
-r
-
--remove login
+
remove login
Remove the given user or team as an owner.
- -
-l
-
--list
+
list
List owners of a crate.
+
+ + +### Owner Options + +
--token token
API token to use when authenticating. This overrides the token stored in @@ -157,15 +158,15 @@ details on environment variables that Cargo reads. 1. List owners of a package: - cargo owner --list foo + cargo owner list foo 2. Invite an owner to a package: - cargo owner --add username foo + cargo owner add username foo 3. Remove an owner from a package: - cargo owner --remove username foo + cargo owner remove username foo ## SEE ALSO [cargo(1)](cargo.html), [cargo-login(1)](cargo-login.html), [cargo-publish(1)](cargo-publish.html) diff --git a/src/doc/src/reference/publishing.md b/src/doc/src/reference/publishing.md index 013faf6e246..c41a9531a58 100644 --- a/src/doc/src/reference/publishing.md +++ b/src/doc/src/reference/publishing.md @@ -169,15 +169,15 @@ may change over time! The owner of a crate is the only person allowed to publish new versions of the crate, but an owner may designate additional owners. ```console -$ cargo owner --add github-handle -$ cargo owner --remove github-handle -$ cargo owner --add github:rust-lang:owners -$ cargo owner --remove github:rust-lang:owners +$ cargo owner add github-handle +$ cargo owner remove github-handle +$ cargo owner add github:rust-lang:owners +$ cargo owner remove github:rust-lang:owners ``` The owner IDs given to these commands must be GitHub user names or GitHub teams. -If a user name is given to `--add`, that user is invited as a “named” owner, with +If a user name is given to `add`, that user is invited as a “named” owner, with full rights to the crate. In addition to being able to publish or yank versions of the crate, they have the ability to add or remove owners, *including* the owner that made *them* an owner. Needless to say, you shouldn’t make people you diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 1e9cf264b11..99d0dd12355 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -1364,7 +1364,6 @@ fn both_index_and_default() { let p = project().file("src/lib.rs", "").build(); for cmd in &[ "publish", - // "owner add someone", "search", "yank --version 1.0.0", "install foo", diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index 5fdf18b5c09..ffc0bfdf538 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -14,6 +14,128 @@ fn setup(name: &str, content: Option<&str>) { } } +#[cargo_test] +fn no_subcommand_return_help() { + setup("foo", None); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("owner") + .with_status(1) + .with_stderr( + "\ +Manage the owners of a crate on the registry + +Usage: cargo owner [OPTIONS] add OWNER_NAME + cargo owner [OPTIONS] remove OWNER_NAME + cargo owner [OPTIONS] list + +Commands: + add Name of a user or team to invite as an owner + remove Name of a user or team to remove as an owner + list List owners of a crate + +Arguments: + [crate] + +Options: + -q, --quiet Do not print cargo log messages + -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + --index Registry index to modify owners for + --color Coloring: auto, always, never + --token API token to use when authenticating + --registry Registry to use + --frozen Require Cargo.lock and cache are up to date + --locked Require Cargo.lock is up to date + --offline Run without accessing the network + --config Override a configuration value + -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details + -h, --help Print help + +Run `cargo help owner` for more detailed information.", + ) + .run(); +} + +#[cargo_test] +fn add_no_ownername_return_error() { + setup("foo", None); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("owner add") + .with_status(1) + .with_stderr( + "\ +error: the following required arguments were not provided: + + +Usage: cargo owner [OPTIONS] add [OWNER_NAME] + +For more information, try '--help'.", + ) + .run(); +} + +#[cargo_test] +fn remove_no_ownername_return_error() { + setup("foo", None); + + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("owner remove") + .with_status(1) + .with_stderr( + "\ +error: the following required arguments were not provided: + + +Usage: cargo owner [OPTIONS] remove [OWNER_NAME] + +For more information, try '--help'.", + ) + .run(); +} + #[cargo_test] fn simple_list() { let registry = registry::init(); From efaf17bebcf5fc0e8877efd9ab24df3093c2e22b Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Sun, 2 Apr 2023 16:49:28 +0800 Subject: [PATCH 05/28] fix doc --- res.txt | 1264 --------------------------- src/doc/src/commands/cargo-owner.md | 31 +- tests/testsuite/alt_registry.rs | 7 +- 3 files changed, 16 insertions(+), 1286 deletions(-) delete mode 100644 res.txt diff --git a/res.txt b/res.txt deleted file mode 100644 index 12494baeb90..00000000000 --- a/res.txt +++ /dev/null @@ -1,1264 +0,0 @@ - -running 1 test -aaaa -running `/home/heisen/temp/temp-temp/cargo/target/debug/cargo owner` -res === Err( - ProcessError { - desc: "process didn't exit successfully: `/home/heisen/temp/temp-temp/cargo/target/debug/cargo owner` (exit status: 1)\n--- stderr\nManage the owners of a crate on the registry\n\nUsage: cargo owner [OPTIONS] add OWNER_NAME \n cargo owner [OPTIONS] remove OWNER_NAME \n cargo owner [OPTIONS] list \n\nCommands:\n add Name of a user or team to invite as an owner\n remove Name of a user or team to remove as an owner\n list List owners of a crate\n\nArguments:\n [crate] \n\nOptions:\n -q, --quiet Do not print cargo log messages\n -v, --verbose... Use verbose output (-vv very verbose/build.rs output)\n --index Registry index to modify owners for\n --color Coloring: auto, always, never\n --token API token to use when authenticating\n --registry Registry to use\n --frozen Require Cargo.lock and cache are up to date\n --locked Require Cargo.lock is up to date\n --offline Run without accessing the network\n --config Override a configuration value\n -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details\n -h, --help Print help\n\nRun `cargo help owner` for more detailed information.\n", - code: Some( - 1, - ), - stdout: Some( - [], - ), - stderr: Some( - [ - 77, - 97, - 110, - 97, - 103, - 101, - 32, - 116, - 104, - 101, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 32, - 111, - 102, - 32, - 97, - 32, - 99, - 114, - 97, - 116, - 101, - 32, - 111, - 110, - 32, - 116, - 104, - 101, - 32, - 114, - 101, - 103, - 105, - 115, - 116, - 114, - 121, - 10, - 10, - 85, - 115, - 97, - 103, - 101, - 58, - 32, - 99, - 97, - 114, - 103, - 111, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 91, - 79, - 80, - 84, - 73, - 79, - 78, - 83, - 93, - 32, - 97, - 100, - 100, - 32, - 32, - 32, - 32, - 79, - 87, - 78, - 69, - 82, - 95, - 78, - 65, - 77, - 69, - 32, - 60, - 67, - 82, - 65, - 84, - 69, - 95, - 78, - 65, - 77, - 69, - 62, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 99, - 97, - 114, - 103, - 111, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 91, - 79, - 80, - 84, - 73, - 79, - 78, - 83, - 93, - 32, - 114, - 101, - 109, - 111, - 118, - 101, - 32, - 79, - 87, - 78, - 69, - 82, - 95, - 78, - 65, - 77, - 69, - 32, - 60, - 67, - 82, - 65, - 84, - 69, - 95, - 78, - 65, - 77, - 69, - 62, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 99, - 97, - 114, - 103, - 111, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 91, - 79, - 80, - 84, - 73, - 79, - 78, - 83, - 93, - 32, - 108, - 105, - 115, - 116, - 32, - 32, - 32, - 60, - 67, - 82, - 65, - 84, - 69, - 95, - 78, - 65, - 77, - 69, - 62, - 10, - 10, - 67, - 111, - 109, - 109, - 97, - 110, - 100, - 115, - 58, - 10, - 32, - 32, - 97, - 100, - 100, - 32, - 32, - 32, - 32, - 32, - 78, - 97, - 109, - 101, - 32, - 111, - 102, - 32, - 97, - 32, - 117, - 115, - 101, - 114, - 32, - 111, - 114, - 32, - 116, - 101, - 97, - 109, - 32, - 116, - 111, - 32, - 105, - 110, - 118, - 105, - 116, - 101, - 32, - 97, - 115, - 32, - 97, - 110, - 32, - 111, - 119, - 110, - 101, - 114, - 10, - 32, - 32, - 114, - 101, - 109, - 111, - 118, - 101, - 32, - 32, - 78, - 97, - 109, - 101, - 32, - 111, - 102, - 32, - 97, - 32, - 117, - 115, - 101, - 114, - 32, - 111, - 114, - 32, - 116, - 101, - 97, - 109, - 32, - 116, - 111, - 32, - 114, - 101, - 109, - 111, - 118, - 101, - 32, - 97, - 115, - 32, - 97, - 110, - 32, - 111, - 119, - 110, - 101, - 114, - 10, - 32, - 32, - 108, - 105, - 115, - 116, - 32, - 32, - 32, - 32, - 76, - 105, - 115, - 116, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 32, - 111, - 102, - 32, - 97, - 32, - 99, - 114, - 97, - 116, - 101, - 10, - 10, - 65, - 114, - 103, - 117, - 109, - 101, - 110, - 116, - 115, - 58, - 10, - 32, - 32, - 91, - 99, - 114, - 97, - 116, - 101, - 93, - 32, - 32, - 10, - 10, - 79, - 112, - 116, - 105, - 111, - 110, - 115, - 58, - 10, - 32, - 32, - 45, - 113, - 44, - 32, - 45, - 45, - 113, - 117, - 105, - 101, - 116, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 68, - 111, - 32, - 110, - 111, - 116, - 32, - 112, - 114, - 105, - 110, - 116, - 32, - 99, - 97, - 114, - 103, - 111, - 32, - 108, - 111, - 103, - 32, - 109, - 101, - 115, - 115, - 97, - 103, - 101, - 115, - 10, - 32, - 32, - 45, - 118, - 44, - 32, - 45, - 45, - 118, - 101, - 114, - 98, - 111, - 115, - 101, - 46, - 46, - 46, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 85, - 115, - 101, - 32, - 118, - 101, - 114, - 98, - 111, - 115, - 101, - 32, - 111, - 117, - 116, - 112, - 117, - 116, - 32, - 40, - 45, - 118, - 118, - 32, - 118, - 101, - 114, - 121, - 32, - 118, - 101, - 114, - 98, - 111, - 115, - 101, - 47, - 98, - 117, - 105, - 108, - 100, - 46, - 114, - 115, - 32, - 111, - 117, - 116, - 112, - 117, - 116, - 41, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 105, - 110, - 100, - 101, - 120, - 32, - 60, - 73, - 78, - 68, - 69, - 88, - 62, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 82, - 101, - 103, - 105, - 115, - 116, - 114, - 121, - 32, - 105, - 110, - 100, - 101, - 120, - 32, - 116, - 111, - 32, - 109, - 111, - 100, - 105, - 102, - 121, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 32, - 102, - 111, - 114, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 99, - 111, - 108, - 111, - 114, - 32, - 60, - 87, - 72, - 69, - 78, - 62, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 67, - 111, - 108, - 111, - 114, - 105, - 110, - 103, - 58, - 32, - 97, - 117, - 116, - 111, - 44, - 32, - 97, - 108, - 119, - 97, - 121, - 115, - 44, - 32, - 110, - 101, - 118, - 101, - 114, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 116, - 111, - 107, - 101, - 110, - 32, - 60, - 84, - 79, - 75, - 69, - 78, - 62, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 65, - 80, - 73, - 32, - 116, - 111, - 107, - 101, - 110, - 32, - 116, - 111, - 32, - 117, - 115, - 101, - 32, - 119, - 104, - 101, - 110, - 32, - 97, - 117, - 116, - 104, - 101, - 110, - 116, - 105, - 99, - 97, - 116, - 105, - 110, - 103, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 114, - 101, - 103, - 105, - 115, - 116, - 114, - 121, - 32, - 60, - 82, - 69, - 71, - 73, - 83, - 84, - 82, - 89, - 62, - 32, - 32, - 82, - 101, - 103, - 105, - 115, - 116, - 114, - 121, - 32, - 116, - 111, - 32, - 117, - 115, - 101, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 102, - 114, - 111, - 122, - 101, - 110, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 82, - 101, - 113, - 117, - 105, - 114, - 101, - 32, - 67, - 97, - 114, - 103, - 111, - 46, - 108, - 111, - 99, - 107, - 32, - 97, - 110, - 100, - 32, - 99, - 97, - 99, - 104, - 101, - 32, - 97, - 114, - 101, - 32, - 117, - 112, - 32, - 116, - 111, - 32, - 100, - 97, - 116, - 101, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 108, - 111, - 99, - 107, - 101, - 100, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 82, - 101, - 113, - 117, - 105, - 114, - 101, - 32, - 67, - 97, - 114, - 103, - 111, - 46, - 108, - 111, - 99, - 107, - 32, - 105, - 115, - 32, - 117, - 112, - 32, - 116, - 111, - 32, - 100, - 97, - 116, - 101, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 111, - 102, - 102, - 108, - 105, - 110, - 101, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 82, - 117, - 110, - 32, - 119, - 105, - 116, - 104, - 111, - 117, - 116, - 32, - 97, - 99, - 99, - 101, - 115, - 115, - 105, - 110, - 103, - 32, - 116, - 104, - 101, - 32, - 110, - 101, - 116, - 119, - 111, - 114, - 107, - 10, - 32, - 32, - 32, - 32, - 32, - 32, - 45, - 45, - 99, - 111, - 110, - 102, - 105, - 103, - 32, - 60, - 75, - 69, - 89, - 61, - 86, - 65, - 76, - 85, - 69, - 62, - 32, - 32, - 32, - 79, - 118, - 101, - 114, - 114, - 105, - 100, - 101, - 32, - 97, - 32, - 99, - 111, - 110, - 102, - 105, - 103, - 117, - 114, - 97, - 116, - 105, - 111, - 110, - 32, - 118, - 97, - 108, - 117, - 101, - 10, - 32, - 32, - 45, - 90, - 32, - 60, - 70, - 76, - 65, - 71, - 62, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 85, - 110, - 115, - 116, - 97, - 98, - 108, - 101, - 32, - 40, - 110, - 105, - 103, - 104, - 116, - 108, - 121, - 45, - 111, - 110, - 108, - 121, - 41, - 32, - 102, - 108, - 97, - 103, - 115, - 32, - 116, - 111, - 32, - 67, - 97, - 114, - 103, - 111, - 44, - 32, - 115, - 101, - 101, - 32, - 39, - 99, - 97, - 114, - 103, - 111, - 32, - 45, - 90, - 32, - 104, - 101, - 108, - 112, - 39, - 32, - 102, - 111, - 114, - 32, - 100, - 101, - 116, - 97, - 105, - 108, - 115, - 10, - 32, - 32, - 45, - 104, - 44, - 32, - 45, - 45, - 104, - 101, - 108, - 112, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 80, - 114, - 105, - 110, - 116, - 32, - 104, - 101, - 108, - 112, - 10, - 10, - 82, - 117, - 110, - 32, - 96, - 99, - 97, - 114, - 103, - 111, - 32, - 104, - 101, - 108, - 112, - 32, - 111, - 119, - 110, - 101, - 114, - 96, - 32, - 102, - 111, - 114, - 32, - 109, - 111, - 114, - 101, - 32, - 100, - 101, - 116, - 97, - 105, - 108, - 101, - 100, - 32, - 105, - 110, - 102, - 111, - 114, - 109, - 97, - 116, - 105, - 111, - 110, - 46, - 10, - ], - ), - }, -) -test owner::owner_no_subcommand_return_help ... FAILED - -failures: - -failures: - owner::owner_no_subcommand_return_help - -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2811 filtered out; finished in 0.26s - diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index b3cbebddef4..17740a2ec37 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `add` _login_ [_crate_]\ -`cargo owner` [_options_] `remove` _login_ [_crate_]\ -`cargo owner` [_options_] `list` [_crate_] +`cargo owner` [_options_] `--add` _login_ [_crate_]\ +`cargo owner` [_options_] `--remove` _login_ [_crate_]\ +`cargo owner` [_options_] `--list` [_crate_] ## DESCRIPTION @@ -27,25 +27,24 @@ information about owners and publishing. ## OPTIONS -### Subcommand +### Owner Options
-
add login
+
-a
+
--add login
Invite the given user or team as an owner.
-
remove login
-
Remove the given user or team as an owner.
-
list
-
List owners of a crate.
- -
+
-r
+
--remove login
+
Remove the given user or team as an owner.
-### Owner Options +
-l
+
--list
+
List owners of a crate.
-
--token token
API token to use when authenticating. This overrides the token stored in @@ -158,15 +157,15 @@ details on environment variables that Cargo reads. 1. List owners of a package: - cargo owner list foo + cargo owner --list foo 2. Invite an owner to a package: - cargo owner add username foo + cargo owner --add username foo 3. Remove an owner from a package: - cargo owner remove username foo + cargo owner --remove username foo ## SEE ALSO [cargo(1)](cargo.html), [cargo-login(1)](cargo-login.html), [cargo-publish(1)](cargo-publish.html) diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 99d0dd12355..068bbafc6fc 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -1362,12 +1362,7 @@ fn both_index_and_registry() { #[cargo_test] fn both_index_and_default() { let p = project().file("src/lib.rs", "").build(); - for cmd in &[ - "publish", - "search", - "yank --version 1.0.0", - "install foo", - ] { + for cmd in &["publish", "search", "yank --version 1.0.0", "install foo"] { p.cargo(cmd) .env("CARGO_REGISTRY_DEFAULT", "undefined") .arg(format!("--index=index_url")) From 3a99929a065fc5d860002034dddb2f437a642bc2 Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Tue, 4 Apr 2023 20:34:25 +0800 Subject: [PATCH 06/28] fix some problem --- src/bin/cargo/commands/owner.rs | 53 +++++++++++++-------------------- src/cargo/ops/registry.rs | 26 +++++----------- 2 files changed, 29 insertions(+), 50 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 69b5d80e61b..07f08c1075c 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -6,66 +6,50 @@ use cargo::util::auth::Secret; pub fn cli() -> Command { subcommand("owner") .about("Manage the owners of a crate on the registry") - .arg(Arg::new("crate").action(ArgAction::Set)) + .arg(Arg::new("crate")) .arg_required_else_help(true) + .args_conflicts_with_subcommands(true) .override_usage( "\ - cargo owner [OPTIONS] add OWNER_NAME - cargo owner [OPTIONS] remove OWNER_NAME - cargo owner [OPTIONS] list ", + cargo owner [OPTIONS] add [CRATE_NAME] + cargo owner [OPTIONS] remove [CRATE_NAME] + cargo owner [OPTIONS] list [CRATE_NAME]", ) .arg_quiet() .subcommands([ Command::new("add") .about("Name of a user or team to invite as an owner") - .override_usage( - "\ - cargo owner [OPTIONS] add [OWNER_NAME] ", - ) .arg_quiet() .args([ Arg::new("ownername") - .action(ArgAction::Set) .required(true) - .num_args(1) .value_delimiter(',') - .value_name("OWNER_NAME"), + .value_name("OWNER_NAME") + .help("Name of the owner you want to invite"), Arg::new("cratename") - .action(ArgAction::Set) - .num_args(1) - .value_name("CRATE_NAME"), + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), ]), Command::new("remove") .about("Name of a user or team to remove as an owner") - .override_usage( - "\ - cargo owner [OPTIONS] remove [OWNER_NAME] ", - ) .arg_quiet() .args([ Arg::new("ownername") - .action(ArgAction::Set) .required(true) - .num_args(1) .value_delimiter(',') - .value_name("OWNER_NAME"), + .value_name("OWNER_NAME") + .help("Name of the owner you want to remove"), Arg::new("cratename") - .action(ArgAction::Set) - .num_args(1) - .value_name("CRATE_NAME"), + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), ]), Command::new("list") .about("List owners of a crate") - .override_usage( - "\ - cargo owner [OPTIONS] list ", - ) .arg_quiet() .arg( Arg::new("cratename") - .action(ArgAction::Set) - .num_args(1) - .value_name("CRATE_NAME"), + .value_name("CRATE_NAME") + .help("Crate name which you want to list all owner names"), ), ]) .arg(opt("index", "Registry index to modify owners for").value_name("INDEX")) @@ -87,10 +71,15 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { }; let opts = OwnersOptions { + krate: arg.clone().get_one::("cratename").cloned(), token: args.get_one::("token").cloned().map(Secret::from), index: args.get_one::("index").cloned(), subcommand: Some(sc.to_owned()), - subcommand_arg: Some(arg.clone()), + ownernames: Some( + arg.get_many::("ownername") + .map(|s| s.cloned().collect::>()) + .unwrap(), + ), registry, }; diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 96084c4b868..d3fb138f9df 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -39,8 +39,6 @@ use crate::util::{truncate_with_ellipsis, IntoUrl}; use crate::util::{Progress, ProgressStyle}; use crate::{drop_print, drop_println, version}; -use crate::util::command_prelude::ArgMatches; - /// Registry settings loaded from config files. /// /// This is loaded based on the `--registry` flag and the config settings. @@ -974,21 +972,17 @@ pub fn registry_logout(config: &Config, reg: Option<&str>) -> CargoResult<()> { } pub struct OwnersOptions { + pub krate: Option, pub token: Option>, pub index: Option, pub subcommand: Option, - pub subcommand_arg: Option, + pub ownernames: Option>, pub registry: Option, } pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { - let name = match opts - .subcommand_arg - .as_ref() - .unwrap() - .get_one::("cratename") - { - Some(ref name) => name.clone().to_string(), + let name = match opts.krate { + Some(ref name) => name.clone(), None => { let manifest_path = find_root_manifest_for_wd(config.cwd())?; let ws = Workspace::new(&manifest_path, config)?; @@ -1010,11 +1004,9 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { match opts.subcommand.as_ref().map(|s| s.as_str()) { Some("add") => { let v = opts - .subcommand_arg + .ownernames .as_ref() - .unwrap() - .get_many::("ownername") - .map(|s| s.collect::>()) + .map(|s| s.iter().collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) .unwrap(); let msg = registry.add_owners(&name, &v).with_context(|| { @@ -1030,11 +1022,9 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { Some("remove") => { let v = opts - .subcommand_arg + .ownernames .as_ref() - .unwrap() - .get_many::("ownername") - .map(|s| s.collect::>()) + .map(|s| s.iter().collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) .unwrap(); config From a2a59eaf0081ad92ea5c667f64d36e451f2001db Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Tue, 4 Apr 2023 21:04:07 +0800 Subject: [PATCH 07/28] Revised based on review comments --- src/bin/cargo/commands/owner.rs | 65 ++++++++++++---- src/cargo/ops/registry.rs | 51 ++++++++++++ src/doc/man/cargo-owner.md | 26 ++++--- src/doc/man/generated_txt/cargo-owner.txt | 21 ++--- src/doc/src/commands/cargo-owner.md | 29 +++---- src/doc/src/reference/publishing.md | 2 +- src/etc/man/cargo-owner.1 | 24 +++--- tests/testsuite/alt_registry.rs | 5 ++ tests/testsuite/owner.rs | 95 +++++++++++++---------- 9 files changed, 216 insertions(+), 102 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 07f08c1075c..8d05d728292 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -6,16 +6,36 @@ use cargo::util::auth::Secret; pub fn cli() -> Command { subcommand("owner") .about("Manage the owners of a crate on the registry") + .arg_quiet() .arg(Arg::new("crate")) .arg_required_else_help(true) - .args_conflicts_with_subcommands(true) + // The following three parameters are planned to be replaced in the form of subcommands. + // refer to issue: https://github.com/rust-lang/cargo/issues/4352 + .arg( + multi_opt( + "add", + "LOGIN", + "Name of a user or team to invite as an owner", + ) + .short('a') + .hide(true), + ) + .arg( + multi_opt( + "remove", + "LOGIN", + "Name of a user or team to remove as an owner", + ) + .short('r') + .hide(true), + ) + .arg(flag("list", "List owners of a crate").short('l').hide(true)) .override_usage( "\ cargo owner [OPTIONS] add [CRATE_NAME] cargo owner [OPTIONS] remove [CRATE_NAME] cargo owner [OPTIONS] list [CRATE_NAME]", ) - .arg_quiet() .subcommands([ Command::new("add") .about("Name of a user or team to invite as an owner") @@ -61,25 +81,40 @@ pub fn cli() -> Command { pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { let registry = args.registry(config)?; - let Some((sc, arg)) = args.subcommand() else { - return Err(CliError::new( - anyhow::format_err!( - "you need to specify the subcommands to be operated: add, remove or list." - ), - 101, - )); + let (sc, krate, ownernames) = if let Some((sc, arg)) = args.subcommand() { + let ownernames = if sc == "list" { + Vec::::new() + } else { + arg.get_many::("ownername") + .map(|s| s.cloned().collect::>()) + .unwrap() + }; + ( + sc, + arg.clone().get_one::("cratename").cloned(), + ownernames, + ) + } else { + ( + "", + args.get_one::("crate").cloned(), + Vec::::new(), + ) }; let opts = OwnersOptions { - krate: arg.clone().get_one::("cratename").cloned(), + krate: krate, token: args.get_one::("token").cloned().map(Secret::from), index: args.get_one::("index").cloned(), + to_add: args + .get_many::("add") + .map(|xs| xs.cloned().collect()), + to_remove: args + .get_many::("remove") + .map(|xs| xs.cloned().collect()), + list: args.flag("list"), subcommand: Some(sc.to_owned()), - ownernames: Some( - arg.get_many::("ownername") - .map(|s| s.cloned().collect::>()) - .unwrap(), - ), + ownernames: Some(ownernames), registry, }; diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index d3fb138f9df..4452e324f86 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -975,6 +975,9 @@ pub struct OwnersOptions { pub krate: Option, pub token: Option>, pub index: Option, + pub to_add: Option>, + pub to_remove: Option>, + pub list: bool, pub subcommand: Option, pub ownernames: Option>, pub registry: Option, @@ -1001,6 +1004,54 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { Some(mutation), )?; + if opts.subcommand == Some("".to_string()) { + if let Some(ref v) = opts.to_add { + let v = v.iter().map(|s| &s[..]).collect::>(); + let msg = registry.add_owners(&name, &v).with_context(|| { + format!( + "failed to invite owners to crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + + config.shell().status("Owner", msg)?; + } + + if let Some(ref v) = opts.to_remove { + let v = v.iter().map(|s| &s[..]).collect::>(); + config + .shell() + .status("Owner", format!("removing {:?} from crate {}", v, name))?; + registry.remove_owners(&name, &v).with_context(|| { + format!( + "failed to remove owners from crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + } + + if opts.list { + let owners = registry.list_owners(&name).with_context(|| { + format!( + "failed to list owners of crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + for owner in owners.iter() { + drop_print!(config, "{}", owner.login); + match (owner.name.as_ref(), owner.email.as_ref()) { + (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), + (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), + (None, None) => drop_println!(config), + } + } + } + return Ok(()); + } + match opts.subcommand.as_ref().map(|s| s.as_str()) { Some("add") => { let v = opts diff --git a/src/doc/man/cargo-owner.md b/src/doc/man/cargo-owner.md index 32791696887..adbf72170b3 100644 --- a/src/doc/man/cargo-owner.md +++ b/src/doc/man/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `--add` _login_ [_crate_]\ -`cargo owner` [_options_] `--remove` _login_ [_crate_]\ -`cargo owner` [_options_] `--list` [_crate_] +`cargo owner` [_options_] `add` _login_ [_crate_]\ +`cargo owner` [_options_] `remove` _login_ [_crate_]\ +`cargo owner` [_options_] `list` [_crate_] ## DESCRIPTION @@ -27,22 +27,28 @@ information about owners and publishing. ## OPTIONS -### Owner Options +### Subcommand {{#options}} -{{#option "`-a`" "`--add` _login_..." }} +{{#option "`add` _login_..." }} Invite the given user or team as an owner. {{/option}} -{{#option "`-r`" "`--remove` _login_..." }} +{{#option "`remove` _login_..." }} Remove the given user or team as an owner. {{/option}} -{{#option "`-l`" "`--list`" }} +{{#option "`list`" }} List owners of a crate. {{/option}} +{{/options}} + +### Owner Options + +{{#options}} + {{> options-token }} {{> options-index }} @@ -67,15 +73,15 @@ List owners of a crate. 1. List owners of a package: - cargo owner --list foo + cargo owner list foo 2. Invite an owner to a package: - cargo owner --add username foo + cargo owner add username foo 3. Remove an owner from a package: - cargo owner --remove username foo + cargo owner remove username foo ## SEE ALSO {{man "cargo" 1}}, {{man "cargo-login" 1}}, {{man "cargo-publish" 1}} diff --git a/src/doc/man/generated_txt/cargo-owner.txt b/src/doc/man/generated_txt/cargo-owner.txt index 18a52503a4b..377f8760b3f 100644 --- a/src/doc/man/generated_txt/cargo-owner.txt +++ b/src/doc/man/generated_txt/cargo-owner.txt @@ -4,9 +4,9 @@ NAME cargo-owner — Manage the owners of a crate on the registry SYNOPSIS - cargo owner [options] --add login [crate] - cargo owner [options] --remove login [crate] - cargo owner [options] --list [crate] + cargo owner [options] add login [crate] + cargo owner [options] remove login [crate] + cargo owner [options] list [crate] DESCRIPTION This command will modify the owners for a crate on the registry. Owners @@ -24,16 +24,17 @@ DESCRIPTION for more information about owners and publishing. OPTIONS - Owner Options - -a, --add login… + Subcommand + add login… Invite the given user or team as an owner. - -r, --remove login… + remove login… Remove the given user or team as an owner. - -l, --list + list List owners of a crate. + Owner Options --token token API token to use when authenticating. This overrides the token stored in the credentials file (which is created by cargo-login(1)). @@ -124,15 +125,15 @@ EXIT STATUS EXAMPLES 1. List owners of a package: - cargo owner --list foo + cargo owner list foo 2. Invite an owner to a package: - cargo owner --add username foo + cargo owner add username foo 3. Remove an owner from a package: - cargo owner --remove username foo + cargo owner remove username foo SEE ALSO cargo(1), cargo-login(1), cargo-publish(1) diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index 17740a2ec37..4638519fb1c 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `--add` _login_ [_crate_]\ -`cargo owner` [_options_] `--remove` _login_ [_crate_]\ -`cargo owner` [_options_] `--list` [_crate_] +`cargo owner` [_options_] `add` _login_ [_crate_]\ +`cargo owner` [_options_] `remove` _login_ [_crate_]\ +`cargo owner` [_options_] `list` [_crate_] ## DESCRIPTION @@ -27,25 +27,28 @@ information about owners and publishing. ## OPTIONS -### Owner Options +### Subcommand
-
-a
-
--add login
+
add login
Invite the given user or team as an owner.
-
-r
-
--remove login
+
remove login
Remove the given user or team as an owner.
-
-l
-
--list
+
list
List owners of a crate.
+
+ +### Owner Options + +
+
--token token
API token to use when authenticating. This overrides the token stored in the credentials file (which is created by cargo-login(1)).

@@ -157,15 +160,15 @@ details on environment variables that Cargo reads. 1. List owners of a package: - cargo owner --list foo + cargo owner list foo 2. Invite an owner to a package: - cargo owner --add username foo + cargo owner add username foo 3. Remove an owner from a package: - cargo owner --remove username foo + cargo owner remove username foo ## SEE ALSO [cargo(1)](cargo.html), [cargo-login(1)](cargo-login.html), [cargo-publish(1)](cargo-publish.html) diff --git a/src/doc/src/reference/publishing.md b/src/doc/src/reference/publishing.md index c41a9531a58..f5c04efee77 100644 --- a/src/doc/src/reference/publishing.md +++ b/src/doc/src/reference/publishing.md @@ -184,7 +184,7 @@ owner that made *them* an owner. Needless to say, you shouldn’t make people yo don’t fully trust into a named owner. In order to become a named owner, a user must have logged into [crates.io] previously. -If a team name is given to `--add`, that team is invited as a “team” owner, with +If a team name is given to `add`, that team is invited as a “team” owner, with restricted right to the crate. While they have permission to publish or yank versions of the crate, they *do not* have the ability to add or remove owners. In addition to being more convenient for managing groups of owners, teams are diff --git a/src/etc/man/cargo-owner.1 b/src/etc/man/cargo-owner.1 index 1977aae5cca..c929f9b3b3f 100644 --- a/src/etc/man/cargo-owner.1 +++ b/src/etc/man/cargo-owner.1 @@ -6,11 +6,11 @@ .SH "NAME" cargo\-owner \[em] Manage the owners of a crate on the registry .SH "SYNOPSIS" -\fBcargo owner\fR [\fIoptions\fR] \fB\-\-add\fR \fIlogin\fR [\fIcrate\fR] +\fBcargo owner\fR [\fIoptions\fR] \fBadd\fR \fIlogin\fR [\fIcrate\fR] .br -\fBcargo owner\fR [\fIoptions\fR] \fB\-\-remove\fR \fIlogin\fR [\fIcrate\fR] +\fBcargo owner\fR [\fIoptions\fR] \fBremove\fR \fIlogin\fR [\fIcrate\fR] .br -\fBcargo owner\fR [\fIoptions\fR] \fB\-\-list\fR [\fIcrate\fR] +\fBcargo owner\fR [\fIoptions\fR] \fBlist\fR [\fIcrate\fR] .SH "DESCRIPTION" This command will modify the owners for a crate on the registry. Owners of a crate can upload new versions and yank old versions. Non\-team owners can also @@ -25,25 +25,23 @@ current directory. See \fIthe reference\fR for more information about owners and publishing. .SH "OPTIONS" -.SS "Owner Options" +.SS "Subcommand" .sp -\fB\-a\fR, -\fB\-\-add\fR \fIlogin\fR\[u2026] +\fBadd\fR \fIlogin\fR\[u2026] .RS 4 Invite the given user or team as an owner. .RE .sp -\fB\-r\fR, -\fB\-\-remove\fR \fIlogin\fR\[u2026] +\fBremove\fR \fIlogin\fR\[u2026] .RS 4 Remove the given user or team as an owner. .RE .sp -\fB\-l\fR, -\fB\-\-list\fR +\fBlist\fR .RS 4 List owners of a crate. .RE +.SS "Owner Options" .sp \fB\-\-token\fR \fItoken\fR .RS 4 @@ -163,7 +161,7 @@ details on environment variables that Cargo reads. .sp .RS 4 .nf -cargo owner \-\-list foo +cargo owner list foo .fi .RE .RE @@ -173,7 +171,7 @@ cargo owner \-\-list foo .sp .RS 4 .nf -cargo owner \-\-add username foo +cargo owner add username foo .fi .RE .RE @@ -183,7 +181,7 @@ cargo owner \-\-add username foo .sp .RS 4 .nf -cargo owner \-\-remove username foo +cargo owner remove username foo .fi .RE .RE diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 068bbafc6fc..9a75a00589b 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -765,6 +765,11 @@ fn no_api() { .with_stderr_contains(&err) .run(); + p.cargo("owner --registry alternative --list") + .with_status(101) + .with_stderr_contains(&err) + .run(); + p.cargo("yank --registry alternative --version=0.0.1 bar") .with_status(101) .with_stderr_contains(&err) diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index ffc0bfdf538..6c2872ce867 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -39,9 +39,9 @@ fn no_subcommand_return_help() { "\ Manage the owners of a crate on the registry -Usage: cargo owner [OPTIONS] add OWNER_NAME - cargo owner [OPTIONS] remove OWNER_NAME - cargo owner [OPTIONS] list +Usage: cargo owner [OPTIONS] add [CRATE_NAME] + cargo owner [OPTIONS] remove [CRATE_NAME] + cargo owner [OPTIONS] list [CRATE_NAME] Commands: add Name of a user or team to invite as an owner @@ -54,13 +54,13 @@ Arguments: Options: -q, --quiet Do not print cargo log messages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) - --index Registry index to modify owners for --color Coloring: auto, always, never - --token API token to use when authenticating - --registry Registry to use --frozen Require Cargo.lock and cache are up to date + --index Registry index to modify owners for --locked Require Cargo.lock is up to date + --token API token to use when authenticating --offline Run without accessing the network + --registry Registry to use --config Override a configuration value -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details -h, --help Print help @@ -96,7 +96,7 @@ fn add_no_ownername_return_error() { error: the following required arguments were not provided: -Usage: cargo owner [OPTIONS] add [OWNER_NAME] +Usage: cargo owner add [CRATE_NAME] For more information, try '--help'.", ) @@ -129,7 +129,7 @@ fn remove_no_ownername_return_error() { error: the following required arguments were not provided: -Usage: cargo owner [OPTIONS] remove [OWNER_NAME] +Usage: cargo owner remove [CRATE_NAME] For more information, try '--help'.", ) @@ -169,15 +169,18 @@ fn simple_list() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner list") - .replace_crates_io(registry.index_url()) - .with_stdout( - "\ + let commands = ["-l", "--list", "list"]; + for command in commands.iter() { + p.cargo(&format!("owner {}", command)) + .replace_crates_io(registry.index_url()) + .with_stdout( + "\ github:rust-lang:core (Core) octocat ", - ) - .run(); + ) + .run(); + } } #[cargo_test] @@ -200,17 +203,20 @@ fn simple_add() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner add username") - .replace_crates_io(registry.index_url()) - .with_status(101) - .with_stderr( - " Updating crates.io index + let commands = ["-a", "--add", "add"]; + for command in commands.iter() { + p.cargo(&format!("owner {} username", command)) + .replace_crates_io(registry.index_url()) + .with_status(101) + .with_stderr( + " Updating crates.io index error: failed to invite owners to crate `foo` on registry at file://[..] Caused by: EOF while parsing a value at line 1 column 0", - ) - .run(); + ) + .run(); + } } #[cargo_test] @@ -238,12 +244,15 @@ fn simple_add_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner add username") - .arg("-Zregistry-auth") - .masquerade_as_nightly_cargo(&["registry-auth"]) - .replace_crates_io(registry.index_url()) - .with_status(0) - .run(); + let commands = ["-a", "--add", "add"]; + for command in commands.iter() { + p.cargo(&format!("owner {} username", command)) + .arg("-Zregistry-auth") + .masquerade_as_nightly_cargo(&["registry-auth"]) + .replace_crates_io(registry.index_url()) + .with_status(0) + .run(); + } } #[cargo_test] @@ -266,18 +275,21 @@ fn simple_remove() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("owner remove username") - .replace_crates_io(registry.index_url()) - .with_status(101) - .with_stderr( - " Updating crates.io index + let commands = ["remove", "--remove", "-r"]; + for command in commands.iter() { + p.cargo(&format!("owner {} username", command)) + .replace_crates_io(registry.index_url()) + .with_status(101) + .with_stderr( + " Updating crates.io index Owner removing [\"username\"] from crate foo error: failed to remove owners from crate `foo` on registry at file://[..] Caused by: EOF while parsing a value at line 1 column 0", - ) - .run(); + ) + .run(); + } } #[cargo_test] @@ -305,10 +317,13 @@ fn simple_remove_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner remove username") - .arg("-Zregistry-auth") - .replace_crates_io(registry.index_url()) - .masquerade_as_nightly_cargo(&["registry-auth"]) - .with_status(0) - .run(); + let commands = ["-r", "--remove", "remove"]; + for command in commands.iter() { + p.cargo(&format!("owner {} username", command)) + .arg("-Zregistry-auth") + .replace_crates_io(registry.index_url()) + .masquerade_as_nightly_cargo(&["registry-auth"]) + .with_status(0) + .run(); + } } From 08be20fb27300e60fef90c3e2470ee07ce72365b Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Mon, 10 Apr 2023 17:04:11 +0800 Subject: [PATCH 08/28] Use enumerate and move parameters to subcommands --- src/bin/cargo/commands/owner.rs | 154 +++++++++++++--------- src/cargo/ops/mod.rs | 2 +- src/cargo/ops/registry.rs | 123 +++++++++-------- src/doc/man/cargo-owner.md | 6 +- src/doc/man/generated_txt/cargo-owner.txt | 6 +- src/doc/src/commands/cargo-owner.md | 6 +- src/etc/man/cargo-owner.1 | 6 +- tests/testsuite/alt_registry.rs | 17 +-- tests/testsuite/credential_process.rs | 17 ++- tests/testsuite/owner.rs | 109 +++++++++++---- 10 files changed, 272 insertions(+), 174 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 8d05d728292..cf3caa33865 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -1,14 +1,21 @@ use crate::command_prelude::*; -use cargo::ops::{self, OwnersOptions}; +use cargo::ops::{self, OwnersOptions, SubCommand}; use cargo::util::auth::Secret; pub fn cli() -> Command { subcommand("owner") .about("Manage the owners of a crate on the registry") .arg_quiet() - .arg(Arg::new("crate")) + .arg(Arg::new("crate").hide(true)) .arg_required_else_help(true) + .args_conflicts_with_subcommands(true) + .override_usage( + "\ + cargo owner add [CRATE_NAME] [OPTIONS] + cargo owner remove [CRATE_NAME] [OPTIONS] + cargo owner list [CRATE_NAME] [OPTIONS]", + ) // The following three parameters are planned to be replaced in the form of subcommands. // refer to issue: https://github.com/rust-lang/cargo/issues/4352 .arg( @@ -30,47 +37,47 @@ pub fn cli() -> Command { .hide(true), ) .arg(flag("list", "List owners of a crate").short('l').hide(true)) - .override_usage( - "\ - cargo owner [OPTIONS] add [CRATE_NAME] - cargo owner [OPTIONS] remove [CRATE_NAME] - cargo owner [OPTIONS] list [CRATE_NAME]", - ) .subcommands([ - Command::new("add") - .about("Name of a user or team to invite as an owner") - .arg_quiet() - .args([ - Arg::new("ownername") - .required(true) - .value_delimiter(',') - .value_name("OWNER_NAME") - .help("Name of the owner you want to invite"), - Arg::new("cratename") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]), - Command::new("remove") - .about("Name of a user or team to remove as an owner") - .arg_quiet() - .args([ - Arg::new("ownername") - .required(true) - .value_delimiter(',') - .value_name("OWNER_NAME") - .help("Name of the owner you want to remove"), - Arg::new("cratename") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]), - Command::new("list") - .about("List owners of a crate") - .arg_quiet() - .arg( - Arg::new("cratename") - .value_name("CRATE_NAME") - .help("Crate name which you want to list all owner names"), - ), + add_arg( + Command::new("add") + .about("Name of a user or team to invite as an owner") + .arg_quiet() + .args([ + Arg::new("addowner") + .required(true) + .value_delimiter(',') + .value_name("OWNER_NAME") + .help("Name of the owner you want to invite"), + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), + ]), + ), + add_arg( + Command::new("remove") + .about("Name of a user or team to remove as an owner") + .arg_quiet() + .args([ + Arg::new("removeowner") + .required(true) + .value_delimiter(',') + .value_name("OWNER_NAME") + .help("Name of the owner you want to remove"), + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), + ]), + ), + add_arg( + Command::new("list") + .about("List owners of a crate") + .arg_quiet() + .arg( + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name which you want to list all owner names"), + ), + ), ]) .arg(opt("index", "Registry index to modify owners for").value_name("INDEX")) .arg(opt("token", "API token to use when authenticating").value_name("TOKEN")) @@ -78,43 +85,62 @@ pub fn cli() -> Command { .after_help("Run `cargo help owner` for more detailed information.\n") } +fn add_arg(com: Command) -> Command { + com.arg(opt("index", "Registry index to modify owners for").value_name("INDEX")) + .arg(opt("token", "API token to use when authenticating").value_name("TOKEN")) + .arg(opt("registry", "Registry to use").value_name("REGISTRY")) +} + pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { - let registry = args.registry(config)?; + let command = args.subcommand(); - let (sc, krate, ownernames) = if let Some((sc, arg)) = args.subcommand() { - let ownernames = if sc == "list" { - Vec::::new() - } else { - arg.get_many::("ownername") - .map(|s| s.cloned().collect::>()) - .unwrap() + let (sc, krate, token, index, registry) = if command.is_some() { + let (sc, arg) = command.unwrap(); + let subcommand = match sc { + "list" => SubCommand::List, + "add" => SubCommand::Add, + "remove" => SubCommand::Remove, + _ => SubCommand::None, }; ( - sc, - arg.clone().get_one::("cratename").cloned(), - ownernames, + subcommand, + arg.clone().get_one::("crate").cloned(), + arg.get_one::("token").cloned().map(Secret::from), + arg.get_one::("index").cloned(), + arg.registry(config)?, ) } else { ( - "", - args.get_one::("crate").cloned(), - Vec::::new(), + SubCommand::None, + args.clone().get_one::("crate").cloned(), + args.get_one::("token").cloned().map(Secret::from), + args.get_one::("index").cloned(), + args.registry(config)?, ) }; + let addons = args.subcommand_matches("add").and_then(|x| { + x.get_many::("addowner") + .map(|xs| xs.cloned().collect::>()) + }); + + let removeons = args.subcommand_matches("remove").and_then(|x| { + x.get_many::("removeowner") + .map(|xs| xs.cloned().collect::>()) + }); + let opts = OwnersOptions { krate: krate, - token: args.get_one::("token").cloned().map(Secret::from), - index: args.get_one::("index").cloned(), - to_add: args + token: token, + index: index, + to_add: addons.or(args .get_many::("add") - .map(|xs| xs.cloned().collect()), - to_remove: args + .map(|xs| xs.cloned().collect())), + to_remove: removeons.or(args .get_many::("remove") - .map(|xs| xs.cloned().collect()), + .map(|xs| xs.cloned().collect())), list: args.flag("list"), - subcommand: Some(sc.to_owned()), - ownernames: Some(ownernames), + subcommand: Some(sc), registry, }; diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 4b6aea991bd..22fc597e7e6 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -23,7 +23,7 @@ pub use self::fix::{fix, fix_exec_rustc, fix_get_proxy_lock_addr, FixOptions}; pub use self::lockfile::{load_pkg_lockfile, resolve_to_string, write_pkg_lockfile}; pub use self::registry::HttpTimeout; pub use self::registry::{configure_http_handle, http_handle, http_handle_and_timeout}; -pub use self::registry::{modify_owners, yank, OwnersOptions, PublishOpts}; +pub use self::registry::{modify_owners, yank, OwnersOptions, PublishOpts, SubCommand}; pub use self::registry::{needs_custom_http_transport, registry_login, registry_logout, search}; pub use self::registry::{publish, RegistryCredentialConfig}; pub use self::resolve::{ diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 4452e324f86..8d6fd6a6289 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -971,6 +971,13 @@ pub fn registry_logout(config: &Config, reg: Option<&str>) -> CargoResult<()> { Ok(()) } +pub enum SubCommand { + Add, + Remove, + List, + None, +} + pub struct OwnersOptions { pub krate: Option, pub token: Option>, @@ -978,8 +985,7 @@ pub struct OwnersOptions { pub to_add: Option>, pub to_remove: Option>, pub list: bool, - pub subcommand: Option, - pub ownernames: Option>, + pub subcommand: Option, pub registry: Option, } @@ -1004,58 +1010,10 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { Some(mutation), )?; - if opts.subcommand == Some("".to_string()) { - if let Some(ref v) = opts.to_add { - let v = v.iter().map(|s| &s[..]).collect::>(); - let msg = registry.add_owners(&name, &v).with_context(|| { - format!( - "failed to invite owners to crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - - config.shell().status("Owner", msg)?; - } - - if let Some(ref v) = opts.to_remove { - let v = v.iter().map(|s| &s[..]).collect::>(); - config - .shell() - .status("Owner", format!("removing {:?} from crate {}", v, name))?; - registry.remove_owners(&name, &v).with_context(|| { - format!( - "failed to remove owners from crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - } - - if opts.list { - let owners = registry.list_owners(&name).with_context(|| { - format!( - "failed to list owners of crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - for owner in owners.iter() { - drop_print!(config, "{}", owner.login); - match (owner.name.as_ref(), owner.email.as_ref()) { - (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), - (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), - (None, None) => drop_println!(config), - } - } - } - return Ok(()); - } - - match opts.subcommand.as_ref().map(|s| s.as_str()) { - Some("add") => { + match opts.subcommand.as_ref().unwrap() { + SubCommand::Add => { let v = opts - .ownernames + .to_add .as_ref() .map(|s| s.iter().collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) @@ -1071,9 +1029,9 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { config.shell().status("Owner", msg)?; } - Some("remove") => { + SubCommand::Remove => { let v = opts - .ownernames + .to_remove .as_ref() .map(|s| s.iter().collect::>()) .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) @@ -1090,7 +1048,7 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { })?; } - Some("list") => { + SubCommand::List => { let owners = registry.list_owners(&name).with_context(|| { format!( "failed to list owners of crate `{}` on registry at {}", @@ -1108,12 +1066,53 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { } } - _ => { - anyhow::bail!( - " - You have entered an incorrect subcommand. \ - Run the `--help` command to obtain more information." - ); + SubCommand::None => { + if let Some(ref v) = opts.to_add { + let v = v.iter().map(|s| &s[..]).collect::>(); + let msg = registry.add_owners(&name, &v).with_context(|| { + format!( + "failed to invite owners to crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + + config.shell().status("Owner", msg)?; + } + + if let Some(ref v) = opts.to_remove { + let v = v.iter().map(|s| &s[..]).collect::>(); + config + .shell() + .status("Owner", format!("removing {:?} from crate {}", v, name))?; + registry.remove_owners(&name, &v).with_context(|| { + format!( + "failed to remove owners from crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + } + + if opts.list { + let owners = registry.list_owners(&name).with_context(|| { + format!( + "failed to list owners of crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + for owner in owners.iter() { + drop_print!(config, "{}", owner.login); + match (owner.name.as_ref(), owner.email.as_ref()) { + (Some(name), Some(email)) => { + drop_println!(config, " ({} <{}>)", name, email) + } + (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), + (None, None) => drop_println!(config), + } + } + } } } diff --git a/src/doc/man/cargo-owner.md b/src/doc/man/cargo-owner.md index adbf72170b3..cc8ad3e1acb 100644 --- a/src/doc/man/cargo-owner.md +++ b/src/doc/man/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `add` _login_ [_crate_]\ -`cargo owner` [_options_] `remove` _login_ [_crate_]\ -`cargo owner` [_options_] `list` [_crate_] +`cargo owner` `add` _login_ [_crate_] [_options_]\ +`cargo owner` `remove` _login_ [_crate_] [_options_]\ +`cargo owner` `list` [_crate_] [_options_] ## DESCRIPTION diff --git a/src/doc/man/generated_txt/cargo-owner.txt b/src/doc/man/generated_txt/cargo-owner.txt index 377f8760b3f..dde7ac45869 100644 --- a/src/doc/man/generated_txt/cargo-owner.txt +++ b/src/doc/man/generated_txt/cargo-owner.txt @@ -4,9 +4,9 @@ NAME cargo-owner — Manage the owners of a crate on the registry SYNOPSIS - cargo owner [options] add login [crate] - cargo owner [options] remove login [crate] - cargo owner [options] list [crate] + cargo owner add login [crate] [options] + cargo owner remove login [crate] [options] + cargo owner list [crate] [options] DESCRIPTION This command will modify the owners for a crate on the registry. Owners diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index 4638519fb1c..f6aea4b1fe8 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,9 +6,9 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` [_options_] `add` _login_ [_crate_]\ -`cargo owner` [_options_] `remove` _login_ [_crate_]\ -`cargo owner` [_options_] `list` [_crate_] +`cargo owner` `add` _login_ [_crate_] [_options_]\ +`cargo owner` `remove` _login_ [_crate_] [_options_]\ +`cargo owner` `list` [_crate_] [_options_] ## DESCRIPTION diff --git a/src/etc/man/cargo-owner.1 b/src/etc/man/cargo-owner.1 index c929f9b3b3f..170e047a6be 100644 --- a/src/etc/man/cargo-owner.1 +++ b/src/etc/man/cargo-owner.1 @@ -6,11 +6,11 @@ .SH "NAME" cargo\-owner \[em] Manage the owners of a crate on the registry .SH "SYNOPSIS" -\fBcargo owner\fR [\fIoptions\fR] \fBadd\fR \fIlogin\fR [\fIcrate\fR] +\fBcargo owner\fR \fBadd\fR \fIlogin\fR [\fIcrate\fR] [\fIoptions\fR] .br -\fBcargo owner\fR [\fIoptions\fR] \fBremove\fR \fIlogin\fR [\fIcrate\fR] +\fBcargo owner\fR \fBremove\fR \fIlogin\fR [\fIcrate\fR] [\fIoptions\fR] .br -\fBcargo owner\fR [\fIoptions\fR] \fBlist\fR [\fIcrate\fR] +\fBcargo owner\fR \fBlist\fR [\fIcrate\fR] [\fIoptions\fR] .SH "DESCRIPTION" This command will modify the owners for a crate on the registry. Owners of a crate can upload new versions and yank old versions. Non\-team owners can also diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 9a75a00589b..52730ccac32 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -1367,7 +1367,13 @@ fn both_index_and_registry() { #[cargo_test] fn both_index_and_default() { let p = project().file("src/lib.rs", "").build(); - for cmd in &["publish", "search", "yank --version 1.0.0", "install foo"] { + for cmd in &[ + "publish", + "owner", + "search", + "yank --version 1.0.0", + "install foo", + ] { p.cargo(cmd) .env("CARGO_REGISTRY_DEFAULT", "undefined") .arg(format!("--index=index_url")) @@ -1375,17 +1381,12 @@ fn both_index_and_default() { .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") .run(); } - p.cargo("owner --index=index_url add someone") - .env("CARGO_REGISTRY_DEFAULT", "undefined") - .with_status(101) - .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") - .run(); } #[cargo_test] -fn owner_index_and_default() { +fn owner_add_index_and_default() { let p = project().file("src/lib.rs", "").build(); - p.cargo("owner --index=index_url add someone") + p.cargo("owner add someone --index=index_url") .env("CARGO_REGISTRY_DEFAULT", "undefined") .with_status(101) .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") diff --git a/tests/testsuite/credential_process.rs b/tests/testsuite/credential_process.rs index 386721a6326..cc8652967ef 100644 --- a/tests/testsuite/credential_process.rs +++ b/tests/testsuite/credential_process.rs @@ -414,7 +414,22 @@ fn yank() { fn owner() { let (p, _t) = get_token_test(); - p.cargo("owner --registry alternative -Z credential-process add username") + p.cargo("owner --add username --registry alternative -Z credential-process") + .masquerade_as_nightly_cargo(&["credential-process"]) + .with_stderr( + "\ +[UPDATING] [..] +[OWNER] completed! +", + ) + .run(); +} + +#[cargo_test] +fn owner_sub_add() { + let (p, _t) = get_token_test(); + + p.cargo("owner add username --registry alternative -Z credential-process") .masquerade_as_nightly_cargo(&["credential-process"]) .with_stderr( "\ diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index 6c2872ce867..85443f4c013 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -39,18 +39,15 @@ fn no_subcommand_return_help() { "\ Manage the owners of a crate on the registry -Usage: cargo owner [OPTIONS] add [CRATE_NAME] - cargo owner [OPTIONS] remove [CRATE_NAME] - cargo owner [OPTIONS] list [CRATE_NAME] +Usage: cargo owner add [CRATE_NAME] [OPTIONS] + cargo owner remove [CRATE_NAME] [OPTIONS] + cargo owner list [CRATE_NAME] [OPTIONS] Commands: add Name of a user or team to invite as an owner remove Name of a user or team to remove as an owner list List owners of a crate -Arguments: - [crate] - Options: -q, --quiet Do not print cargo log messages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) @@ -220,7 +217,7 @@ Caused by: } #[cargo_test] -fn simple_add_with_asymmetric() { +fn simple_flag_add_with_asymmetric() { let registry = registry::RegistryBuilder::new() .http_api() .token(cargo_test_support::registry::Token::rfc_key()) @@ -244,15 +241,45 @@ fn simple_add_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - let commands = ["-a", "--add", "add"]; - for command in commands.iter() { - p.cargo(&format!("owner {} username", command)) - .arg("-Zregistry-auth") - .masquerade_as_nightly_cargo(&["registry-auth"]) - .replace_crates_io(registry.index_url()) - .with_status(0) - .run(); - } + p.cargo("owner --add username") + .arg("-Zregistry-auth") + .masquerade_as_nightly_cargo(&["registry-auth"]) + .replace_crates_io(registry.index_url()) + .with_status(0) + .run(); +} + +#[cargo_test] +fn simple_subcommand_add_with_asymmetric() { + let registry = registry::RegistryBuilder::new() + .http_api() + .token(cargo_test_support::registry::Token::rfc_key()) + .build(); + setup("foo", None); + + let p = project() + .file( + "Cargo.toml", + r#" + [project] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + // The http_api server will check that the authorization is correct. + // If the authorization was not sent then we would get an unauthorized error. + p.cargo("owner add username") + .arg("-Zregistry-auth") + .masquerade_as_nightly_cargo(&["registry-auth"]) + .replace_crates_io(registry.index_url()) + .with_status(0) + .run(); } #[cargo_test] @@ -293,7 +320,7 @@ Caused by: } #[cargo_test] -fn simple_remove_with_asymmetric() { +fn simple_flag_remove_with_asymmetric() { let registry = registry::RegistryBuilder::new() .http_api() .token(cargo_test_support::registry::Token::rfc_key()) @@ -317,13 +344,43 @@ fn simple_remove_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - let commands = ["-r", "--remove", "remove"]; - for command in commands.iter() { - p.cargo(&format!("owner {} username", command)) - .arg("-Zregistry-auth") - .replace_crates_io(registry.index_url()) - .masquerade_as_nightly_cargo(&["registry-auth"]) - .with_status(0) - .run(); - } + p.cargo("owner --remove username") + .arg("-Zregistry-auth") + .replace_crates_io(registry.index_url()) + .masquerade_as_nightly_cargo(&["registry-auth"]) + .with_status(0) + .run(); +} + +#[cargo_test] +fn simple_subcommand_remove_with_asymmetric() { + let registry = registry::RegistryBuilder::new() + .http_api() + .token(cargo_test_support::registry::Token::rfc_key()) + .build(); + setup("foo", None); + + let p = project() + .file( + "Cargo.toml", + r#" + [project] + name = "foo" + version = "0.0.1" + authors = [] + license = "MIT" + description = "foo" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + // The http_api server will check that the authorization is correct. + // If the authorization was not sent then we would get an unauthorized error. + p.cargo("owner remove username") + .arg("-Zregistry-auth") + .replace_crates_io(registry.index_url()) + .masquerade_as_nightly_cargo(&["registry-auth"]) + .with_status(0) + .run(); } From e038e622bf7e098a55598541ca1faf98ec44cac6 Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Sun, 16 Apr 2023 18:04:06 +0800 Subject: [PATCH 09/28] fix --- src/bin/cargo/commands/owner.rs | 97 ++++++++++----------- src/cargo/ops/mod.rs | 2 +- src/cargo/ops/registry.rs | 145 +++++++++----------------------- tests/testsuite/alt_registry.rs | 5 -- 4 files changed, 83 insertions(+), 166 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index cf3caa33865..531caf58a45 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -1,6 +1,6 @@ use crate::command_prelude::*; -use cargo::ops::{self, OwnersOptions, SubCommand}; +use cargo::ops::{self, OwnersOptions}; use cargo::util::auth::Secret; pub fn cli() -> Command { @@ -38,12 +38,12 @@ pub fn cli() -> Command { ) .arg(flag("list", "List owners of a crate").short('l').hide(true)) .subcommands([ - add_arg( + for_subcommand_add_arg( Command::new("add") .about("Name of a user or team to invite as an owner") .arg_quiet() .args([ - Arg::new("addowner") + Arg::new("add") .required(true) .value_delimiter(',') .value_name("OWNER_NAME") @@ -53,12 +53,12 @@ pub fn cli() -> Command { .help("Crate name that you want to manage the owner"), ]), ), - add_arg( + for_subcommand_add_arg( Command::new("remove") .about("Name of a user or team to remove as an owner") .arg_quiet() .args([ - Arg::new("removeowner") + Arg::new("remove") .required(true) .value_delimiter(',') .value_name("OWNER_NAME") @@ -68,7 +68,7 @@ pub fn cli() -> Command { .help("Crate name that you want to manage the owner"), ]), ), - add_arg( + for_subcommand_add_arg( Command::new("list") .about("List owners of a crate") .arg_quiet() @@ -85,63 +85,54 @@ pub fn cli() -> Command { .after_help("Run `cargo help owner` for more detailed information.\n") } -fn add_arg(com: Command) -> Command { +fn for_subcommand_add_arg(com: Command) -> Command { com.arg(opt("index", "Registry index to modify owners for").value_name("INDEX")) .arg(opt("token", "API token to use when authenticating").value_name("TOKEN")) .arg(opt("registry", "Registry to use").value_name("REGISTRY")) } pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { - let command = args.subcommand(); - - let (sc, krate, token, index, registry) = if command.is_some() { - let (sc, arg) = command.unwrap(); - let subcommand = match sc { - "list" => SubCommand::List, - "add" => SubCommand::Add, - "remove" => SubCommand::Remove, - _ => SubCommand::None, - }; - ( - subcommand, - arg.clone().get_one::("crate").cloned(), - arg.get_one::("token").cloned().map(Secret::from), - arg.get_one::("index").cloned(), - arg.registry(config)?, - ) - } else { - ( - SubCommand::None, - args.clone().get_one::("crate").cloned(), - args.get_one::("token").cloned().map(Secret::from), - args.get_one::("index").cloned(), - args.registry(config)?, - ) + let (to_add, to_remove, list) = match args.subcommand() { + Some(("add", subargs)) => ( + subargs + .get_many::("add") + .map(|xs| xs.cloned().collect::>()), + None, + false, + ), + Some(("remove", subargs)) => ( + None, + subargs + .get_many::("remove") + .map(|xs| xs.cloned().collect()), + false, + ), + Some(("list", _)) => (None, None, true), + Some((name, _)) => { + unreachable!("{name} is not a subcommand of cargo owner, please enter `cargo owner --help` for help.") + } + None => ( + args.get_many::("add") + .map(|xs| xs.cloned().collect::>()), + args.get_many::("remove") + .map(|xs| xs.cloned().collect()), + args.flag("list"), + ), }; - let addons = args.subcommand_matches("add").and_then(|x| { - x.get_many::("addowner") - .map(|xs| xs.cloned().collect::>()) - }); - - let removeons = args.subcommand_matches("remove").and_then(|x| { - x.get_many::("removeowner") - .map(|xs| xs.cloned().collect::>()) - }); + let common_args = args.subcommand().map(|(_, args)| args).unwrap_or(args); let opts = OwnersOptions { - krate: krate, - token: token, - index: index, - to_add: addons.or(args - .get_many::("add") - .map(|xs| xs.cloned().collect())), - to_remove: removeons.or(args - .get_many::("remove") - .map(|xs| xs.cloned().collect())), - list: args.flag("list"), - subcommand: Some(sc), - registry, + krate: common_args.clone().get_one::("crate").cloned(), + token: common_args + .get_one::("token") + .cloned() + .map(Secret::from), + index: common_args.get_one::("index").cloned(), + to_add: to_add, + to_remove: to_remove, + list: list, + registry: common_args.registry(config)?, }; ops::modify_owners(config, &opts)?; diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 22fc597e7e6..00a6ad337bc 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -23,7 +23,7 @@ pub use self::fix::{fix, fix_exec_rustc, fix_get_proxy_lock_addr, FixOptions}; pub use self::lockfile::{load_pkg_lockfile, resolve_to_string, write_pkg_lockfile}; pub use self::registry::HttpTimeout; pub use self::registry::{configure_http_handle, http_handle, http_handle_and_timeout}; -pub use self::registry::{modify_owners, yank, OwnersOptions, PublishOpts, SubCommand}; +pub use self::registry::{modify_owners, yank, CargoOwnerSubCommand, OwnersOptions, PublishOpts}; pub use self::registry::{needs_custom_http_transport, registry_login, registry_logout, search}; pub use self::registry::{publish, RegistryCredentialConfig}; pub use self::resolve::{ diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index 8d6fd6a6289..e04f7ba2cff 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -971,13 +971,6 @@ pub fn registry_logout(config: &Config, reg: Option<&str>) -> CargoResult<()> { Ok(()) } -pub enum SubCommand { - Add, - Remove, - List, - None, -} - pub struct OwnersOptions { pub krate: Option, pub token: Option>, @@ -985,7 +978,6 @@ pub struct OwnersOptions { pub to_add: Option>, pub to_remove: Option>, pub list: bool, - pub subcommand: Option, pub registry: Option, } @@ -1010,108 +1002,47 @@ pub fn modify_owners(config: &Config, opts: &OwnersOptions) -> CargoResult<()> { Some(mutation), )?; - match opts.subcommand.as_ref().unwrap() { - SubCommand::Add => { - let v = opts - .to_add - .as_ref() - .map(|s| s.iter().collect::>()) - .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) - .unwrap(); - let msg = registry.add_owners(&name, &v).with_context(|| { - format!( - "failed to invite owners to crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - - config.shell().status("Owner", msg)?; - } - - SubCommand::Remove => { - let v = opts - .to_remove - .as_ref() - .map(|s| s.iter().collect::>()) - .and_then(|t| Some(t.iter().map(|s| s.as_str()).collect::>())) - .unwrap(); - config - .shell() - .status("Owner", format!("removing {:?} from crate {}", v, name))?; - registry.remove_owners(&name, &v).with_context(|| { - format!( - "failed to remove owners from crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - } - - SubCommand::List => { - let owners = registry.list_owners(&name).with_context(|| { - format!( - "failed to list owners of crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - for owner in owners.iter() { - drop_print!(config, "{}", owner.login); - match (owner.name.as_ref(), owner.email.as_ref()) { - (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), - (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), - (None, None) => drop_println!(config), - } - } - } - - SubCommand::None => { - if let Some(ref v) = opts.to_add { - let v = v.iter().map(|s| &s[..]).collect::>(); - let msg = registry.add_owners(&name, &v).with_context(|| { - format!( - "failed to invite owners to crate `{}` on registry at {}", - name, - registry.host() - ) - })?; + if let Some(ref v) = opts.to_add { + let v = v.iter().map(|s| &s[..]).collect::>(); + let msg = registry.add_owners(&name, &v).with_context(|| { + format!( + "failed to invite owners to crate `{}` on registry at {}", + name, + registry.host() + ) + })?; - config.shell().status("Owner", msg)?; - } + config.shell().status("Owner", msg)?; + } - if let Some(ref v) = opts.to_remove { - let v = v.iter().map(|s| &s[..]).collect::>(); - config - .shell() - .status("Owner", format!("removing {:?} from crate {}", v, name))?; - registry.remove_owners(&name, &v).with_context(|| { - format!( - "failed to remove owners from crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - } + if let Some(ref v) = opts.to_remove { + let v = v.iter().map(|s| &s[..]).collect::>(); + config + .shell() + .status("Owner", format!("removing {:?} from crate {}", v, name))?; + registry.remove_owners(&name, &v).with_context(|| { + format!( + "failed to remove owners from crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + } - if opts.list { - let owners = registry.list_owners(&name).with_context(|| { - format!( - "failed to list owners of crate `{}` on registry at {}", - name, - registry.host() - ) - })?; - for owner in owners.iter() { - drop_print!(config, "{}", owner.login); - match (owner.name.as_ref(), owner.email.as_ref()) { - (Some(name), Some(email)) => { - drop_println!(config, " ({} <{}>)", name, email) - } - (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), - (None, None) => drop_println!(config), - } - } + if opts.list { + let owners = registry.list_owners(&name).with_context(|| { + format!( + "failed to list owners of crate `{}` on registry at {}", + name, + registry.host() + ) + })?; + for owner in owners.iter() { + drop_print!(config, "{}", owner.login); + match (owner.name.as_ref(), owner.email.as_ref()) { + (Some(name), Some(email)) => drop_println!(config, " ({} <{}>)", name, email), + (Some(s), None) | (None, Some(s)) => drop_println!(config, " ({})", s), + (None, None) => drop_println!(config), } } } diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index 52730ccac32..c4ffcb7243a 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -760,11 +760,6 @@ fn no_api() { .with_stderr_contains(&err) .run(); - p.cargo("owner --registry alternative list") - .with_status(101) - .with_stderr_contains(&err) - .run(); - p.cargo("owner --registry alternative --list") .with_status(101) .with_stderr_contains(&err) From 21afbcfdb9bc178b5e9836da147a8e88fc8e2874 Mon Sep 17 00:00:00 2001 From: QiangHeisenberg Date: Sun, 16 Apr 2023 18:07:30 +0800 Subject: [PATCH 10/28] fix --- src/cargo/ops/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 00a6ad337bc..4b6aea991bd 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -23,7 +23,7 @@ pub use self::fix::{fix, fix_exec_rustc, fix_get_proxy_lock_addr, FixOptions}; pub use self::lockfile::{load_pkg_lockfile, resolve_to_string, write_pkg_lockfile}; pub use self::registry::HttpTimeout; pub use self::registry::{configure_http_handle, http_handle, http_handle_and_timeout}; -pub use self::registry::{modify_owners, yank, CargoOwnerSubCommand, OwnersOptions, PublishOpts}; +pub use self::registry::{modify_owners, yank, OwnersOptions, PublishOpts}; pub use self::registry::{needs_custom_http_transport, registry_login, registry_logout, search}; pub use self::registry::{publish, RegistryCredentialConfig}; pub use self::resolve::{ From 1ef930f32f377b41418518faea86c4bf5176ecfa Mon Sep 17 00:00:00 2001 From: heisenberg <46313511+QiangHeisenberg@users.noreply.github.com> Date: Sun, 16 Apr 2023 18:38:03 +0800 Subject: [PATCH 11/28] Remove some test cases. --- tests/testsuite/owner.rs | 119 --------------------------------------- 1 file changed, 119 deletions(-) diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index 85443f4c013..17aa17f6be8 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -14,125 +14,6 @@ fn setup(name: &str, content: Option<&str>) { } } -#[cargo_test] -fn no_subcommand_return_help() { - setup("foo", None); - - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.0.1" - authors = [] - license = "MIT" - description = "foo" - "#, - ) - .file("src/main.rs", "fn main() {}") - .build(); - - p.cargo("owner") - .with_status(1) - .with_stderr( - "\ -Manage the owners of a crate on the registry - -Usage: cargo owner add [CRATE_NAME] [OPTIONS] - cargo owner remove [CRATE_NAME] [OPTIONS] - cargo owner list [CRATE_NAME] [OPTIONS] - -Commands: - add Name of a user or team to invite as an owner - remove Name of a user or team to remove as an owner - list List owners of a crate - -Options: - -q, --quiet Do not print cargo log messages - -v, --verbose... Use verbose output (-vv very verbose/build.rs output) - --color Coloring: auto, always, never - --frozen Require Cargo.lock and cache are up to date - --index Registry index to modify owners for - --locked Require Cargo.lock is up to date - --token API token to use when authenticating - --offline Run without accessing the network - --registry Registry to use - --config Override a configuration value - -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details - -h, --help Print help - -Run `cargo help owner` for more detailed information.", - ) - .run(); -} - -#[cargo_test] -fn add_no_ownername_return_error() { - setup("foo", None); - - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.0.1" - authors = [] - license = "MIT" - description = "foo" - "#, - ) - .file("src/main.rs", "fn main() {}") - .build(); - - p.cargo("owner add") - .with_status(1) - .with_stderr( - "\ -error: the following required arguments were not provided: - - -Usage: cargo owner add [CRATE_NAME] - -For more information, try '--help'.", - ) - .run(); -} - -#[cargo_test] -fn remove_no_ownername_return_error() { - setup("foo", None); - - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.0.1" - authors = [] - license = "MIT" - description = "foo" - "#, - ) - .file("src/main.rs", "fn main() {}") - .build(); - - p.cargo("owner remove") - .with_status(1) - .with_stderr( - "\ -error: the following required arguments were not provided: - - -Usage: cargo owner remove [CRATE_NAME] - -For more information, try '--help'.", - ) - .run(); -} - #[cargo_test] fn simple_list() { let registry = registry::init(); From a8b46bec0b8af341426997cc143f1daaa9eaba9a Mon Sep 17 00:00:00 2001 From: heisen-li Date: Thu, 2 Nov 2023 15:45:47 +0800 Subject: [PATCH 12/28] update --- src/cargo/sources/git/known_hosts.rs | 18 +++-- src/cargo/sources/registry/http_remote.rs | 4 +- tests/testsuite/alt_registry.rs | 12 +-- tests/testsuite/owner.rs | 96 +++++++++++------------ 4 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/cargo/sources/git/known_hosts.rs b/src/cargo/sources/git/known_hosts.rs index 9a623151ebb..5bb66916587 100644 --- a/src/cargo/sources/git/known_hosts.rs +++ b/src/cargo/sources/git/known_hosts.rs @@ -138,7 +138,7 @@ pub fn certificate_check( let Some(host_key) = cert.as_hostkey() else { // Return passthrough for TLS X509 certificates to use whatever validation // was done in git2. - return Ok(CertificateCheckStatus::CertificatePassthrough) + return Ok(CertificateCheckStatus::CertificatePassthrough); }; // If a nonstandard port is in use, check for that first. // The fallback to check without a port is handled in the HostKeyNotFound handler. @@ -608,10 +608,18 @@ impl KnownHost { } fn hashed_hostname_matches(host: &str, hashed: &str) -> bool { - let Some((b64_salt, b64_host)) = hashed.split_once('|') else { return false; }; - let Ok(salt) = STANDARD.decode(b64_salt) else { return false; }; - let Ok(hashed_host) = STANDARD.decode(b64_host) else { return false; }; - let Ok(mut mac) = hmac::Hmac::::new_from_slice(&salt) else { return false; }; + let Some((b64_salt, b64_host)) = hashed.split_once('|') else { + return false; + }; + let Ok(salt) = STANDARD.decode(b64_salt) else { + return false; + }; + let Ok(hashed_host) = STANDARD.decode(b64_host) else { + return false; + }; + let Ok(mut mac) = hmac::Hmac::::new_from_slice(&salt) else { + return false; + }; mac.update(host.as_bytes()); let result = mac.finalize().into_bytes(); hashed_host == &result[..] diff --git a/src/cargo/sources/registry/http_remote.rs b/src/cargo/sources/registry/http_remote.rs index c0552734b33..8514ac9515c 100644 --- a/src/cargo/sources/registry/http_remote.rs +++ b/src/cargo/sources/registry/http_remote.rs @@ -784,7 +784,9 @@ impl<'cfg> RegistryData for HttpRegistry<'cfg> { impl<'cfg> Downloads<'cfg> { fn tick(&self) -> CargoResult<()> { let mut progress = self.progress.borrow_mut(); - let Some(progress) = progress.as_mut() else { return Ok(()); }; + let Some(progress) = progress.as_mut() else { + return Ok(()); + }; // Since the sparse protocol discovers dependencies as it goes, // it's not possible to get an accurate progress indication. diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index c4ffcb7243a..20ca5f45e0c 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -760,7 +760,7 @@ fn no_api() { .with_stderr_contains(&err) .run(); - p.cargo("owner --registry alternative --list") + p.cargo("owner list --registry alternative") .with_status(101) .with_stderr_contains(&err) .run(); @@ -1378,16 +1378,6 @@ fn both_index_and_default() { } } -#[cargo_test] -fn owner_add_index_and_default() { - let p = project().file("src/lib.rs", "").build(); - p.cargo("owner add someone --index=index_url") - .env("CARGO_REGISTRY_DEFAULT", "undefined") - .with_status(101) - .with_stderr("[ERROR] invalid url `index_url`: relative URL without a base") - .run(); -} - #[cargo_test] fn sparse_lockfile() { let _registry = registry::RegistryBuilder::new() diff --git a/tests/testsuite/owner.rs b/tests/testsuite/owner.rs index 17aa17f6be8..e6ceff0b03a 100644 --- a/tests/testsuite/owner.rs +++ b/tests/testsuite/owner.rs @@ -81,35 +81,29 @@ fn simple_add() { .file("src/main.rs", "fn main() {}") .build(); - let commands = ["-a", "--add", "add"]; - for command in commands.iter() { - p.cargo(&format!("owner {} username", command)) - .replace_crates_io(registry.index_url()) - .with_status(101) - .with_stderr( - " Updating crates.io index + p.cargo("owner add username") + .replace_crates_io(registry.index_url()) + .with_status(101) + .with_stderr( + " Updating crates.io index error: failed to invite owners to crate `foo` on registry at file://[..] Caused by: EOF while parsing a value at line 1 column 0", - ) - .run(); - } + ) + .run(); } #[cargo_test] -fn simple_flag_add_with_asymmetric() { - let registry = registry::RegistryBuilder::new() - .http_api() - .token(cargo_test_support::registry::Token::rfc_key()) - .build(); +fn simple_remove() { + let registry = registry::init(); setup("foo", None); let p = project() .file( "Cargo.toml", r#" - [project] + [package] name = "foo" version = "0.0.1" authors = [] @@ -120,18 +114,22 @@ fn simple_flag_add_with_asymmetric() { .file("src/main.rs", "fn main() {}") .build(); - // The http_api server will check that the authorization is correct. - // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner --add username") - .arg("-Zregistry-auth") - .masquerade_as_nightly_cargo(&["registry-auth"]) + p.cargo("owner remove username") .replace_crates_io(registry.index_url()) - .with_status(0) + .with_status(101) + .with_stderr( + " Updating crates.io index + Owner removing [\"username\"] from crate foo +error: failed to remove owners from crate `foo` on registry at file://[..] + +Caused by: + EOF while parsing a value at line 1 column 0", + ) .run(); } #[cargo_test] -fn simple_subcommand_add_with_asymmetric() { +fn simple_add_with_asymmetric() { let registry = registry::RegistryBuilder::new() .http_api() .token(cargo_test_support::registry::Token::rfc_key()) @@ -155,24 +153,27 @@ fn simple_subcommand_add_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner add username") - .arg("-Zregistry-auth") - .masquerade_as_nightly_cargo(&["registry-auth"]) + p.cargo("owner -a username") + .arg("-Zasymmetric-token") + .masquerade_as_nightly_cargo(&["asymmetric-token"]) .replace_crates_io(registry.index_url()) .with_status(0) .run(); } #[cargo_test] -fn simple_remove() { - let registry = registry::init(); +fn simple_subcommand_add_with_asymmetric() { + let registry = registry::RegistryBuilder::new() + .http_api() + .token(cargo_test_support::registry::Token::rfc_key()) + .build(); setup("foo", None); let p = project() .file( "Cargo.toml", r#" - [package] + [project] name = "foo" version = "0.0.1" authors = [] @@ -183,25 +184,18 @@ fn simple_remove() { .file("src/main.rs", "fn main() {}") .build(); - let commands = ["remove", "--remove", "-r"]; - for command in commands.iter() { - p.cargo(&format!("owner {} username", command)) - .replace_crates_io(registry.index_url()) - .with_status(101) - .with_stderr( - " Updating crates.io index - Owner removing [\"username\"] from crate foo -error: failed to remove owners from crate `foo` on registry at file://[..] - -Caused by: - EOF while parsing a value at line 1 column 0", - ) - .run(); - } + // The http_api server will check that the authorization is correct. + // If the authorization was not sent then we would get an unauthorized error. + p.cargo("owner add username") + .arg("-Zasymmetric-token") + .masquerade_as_nightly_cargo(&["asymmetric-token"]) + .replace_crates_io(registry.index_url()) + .with_status(0) + .run(); } #[cargo_test] -fn simple_flag_remove_with_asymmetric() { +fn simple_remove_with_asymmetric() { let registry = registry::RegistryBuilder::new() .http_api() .token(cargo_test_support::registry::Token::rfc_key()) @@ -225,10 +219,10 @@ fn simple_flag_remove_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. - p.cargo("owner --remove username") - .arg("-Zregistry-auth") + p.cargo("owner -r username") + .arg("-Zasymmetric-token") .replace_crates_io(registry.index_url()) - .masquerade_as_nightly_cargo(&["registry-auth"]) + .masquerade_as_nightly_cargo(&["asymmetric-token"]) .with_status(0) .run(); } @@ -259,9 +253,9 @@ fn simple_subcommand_remove_with_asymmetric() { // The http_api server will check that the authorization is correct. // If the authorization was not sent then we would get an unauthorized error. p.cargo("owner remove username") - .arg("-Zregistry-auth") + .arg("-Zasymmetric-token") .replace_crates_io(registry.index_url()) - .masquerade_as_nightly_cargo(&["registry-auth"]) + .masquerade_as_nightly_cargo(&["asymmetric-token"]) .with_status(0) .run(); -} +} \ No newline at end of file From daaa8c17b031be2ffeb044818a5d4841e00fe723 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Thu, 2 Nov 2023 19:24:43 +0800 Subject: [PATCH 13/28] delete file --- 1.txt | 0 Cargo.lock | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 1.txt diff --git a/1.txt b/1.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/Cargo.lock b/Cargo.lock index 91625381266..d29c7ac5c34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3806,4 +3806,4 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" \ No newline at end of file From 3fc6b5310645c0aff98e85092b4635adcc61d925 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Thu, 2 Nov 2023 20:42:53 +0800 Subject: [PATCH 14/28] fix some error --- src/cargo/ops/registry/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cargo/ops/registry/mod.rs b/src/cargo/ops/registry/mod.rs index 5cc205ff9ef..3fa8fd29162 100644 --- a/src/cargo/ops/registry/mod.rs +++ b/src/cargo/ops/registry/mod.rs @@ -4,7 +4,7 @@ mod login; mod logout; -pub mod owner; +mod owner; mod publish; mod search; mod yank; From 1dc82aec5f95d8db7f9e1a64b954c26dfbd346cb Mon Sep 17 00:00:00 2001 From: heisen-li Date: Fri, 3 Nov 2023 15:29:18 +0800 Subject: [PATCH 15/28] add some test & fix some error --- src/bin/cargo/commands/owner.rs | 34 ++++++++----------- tests/testsuite/cargo_owner/add_help/mod.rs | 14 ++++++++ .../testsuite/cargo_owner/add_help/stderr.log | 0 .../testsuite/cargo_owner/add_help/stdout.log | 22 ++++++++++++ tests/testsuite/cargo_owner/help/stdout.log | 6 ++-- tests/testsuite/cargo_owner/list_help/mod.rs | 14 ++++++++ .../cargo_owner/list_help/stderr.log | 0 .../cargo_owner/list_help/stdout.log | 21 ++++++++++++ tests/testsuite/cargo_owner/mod.rs | 3 ++ .../testsuite/cargo_owner/remove_help/mod.rs | 14 ++++++++ .../cargo_owner/remove_help/stderr.log | 0 .../cargo_owner/remove_help/stdout.log | 22 ++++++++++++ 12 files changed, 128 insertions(+), 22 deletions(-) create mode 100644 tests/testsuite/cargo_owner/add_help/mod.rs create mode 100644 tests/testsuite/cargo_owner/add_help/stderr.log create mode 100644 tests/testsuite/cargo_owner/add_help/stdout.log create mode 100644 tests/testsuite/cargo_owner/list_help/mod.rs create mode 100644 tests/testsuite/cargo_owner/list_help/stderr.log create mode 100644 tests/testsuite/cargo_owner/list_help/stdout.log create mode 100644 tests/testsuite/cargo_owner/remove_help/mod.rs create mode 100644 tests/testsuite/cargo_owner/remove_help/stderr.log create mode 100644 tests/testsuite/cargo_owner/remove_help/stdout.log diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index c238467d36f..e87d79c25cd 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -16,8 +16,6 @@ pub fn cli() -> Command { cargo owner remove [CRATE_NAME] [OPTIONS] cargo owner list [CRATE_NAME] [OPTIONS]", ) - // The following three parameters are planned to be replaced in the form of subcommands. - // refer to issue: https://github.com/rust-lang/cargo/issues/4352 .arg( multi_opt( "add", @@ -38,10 +36,9 @@ pub fn cli() -> Command { ) .arg(flag("list", "List owners of a crate").short('l').hide(true)) .subcommands([ - for_subcommand_add_arg( + add_registry_args( Command::new("add") .about("Name of a user or team to invite as an owner") - .arg_quiet() .args([ Arg::new("add") .required(true) @@ -52,11 +49,11 @@ pub fn cli() -> Command { .value_name("CRATE_NAME") .help("Crate name that you want to manage the owner"), ]), - ), - for_subcommand_add_arg( + ) + .override_usage("cargo owner add [CRATE_NAME] [OPTIONS]"), + add_registry_args( Command::new("remove") .about("Name of a user or team to remove as an owner") - .arg_quiet() .args([ Arg::new("remove") .required(true) @@ -67,17 +64,16 @@ pub fn cli() -> Command { .value_name("CRATE_NAME") .help("Crate name that you want to manage the owner"), ]), - ), - for_subcommand_add_arg( - Command::new("list") - .about("List owners of a crate") - .arg_quiet() - .arg( - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name which you want to list all owner names"), - ), - ), + ) + .override_usage("cargo owner remove [CRATE_NAME] [OPTIONS]"), + add_registry_args( + Command::new("list").about("List owners of a crate").arg( + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name which you want to list all owner names"), + ), + ) + .override_usage("cargo owner list [CRATE_NAME] [OPTIONS]"), ]) .arg_index("Registry index URL to modify owners for") .arg_registry("Registry to modify owners for") @@ -87,7 +83,7 @@ pub fn cli() -> Command { )) } -fn for_subcommand_add_arg(command: Command) -> Command { +fn add_registry_args(command: Command) -> Command { command .arg_index("Registry index URL to modify owners for") .arg_registry("Registry to modify owners for") diff --git a/tests/testsuite/cargo_owner/add_help/mod.rs b/tests/testsuite/cargo_owner/add_help/mod.rs new file mode 100644 index 00000000000..20d2e7d9c8f --- /dev/null +++ b/tests/testsuite/cargo_owner/add_help/mod.rs @@ -0,0 +1,14 @@ +use cargo_test_support::curr_dir; +use cargo_test_support::prelude::*; + +#[cargo_test] +fn case() { + snapbox::cmd::Command::cargo_ui() + .arg("owner") + .arg("add") + .arg("--help") + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); +} diff --git a/tests/testsuite/cargo_owner/add_help/stderr.log b/tests/testsuite/cargo_owner/add_help/stderr.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_owner/add_help/stdout.log b/tests/testsuite/cargo_owner/add_help/stdout.log new file mode 100644 index 00000000000..a2ecb7496f4 --- /dev/null +++ b/tests/testsuite/cargo_owner/add_help/stdout.log @@ -0,0 +1,22 @@ +Name of a user or team to invite as an owner + +Usage: cargo owner add [CRATE_NAME] [OPTIONS] + +Arguments: + Name of the owner you want to invite + [CRATE_NAME] Crate name that you want to manage the owner + +Options: + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + --color Coloring: auto, always, never + --config Override a configuration value + -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details + -h, --help Print help + +Manifest Options: + --frozen Require Cargo.lock and cache are up to date + --locked Require Cargo.lock is up to date + --offline Run without accessing the network diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index 813c32b3301..4d795b6da8b 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -1,8 +1,8 @@ Manage the owners of a crate on the registry -Usage: cargo owner add [CRATE_NAME] [OPTIONS] - cargo owner remove [CRATE_NAME] [OPTIONS] - cargo owner list [CRATE_NAME] [OPTIONS] +Usage: cargo[EXE] owner add [CRATE_NAME] [OPTIONS] + cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] + cargo[EXE] owner list [CRATE_NAME] [OPTIONS] Commands: add Name of a user or team to invite as an owner diff --git a/tests/testsuite/cargo_owner/list_help/mod.rs b/tests/testsuite/cargo_owner/list_help/mod.rs new file mode 100644 index 00000000000..ca297811988 --- /dev/null +++ b/tests/testsuite/cargo_owner/list_help/mod.rs @@ -0,0 +1,14 @@ +use cargo_test_support::curr_dir; +use cargo_test_support::prelude::*; + +#[cargo_test] +fn case() { + snapbox::cmd::Command::cargo_ui() + .arg("owner") + .arg("list") + .arg("--help") + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); +} diff --git a/tests/testsuite/cargo_owner/list_help/stderr.log b/tests/testsuite/cargo_owner/list_help/stderr.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_owner/list_help/stdout.log b/tests/testsuite/cargo_owner/list_help/stdout.log new file mode 100644 index 00000000000..c643909f585 --- /dev/null +++ b/tests/testsuite/cargo_owner/list_help/stdout.log @@ -0,0 +1,21 @@ +List owners of a crate + +Usage: cargo owner list [CRATE_NAME] [OPTIONS] + +Arguments: + [CRATE_NAME] Crate name which you want to list all owner names + +Options: + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + --color Coloring: auto, always, never + --config Override a configuration value + -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details + -h, --help Print help + +Manifest Options: + --frozen Require Cargo.lock and cache are up to date + --locked Require Cargo.lock is up to date + --offline Run without accessing the network diff --git a/tests/testsuite/cargo_owner/mod.rs b/tests/testsuite/cargo_owner/mod.rs index c0ce1118071..bea7a05a2ca 100644 --- a/tests/testsuite/cargo_owner/mod.rs +++ b/tests/testsuite/cargo_owner/mod.rs @@ -1 +1,4 @@ +mod add_help; mod help; +mod list_help; +mod remove_help; diff --git a/tests/testsuite/cargo_owner/remove_help/mod.rs b/tests/testsuite/cargo_owner/remove_help/mod.rs new file mode 100644 index 00000000000..bbde7fe59ea --- /dev/null +++ b/tests/testsuite/cargo_owner/remove_help/mod.rs @@ -0,0 +1,14 @@ +use cargo_test_support::curr_dir; +use cargo_test_support::prelude::*; + +#[cargo_test] +fn case() { + snapbox::cmd::Command::cargo_ui() + .arg("owner") + .arg("remove") + .arg("--help") + .assert() + .success() + .stdout_matches_path(curr_dir!().join("stdout.log")) + .stderr_matches_path(curr_dir!().join("stderr.log")); +} diff --git a/tests/testsuite/cargo_owner/remove_help/stderr.log b/tests/testsuite/cargo_owner/remove_help/stderr.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testsuite/cargo_owner/remove_help/stdout.log b/tests/testsuite/cargo_owner/remove_help/stdout.log new file mode 100644 index 00000000000..9accbfac594 --- /dev/null +++ b/tests/testsuite/cargo_owner/remove_help/stdout.log @@ -0,0 +1,22 @@ +Name of a user or team to remove as an owner + +Usage: cargo owner remove [CRATE_NAME] [OPTIONS] + +Arguments: + Name of the owner you want to remove + [CRATE_NAME] Crate name that you want to manage the owner + +Options: + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + --color Coloring: auto, always, never + --config Override a configuration value + -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details + -h, --help Print help + +Manifest Options: + --frozen Require Cargo.lock and cache are up to date + --locked Require Cargo.lock is up to date + --offline Run without accessing the network From 60ebb2a9503590a6d4d2894ea8faa72ff3fcc5af Mon Sep 17 00:00:00 2001 From: heisen-li Date: Mon, 20 Nov 2023 20:06:51 +0800 Subject: [PATCH 16/28] add doc man --- src/doc/src/commands/cargo-owner.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index 085eed1ee0b..e50e2b2c80f 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,8 +6,8 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` `add` _login_ [_crate_] [_options_]\ -`cargo owner` `remove` _login_ [_crate_] [_options_]\ +`cargo owner` `add` _login_ <_owner_> [_crate_] [_options_]\ +`cargo owner` `remove` _login_ <_owner_> [_crate_] [_options_]\ `cargo owner` `list` [_crate_] [_options_] ## DESCRIPTION From 3fa434dcaf4c07d9d8009618f3ca8aebf003b9e2 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 21 Nov 2023 16:34:48 +0800 Subject: [PATCH 17/28] modify --- src/doc/src/commands/cargo-owner.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doc/src/commands/cargo-owner.md b/src/doc/src/commands/cargo-owner.md index e50e2b2c80f..085eed1ee0b 100644 --- a/src/doc/src/commands/cargo-owner.md +++ b/src/doc/src/commands/cargo-owner.md @@ -6,8 +6,8 @@ cargo-owner --- Manage the owners of a crate on the registry ## SYNOPSIS -`cargo owner` `add` _login_ <_owner_> [_crate_] [_options_]\ -`cargo owner` `remove` _login_ <_owner_> [_crate_] [_options_]\ +`cargo owner` `add` _login_ [_crate_] [_options_]\ +`cargo owner` `remove` _login_ [_crate_] [_options_]\ `cargo owner` `list` [_crate_] [_options_] ## DESCRIPTION From 7acc02f3349e25bd5c40f19d7583a6351637f5dc Mon Sep 17 00:00:00 2001 From: heisen-li Date: Sat, 25 Nov 2023 10:44:16 +0800 Subject: [PATCH 18/28] fix test and some --- src/bin/cargo/commands/owner.rs | 109 ++++++++++-------- src/etc/_cargo | 3 + src/etc/cargo.bashcomp.sh | 2 +- tests/testsuite/alt_registry.rs | 4 +- .../testsuite/cargo_owner/add_help/stdout.log | 1 + tests/testsuite/cargo_owner/help/stdout.log | 1 - .../cargo_owner/list_help/stdout.log | 1 + .../cargo_owner/remove_help/stdout.log | 1 + 8 files changed, 70 insertions(+), 52 deletions(-) mode change 100644 => 100755 src/etc/cargo.bashcomp.sh diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 82b5555f8d8..95a16e9c472 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -35,44 +35,43 @@ pub fn cli() -> Command { ) .arg(flag("list", "List owners of a crate").short('l').hide(true)) .subcommands([ - add_registry_args( - Command::new("add") - .about("Name of a user or team to invite as an owner") - .args([ - Arg::new("add") - .required(true) - .value_delimiter(',') - .value_name("OWNER_NAME") - .help("Name of the owner you want to invite"), - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]), - ) - .override_usage("cargo owner add [CRATE_NAME] [OPTIONS]"), - add_registry_args( - Command::new("remove") - .about("Name of a user or team to remove as an owner") - .args([ - Arg::new("remove") - .required(true) - .value_delimiter(',') - .value_name("OWNER_NAME") - .help("Name of the owner you want to remove"), - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]), - ) - .override_usage("cargo owner remove [CRATE_NAME] [OPTIONS]"), - add_registry_args( - Command::new("list").about("List owners of a crate").arg( + Command::new("add") + .about("Name of a user or team to invite as an owner") + .args([ + Arg::new("add") + .required(true) + .value_delimiter(',') + .value_name("OWNER_NAME") + .help("Name of the owner you want to invite"), + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), + ]) + .args(&add_registry_args()) + .override_usage("cargo owner add [CRATE_NAME] [OPTIONS]"), + Command::new("remove") + .about("Name of a user or team to remove as an owner") + .args([ + Arg::new("remove") + .required(true) + .value_delimiter(',') + .value_name("OWNER_NAME") + .help("Name of the owner you want to remove"), + Arg::new("crate") + .value_name("CRATE_NAME") + .help("Crate name that you want to manage the owner"), + ]) + .args(&add_registry_args()) + .override_usage("cargo owner remove [CRATE_NAME] [OPTIONS]"), + Command::new("list") + .about("List owners of a crate") + .arg( Arg::new("crate") .value_name("CRATE_NAME") .help("Crate name which you want to list all owner names"), - ), - ) - .override_usage("cargo owner list [CRATE_NAME] [OPTIONS]"), + ) + .args(&add_registry_args()) + .override_usage("cargo owner list [CRATE_NAME] [OPTIONS]"), ]) .arg_index("Registry index URL to modify owners for") .arg_registry("Registry to modify owners for") @@ -83,11 +82,14 @@ pub fn cli() -> Command { )) } -fn add_registry_args(command: Command) -> Command { - command - .arg_index("Registry index URL to modify owners for") - .arg_registry("Registry to modify owners for") - .arg(opt("token", "API token to use when authenticating").value_name("TOKEN")) +fn add_registry_args() -> [Arg; 3] { + [ + opt("index", "Registry index URL to modify owners for") + .value_name("INDEX") + .conflicts_with("registry"), + opt("registry", "Registry to modify owners for").value_name("REGISTRY"), + opt("token", "API token to use when authenticating").value_name("TOKEN"), + ] } pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { @@ -107,10 +109,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { false, ), Some(("list", _)) => (None, None, true), - Some((name, _)) => { - unreachable!("{name} is not a subcommand of cargo owner, please enter `cargo owner --help` for help.") - } - None => ( + _ => ( args.get_many::("add") .map(|xs| xs.cloned().collect::>()), args.get_many::("remove") @@ -121,16 +120,30 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { let common_args = args.subcommand().map(|(_, args)| args).unwrap_or(args); + if (to_add.clone(), to_remove.clone(), list) == (None, None, false) { + return Err(CliError::new( + anyhow::format_err!( + " please enter correct subcommand or parameter.\n +enter `cargo owner --help` for help." + ), + 101, + )); + } + let opts = OwnersOptions { krate: common_args.clone().get_one::("crate").cloned(), token: common_args .get_one::("token") .cloned() .map(Secret::from), - reg_or_index: args.registry_or_index(config)?, - to_add: to_add, - to_remove: to_remove, - list: list, + reg_or_index: args + .subcommand() + .map_or(args.registry_or_index(config), |v| { + v.1.registry_or_index(config) + })?, + to_add, + to_remove, + list, }; ops::modify_owners(config, &opts)?; diff --git a/src/etc/_cargo b/src/etc/_cargo index 7fb3352523d..0e495dacc05 100644 --- a/src/etc/_cargo +++ b/src/etc/_cargo @@ -217,9 +217,12 @@ _cargo() { owner) _arguments -s -S $common $registry \ '(-a --add)'{-a,--add}'[specify name of a user or team to invite as an owner]:name' \ + '(add)'{add}'[specify name of a user or team to invite as an owner]:name' \ '--index=[specify registry index]:index' \ '(-l --list)'{-l,--list}'[list owners of a crate]' \ + '(list)'{list}'[list owners of a crate]' \ '(-r --remove)'{-r,--remove}'[specify name of a user or team to remove as an owner]:name' \ + '(remove)'{remove}'[specify name of a user or team to remove as an owner]:name' \ '--token=[specify API token to use when authenticating]:token' \ '*: :_guard "^-*" "crate"' ;; diff --git a/src/etc/cargo.bashcomp.sh b/src/etc/cargo.bashcomp.sh old mode 100644 new mode 100755 index a1e800bc3e3..e7f1324c851 --- a/src/etc/cargo.bashcomp.sh +++ b/src/etc/cargo.bashcomp.sh @@ -69,7 +69,7 @@ _cargo() local opt__login="$opt_common $opt_lock --registry" local opt__metadata="$opt_common $opt_feat $opt_mani $opt_lock --format-version=1 --no-deps --filter-platform" local opt__new="$opt_common $opt_lock --vcs --bin --lib --name --edition --registry" - local opt__owner="$opt_common $opt_lock -a --add -r --remove -l --list --index --token --registry" + local opt__owner="$opt_common $opt_lock -a --add add -r --remove remove -l --list list --index --token --registry" local opt__package="$opt_common $opt_mani $opt_feat $opt_lock $opt_parallel --allow-dirty -l --list --no-verify --no-metadata --target --target-dir" local opt__pkgid="$opt_common $opt_mani $opt_lock $opt_pkg" local opt__publish="$opt_common $opt_mani $opt_feat $opt_lock $opt_parallel --allow-dirty --dry-run --token --no-verify --index --registry --target --target-dir" diff --git a/tests/testsuite/alt_registry.rs b/tests/testsuite/alt_registry.rs index a0d21da31a4..6750dc87bd8 100644 --- a/tests/testsuite/alt_registry.rs +++ b/tests/testsuite/alt_registry.rs @@ -723,7 +723,7 @@ Caused by: "init", "install foo", "login", - "owner", + "owner list", "publish", "search", "yank --version 0.0.1", @@ -1402,7 +1402,7 @@ fn both_index_and_default() { let p = project().file("src/lib.rs", "").build(); for cmd in &[ "publish", - "owner", + "owner list", "search", "yank --version 1.0.0", "install foo", diff --git a/tests/testsuite/cargo_owner/add_help/stdout.log b/tests/testsuite/cargo_owner/add_help/stdout.log index a2ecb7496f4..3da42c9d76f 100644 --- a/tests/testsuite/cargo_owner/add_help/stdout.log +++ b/tests/testsuite/cargo_owner/add_help/stdout.log @@ -11,6 +11,7 @@ Options: --registry Registry to modify owners for --token API token to use when authenticating -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + -q, --quiet Do not print cargo log messages --color Coloring: auto, always, never --config Override a configuration value -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index 9b5d585f723..e1ffbc62a68 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -10,7 +10,6 @@ Commands: list List owners of a crate Options: - -q, --quiet Do not print cargo log messages --index Registry index URL to modify owners for --registry Registry to modify owners for --token API token to use when authenticating diff --git a/tests/testsuite/cargo_owner/list_help/stdout.log b/tests/testsuite/cargo_owner/list_help/stdout.log index c643909f585..e7e77e2d295 100644 --- a/tests/testsuite/cargo_owner/list_help/stdout.log +++ b/tests/testsuite/cargo_owner/list_help/stdout.log @@ -10,6 +10,7 @@ Options: --registry Registry to modify owners for --token API token to use when authenticating -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + -q, --quiet Do not print cargo log messages --color Coloring: auto, always, never --config Override a configuration value -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details diff --git a/tests/testsuite/cargo_owner/remove_help/stdout.log b/tests/testsuite/cargo_owner/remove_help/stdout.log index 9accbfac594..666939e627e 100644 --- a/tests/testsuite/cargo_owner/remove_help/stdout.log +++ b/tests/testsuite/cargo_owner/remove_help/stdout.log @@ -11,6 +11,7 @@ Options: --registry Registry to modify owners for --token API token to use when authenticating -v, --verbose... Use verbose output (-vv very verbose/build.rs output) + -q, --quiet Do not print cargo log messages --color Coloring: auto, always, never --config Override a configuration value -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details From 13fccb22cfb087ecc34015a72eb2908f1bb73e9e Mon Sep 17 00:00:00 2001 From: heisen-li Date: Sat, 25 Nov 2023 12:13:44 +0800 Subject: [PATCH 19/28] fix test --- src/bin/cargo/commands/owner.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 95a16e9c472..9e6397680d3 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -11,9 +11,9 @@ pub fn cli() -> Command { .args_conflicts_with_subcommands(true) .override_usage( "\ - cargo owner add [CRATE_NAME] [OPTIONS] - cargo owner remove [CRATE_NAME] [OPTIONS] - cargo owner list [CRATE_NAME] [OPTIONS]", + cargo[EXE] owner add [CRATE_NAME] [OPTIONS] + cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] + cargo[EXE] owner list [CRATE_NAME] [OPTIONS]", ) .arg( multi_opt( From bf304aa52d9242254b2551219f8d72b338baa370 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 11:12:05 +0800 Subject: [PATCH 20/28] modify the code by comments --- Cargo.lock | 12 ++-- Cargo.toml | 2 +- src/bin/cargo/commands/owner.rs | 56 +++++++++---------- src/etc/_cargo | 3 - src/etc/cargo.bashcomp.sh | 9 ++- .../testsuite/cargo_owner/add_help/stdout.log | 7 +-- tests/testsuite/cargo_owner/help/stdout.log | 36 +++++++++--- .../cargo_owner/list_help/stdout.log | 6 +- .../cargo_owner/remove_help/stdout.log | 5 +- 9 files changed, 71 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af77e6898ba..f91011c49d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -499,18 +499,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -3896,6 +3896,6 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" \ No newline at end of file +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml index 0af9f6f9a5a..9149d7732b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ cargo-test-macro = { path = "crates/cargo-test-macro" } cargo-test-support = { path = "crates/cargo-test-support" } cargo-util = { version = "0.2.6", path = "crates/cargo-util" } cargo_metadata = "0.18.1" -clap = "4.4.7" +clap = "4.4.11" color-print = "0.3.5" core-foundation = { version = "0.9.3", features = ["mac_os_10_7_support"] } crates-io = { version = "0.39.0", path = "crates/crates-io" } diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index 9e6397680d3..fdca10c023e 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -6,15 +6,10 @@ use cargo_credential::Secret; pub fn cli() -> Command { subcommand("owner") .about("Manage the owners of a crate on the registry") - .arg(Arg::new("crate").hide(true)) .arg_required_else_help(true) .args_conflicts_with_subcommands(true) - .override_usage( - "\ - cargo[EXE] owner add [CRATE_NAME] [OPTIONS] - cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] - cargo[EXE] owner list [CRATE_NAME] [OPTIONS]", - ) + .flatten_help(true) + .arg(Arg::new("crate").hide(true)) .arg( multi_opt( "add", @@ -37,41 +32,38 @@ pub fn cli() -> Command { .subcommands([ Command::new("add") .about("Name of a user or team to invite as an owner") - .args([ + .arg( Arg::new("add") .required(true) .value_delimiter(',') .value_name("OWNER_NAME") - .help("Name of the owner you want to invite"), - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]) - .args(&add_registry_args()) - .override_usage("cargo owner add [CRATE_NAME] [OPTIONS]"), + .hide(true) + .help("Name of the owner you want to invite") + ) + .args(add_registry_args()) + .override_usage(color_print::cstr!( + "cargo owner add <> [CRATE_NAME] [OPTIONS]" + )), Command::new("remove") .about("Name of a user or team to remove as an owner") - .args([ + .arg( Arg::new("remove") .required(true) .value_delimiter(',') .value_name("OWNER_NAME") - .help("Name of the owner you want to remove"), - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name that you want to manage the owner"), - ]) - .args(&add_registry_args()) - .override_usage("cargo owner remove [CRATE_NAME] [OPTIONS]"), + .hide(true) + .help("Name of the owner you want to remove") + ) + .args(add_registry_args()) + .override_usage(color_print::cstr!( + "cargo owner remove <> [CRATE_NAME] [OPTIONS]" + )), Command::new("list") .about("List owners of a crate") - .arg( - Arg::new("crate") - .value_name("CRATE_NAME") - .help("Crate name which you want to list all owner names"), - ) - .args(&add_registry_args()) - .override_usage("cargo owner list [CRATE_NAME] [OPTIONS]"), + .args(add_registry_args()) + .override_usage(color_print::cstr!( + "cargo owner list [CRATE_NAME] [OPTIONS]" + )), ]) .arg_index("Registry index URL to modify owners for") .arg_registry("Registry to modify owners for") @@ -82,8 +74,10 @@ pub fn cli() -> Command { )) } -fn add_registry_args() -> [Arg; 3] { +fn add_registry_args() -> [Arg; 4] { [ + opt("crate", "Crate name that you want to manage the owner") + .value_name("CRATE_NAME"), opt("index", "Registry index URL to modify owners for") .value_name("INDEX") .conflicts_with("registry"), diff --git a/src/etc/_cargo b/src/etc/_cargo index 0e495dacc05..7fb3352523d 100644 --- a/src/etc/_cargo +++ b/src/etc/_cargo @@ -217,12 +217,9 @@ _cargo() { owner) _arguments -s -S $common $registry \ '(-a --add)'{-a,--add}'[specify name of a user or team to invite as an owner]:name' \ - '(add)'{add}'[specify name of a user or team to invite as an owner]:name' \ '--index=[specify registry index]:index' \ '(-l --list)'{-l,--list}'[list owners of a crate]' \ - '(list)'{list}'[list owners of a crate]' \ '(-r --remove)'{-r,--remove}'[specify name of a user or team to remove as an owner]:name' \ - '(remove)'{remove}'[specify name of a user or team to remove as an owner]:name' \ '--token=[specify API token to use when authenticating]:token' \ '*: :_guard "^-*" "crate"' ;; diff --git a/src/etc/cargo.bashcomp.sh b/src/etc/cargo.bashcomp.sh index e7f1324c851..0026e929b8e 100755 --- a/src/etc/cargo.bashcomp.sh +++ b/src/etc/cargo.bashcomp.sh @@ -69,7 +69,10 @@ _cargo() local opt__login="$opt_common $opt_lock --registry" local opt__metadata="$opt_common $opt_feat $opt_mani $opt_lock --format-version=1 --no-deps --filter-platform" local opt__new="$opt_common $opt_lock --vcs --bin --lib --name --edition --registry" - local opt__owner="$opt_common $opt_lock -a --add add -r --remove remove -l --list list --index --token --registry" + local opt__owner="$opt_common $opt_lock add remove list -a --add -r --remove -l --list --index --token --registry" + local opt__owner_add="$opt_common $opt_lock --crate --index --token --registry" + local opt__owner_remove="$opt_common $opt_lock --crate --index --token --registry" + local opt__owner_list="$opt_common $opt_lock --crate --index --token --registry" local opt__package="$opt_common $opt_mani $opt_feat $opt_lock $opt_parallel --allow-dirty -l --list --no-verify --no-metadata --target --target-dir" local opt__pkgid="$opt_common $opt_mani $opt_lock $opt_pkg" local opt__publish="$opt_common $opt_mani $opt_feat $opt_lock $opt_parallel --allow-dirty --dry-run --token --no-verify --index --registry --target --target-dir" @@ -209,12 +212,12 @@ _get_names_from_array() line=${line##*=} line=${line%%\"} line=${line##*\"} - names+=($line) + names+=("$line") fi fi last_line=$line - done < $manifest + done < "$manifest" echo "${names[@]}" } diff --git a/tests/testsuite/cargo_owner/add_help/stdout.log b/tests/testsuite/cargo_owner/add_help/stdout.log index 3da42c9d76f..5d3bfe0901e 100644 --- a/tests/testsuite/cargo_owner/add_help/stdout.log +++ b/tests/testsuite/cargo_owner/add_help/stdout.log @@ -1,12 +1,9 @@ Name of a user or team to invite as an owner -Usage: cargo owner add [CRATE_NAME] [OPTIONS] - -Arguments: - Name of the owner you want to invite - [CRATE_NAME] Crate name that you want to manage the owner +Usage: cargo owner add [CRATE_NAME] [OPTIONS] Options: + --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for --registry Registry to modify owners for --token API token to use when authenticating diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index e1ffbc62a68..67fc50eae54 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -1,13 +1,9 @@ Manage the owners of a crate on the registry -Usage: cargo[EXE] owner add [CRATE_NAME] [OPTIONS] - cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] - cargo[EXE] owner list [CRATE_NAME] [OPTIONS] - -Commands: - add Name of a user or team to invite as an owner - remove Name of a user or team to remove as an owner - list List owners of a crate +Usage: cargo owner [OPTIONS] + cargo owner add [CRATE_NAME] [OPTIONS] + cargo owner remove [CRATE_NAME] [OPTIONS] + cargo owner list [CRATE_NAME] [OPTIONS] Options: --index Registry index URL to modify owners for @@ -25,4 +21,28 @@ Manifest Options: --locked Require Cargo.lock is up to date --offline Run without accessing the network +cargo owner add: +Name of a user or team to invite as an owner + --crate Crate name that you want to manage the owner + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -h, --help Print help + +cargo owner remove: +Name of a user or team to remove as an owner + --crate Crate name that you want to manage the owner + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -h, --help Print help + +cargo owner list: +List owners of a crate + --crate Crate name that you want to manage the owner + --index Registry index URL to modify owners for + --registry Registry to modify owners for + --token API token to use when authenticating + -h, --help Print help + Run `cargo help owner` for more detailed information. diff --git a/tests/testsuite/cargo_owner/list_help/stdout.log b/tests/testsuite/cargo_owner/list_help/stdout.log index e7e77e2d295..0c563de0ec9 100644 --- a/tests/testsuite/cargo_owner/list_help/stdout.log +++ b/tests/testsuite/cargo_owner/list_help/stdout.log @@ -1,11 +1,9 @@ List owners of a crate -Usage: cargo owner list [CRATE_NAME] [OPTIONS] - -Arguments: - [CRATE_NAME] Crate name which you want to list all owner names +Usage: cargo owner list [CRATE_NAME] [OPTIONS] Options: + --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for --registry Registry to modify owners for --token API token to use when authenticating diff --git a/tests/testsuite/cargo_owner/remove_help/stdout.log b/tests/testsuite/cargo_owner/remove_help/stdout.log index 666939e627e..bc4872cb8a8 100644 --- a/tests/testsuite/cargo_owner/remove_help/stdout.log +++ b/tests/testsuite/cargo_owner/remove_help/stdout.log @@ -2,11 +2,8 @@ Name of a user or team to remove as an owner Usage: cargo owner remove [CRATE_NAME] [OPTIONS] -Arguments: - Name of the owner you want to remove - [CRATE_NAME] Crate name that you want to manage the owner - Options: + --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for --registry Registry to modify owners for --token API token to use when authenticating From 97d259637105a0265817cf1d7b7c892746c291f6 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 11:14:17 +0800 Subject: [PATCH 21/28] resolve conflict --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9149d7732b8..7995b43fb9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ cargo-test-macro = { path = "crates/cargo-test-macro" } cargo-test-support = { path = "crates/cargo-test-support" } cargo-util = { version = "0.2.6", path = "crates/cargo-util" } cargo_metadata = "0.18.1" -clap = "4.4.11" +clap = "4.4.10" color-print = "0.3.5" core-foundation = { version = "0.9.3", features = ["mac_os_10_7_support"] } crates-io = { version = "0.39.0", path = "crates/crates-io" } From 0987b723fdf8f8434703ae42a9da6a93b7e91708 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 11:14:39 +0800 Subject: [PATCH 22/28] resolve conflict --- src/bin/cargo/commands/owner.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index fdca10c023e..ba6e5178181 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -38,7 +38,7 @@ pub fn cli() -> Command { .value_delimiter(',') .value_name("OWNER_NAME") .hide(true) - .help("Name of the owner you want to invite") + .help("Name of the owner you want to invite"), ) .args(add_registry_args()) .override_usage(color_print::cstr!( @@ -52,7 +52,7 @@ pub fn cli() -> Command { .value_delimiter(',') .value_name("OWNER_NAME") .hide(true) - .help("Name of the owner you want to remove") + .help("Name of the owner you want to remove"), ) .args(add_registry_args()) .override_usage(color_print::cstr!( @@ -76,8 +76,7 @@ pub fn cli() -> Command { fn add_registry_args() -> [Arg; 4] { [ - opt("crate", "Crate name that you want to manage the owner") - .value_name("CRATE_NAME"), + opt("crate", "Crate name that you want to manage the owner").value_name("CRATE_NAME"), opt("index", "Registry index URL to modify owners for") .value_name("INDEX") .conflicts_with("registry"), From 05c1653898495119b14fb89dd6cea48735ea01e3 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 11:14:17 +0800 Subject: [PATCH 23/28] resolve conflict --- Cargo.toml | 2 +- src/bin/cargo/commands/owner.rs | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9149d7732b8..7995b43fb9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ cargo-test-macro = { path = "crates/cargo-test-macro" } cargo-test-support = { path = "crates/cargo-test-support" } cargo-util = { version = "0.2.6", path = "crates/cargo-util" } cargo_metadata = "0.18.1" -clap = "4.4.11" +clap = "4.4.10" color-print = "0.3.5" core-foundation = { version = "0.9.3", features = ["mac_os_10_7_support"] } crates-io = { version = "0.39.0", path = "crates/crates-io" } diff --git a/src/bin/cargo/commands/owner.rs b/src/bin/cargo/commands/owner.rs index fdca10c023e..dd2ba85dbf2 100644 --- a/src/bin/cargo/commands/owner.rs +++ b/src/bin/cargo/commands/owner.rs @@ -38,7 +38,7 @@ pub fn cli() -> Command { .value_delimiter(',') .value_name("OWNER_NAME") .hide(true) - .help("Name of the owner you want to invite") + .help("Name of the owner you want to invite"), ) .args(add_registry_args()) .override_usage(color_print::cstr!( @@ -52,7 +52,7 @@ pub fn cli() -> Command { .value_delimiter(',') .value_name("OWNER_NAME") .hide(true) - .help("Name of the owner you want to remove") + .help("Name of the owner you want to remove"), ) .args(add_registry_args()) .override_usage(color_print::cstr!( @@ -76,8 +76,7 @@ pub fn cli() -> Command { fn add_registry_args() -> [Arg; 4] { [ - opt("crate", "Crate name that you want to manage the owner") - .value_name("CRATE_NAME"), + opt("crate", "Crate name that you want to manage the owner").value_name("CRATE_NAME"), opt("index", "Registry index URL to modify owners for") .value_name("INDEX") .conflicts_with("registry"), @@ -112,8 +111,6 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { ), }; - let common_args = args.subcommand().map(|(_, args)| args).unwrap_or(args); - if (to_add.clone(), to_remove.clone(), list) == (None, None, false) { return Err(CliError::new( anyhow::format_err!( @@ -124,6 +121,8 @@ enter `cargo owner --help` for help." )); } + let common_args = args.subcommand().map(|(_, args)| args).unwrap_or(args); + let opts = OwnersOptions { krate: common_args.clone().get_one::("crate").cloned(), token: common_args From b722762eb24402402149e6299ade5eecc3b761ec Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 15:02:21 +0800 Subject: [PATCH 24/28] fix failed test --- tests/testsuite/cargo_owner/add_help/mod.rs | 2 +- tests/testsuite/cargo_owner/add_help/stdout.log | 2 +- tests/testsuite/cargo_owner/help/stdout.log | 8 ++++---- tests/testsuite/cargo_owner/list_help/mod.rs | 2 +- tests/testsuite/cargo_owner/list_help/stdout.log | 2 +- tests/testsuite/cargo_owner/remove_help/mod.rs | 2 +- tests/testsuite/cargo_owner/remove_help/stdout.log | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/testsuite/cargo_owner/add_help/mod.rs b/tests/testsuite/cargo_owner/add_help/mod.rs index 20d2e7d9c8f..7262c3de268 100644 --- a/tests/testsuite/cargo_owner/add_help/mod.rs +++ b/tests/testsuite/cargo_owner/add_help/mod.rs @@ -2,7 +2,7 @@ use cargo_test_support::curr_dir; use cargo_test_support::prelude::*; #[cargo_test] -fn case() { +fn add_case() { snapbox::cmd::Command::cargo_ui() .arg("owner") .arg("add") diff --git a/tests/testsuite/cargo_owner/add_help/stdout.log b/tests/testsuite/cargo_owner/add_help/stdout.log index 5d3bfe0901e..b5c732e758a 100644 --- a/tests/testsuite/cargo_owner/add_help/stdout.log +++ b/tests/testsuite/cargo_owner/add_help/stdout.log @@ -1,6 +1,6 @@ Name of a user or team to invite as an owner -Usage: cargo owner add [CRATE_NAME] [OPTIONS] +Usage: cargo[EXE] owner add [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index 67fc50eae54..a0a865cebaa 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -1,6 +1,6 @@ Manage the owners of a crate on the registry -Usage: cargo owner [OPTIONS] +Usage: cargo[EXE] owner [OPTIONS] cargo owner add [CRATE_NAME] [OPTIONS] cargo owner remove [CRATE_NAME] [OPTIONS] cargo owner list [CRATE_NAME] [OPTIONS] @@ -21,7 +21,7 @@ Manifest Options: --locked Require Cargo.lock is up to date --offline Run without accessing the network -cargo owner add: +cargo[EXE] owner add: Name of a user or team to invite as an owner --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for @@ -29,7 +29,7 @@ Name of a user or team to invite as an owner --token API token to use when authenticating -h, --help Print help -cargo owner remove: +cargo[EXE] owner remove: Name of a user or team to remove as an owner --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for @@ -37,7 +37,7 @@ Name of a user or team to remove as an owner --token API token to use when authenticating -h, --help Print help -cargo owner list: +cargo[EXE] owner list: List owners of a crate --crate Crate name that you want to manage the owner --index Registry index URL to modify owners for diff --git a/tests/testsuite/cargo_owner/list_help/mod.rs b/tests/testsuite/cargo_owner/list_help/mod.rs index ca297811988..a5d3543d4de 100644 --- a/tests/testsuite/cargo_owner/list_help/mod.rs +++ b/tests/testsuite/cargo_owner/list_help/mod.rs @@ -2,7 +2,7 @@ use cargo_test_support::curr_dir; use cargo_test_support::prelude::*; #[cargo_test] -fn case() { +fn list_case() { snapbox::cmd::Command::cargo_ui() .arg("owner") .arg("list") diff --git a/tests/testsuite/cargo_owner/list_help/stdout.log b/tests/testsuite/cargo_owner/list_help/stdout.log index 0c563de0ec9..d63da4c7374 100644 --- a/tests/testsuite/cargo_owner/list_help/stdout.log +++ b/tests/testsuite/cargo_owner/list_help/stdout.log @@ -1,6 +1,6 @@ List owners of a crate -Usage: cargo owner list [CRATE_NAME] [OPTIONS] +Usage: cargo[EXE] owner list [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner diff --git a/tests/testsuite/cargo_owner/remove_help/mod.rs b/tests/testsuite/cargo_owner/remove_help/mod.rs index bbde7fe59ea..2800a9634a2 100644 --- a/tests/testsuite/cargo_owner/remove_help/mod.rs +++ b/tests/testsuite/cargo_owner/remove_help/mod.rs @@ -2,7 +2,7 @@ use cargo_test_support::curr_dir; use cargo_test_support::prelude::*; #[cargo_test] -fn case() { +fn remove_case() { snapbox::cmd::Command::cargo_ui() .arg("owner") .arg("remove") diff --git a/tests/testsuite/cargo_owner/remove_help/stdout.log b/tests/testsuite/cargo_owner/remove_help/stdout.log index bc4872cb8a8..05e572d5f21 100644 --- a/tests/testsuite/cargo_owner/remove_help/stdout.log +++ b/tests/testsuite/cargo_owner/remove_help/stdout.log @@ -1,6 +1,6 @@ Name of a user or team to remove as an owner -Usage: cargo owner remove [CRATE_NAME] [OPTIONS] +Usage: cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner From 01701f7bf7647bcf3a3d1548958b7dc523e433fb Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 15:09:50 +0800 Subject: [PATCH 25/28] fix failed tests --- tests/testsuite/cargo_owner/help/stdout.log | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index a0a865cebaa..ab130538b14 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -1,9 +1,9 @@ Manage the owners of a crate on the registry Usage: cargo[EXE] owner [OPTIONS] - cargo owner add [CRATE_NAME] [OPTIONS] - cargo owner remove [CRATE_NAME] [OPTIONS] - cargo owner list [CRATE_NAME] [OPTIONS] + cargo[EXE] owner add [CRATE_NAME] [OPTIONS] + cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] + cargo[EXE] owner list [CRATE_NAME] [OPTIONS] Options: --index Registry index URL to modify owners for From 9f7e9bd29e5b4ccbd59d7dee3483dd062b2dd3c2 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 15:09:50 +0800 Subject: [PATCH 26/28] fix failed tests --- tests/testsuite/cargo_owner/add_help/stdout.log | 2 +- tests/testsuite/cargo_owner/remove_help/stdout.log | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testsuite/cargo_owner/add_help/stdout.log b/tests/testsuite/cargo_owner/add_help/stdout.log index b5c732e758a..5d3bfe0901e 100644 --- a/tests/testsuite/cargo_owner/add_help/stdout.log +++ b/tests/testsuite/cargo_owner/add_help/stdout.log @@ -1,6 +1,6 @@ Name of a user or team to invite as an owner -Usage: cargo[EXE] owner add [CRATE_NAME] [OPTIONS] +Usage: cargo owner add [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner diff --git a/tests/testsuite/cargo_owner/remove_help/stdout.log b/tests/testsuite/cargo_owner/remove_help/stdout.log index 05e572d5f21..bc4872cb8a8 100644 --- a/tests/testsuite/cargo_owner/remove_help/stdout.log +++ b/tests/testsuite/cargo_owner/remove_help/stdout.log @@ -1,6 +1,6 @@ Name of a user or team to remove as an owner -Usage: cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] +Usage: cargo owner remove [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner From 3e1914e33a00890a34020ff07a6cf9fc551eedd2 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Tue, 12 Dec 2023 15:31:33 +0800 Subject: [PATCH 27/28] fix tests --- tests/testsuite/cargo_owner/help/stdout.log | 6 +++--- tests/testsuite/cargo_owner/list_help/stdout.log | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/testsuite/cargo_owner/help/stdout.log b/tests/testsuite/cargo_owner/help/stdout.log index ab130538b14..a0a865cebaa 100644 --- a/tests/testsuite/cargo_owner/help/stdout.log +++ b/tests/testsuite/cargo_owner/help/stdout.log @@ -1,9 +1,9 @@ Manage the owners of a crate on the registry Usage: cargo[EXE] owner [OPTIONS] - cargo[EXE] owner add [CRATE_NAME] [OPTIONS] - cargo[EXE] owner remove [CRATE_NAME] [OPTIONS] - cargo[EXE] owner list [CRATE_NAME] [OPTIONS] + cargo owner add [CRATE_NAME] [OPTIONS] + cargo owner remove [CRATE_NAME] [OPTIONS] + cargo owner list [CRATE_NAME] [OPTIONS] Options: --index Registry index URL to modify owners for diff --git a/tests/testsuite/cargo_owner/list_help/stdout.log b/tests/testsuite/cargo_owner/list_help/stdout.log index d63da4c7374..0c563de0ec9 100644 --- a/tests/testsuite/cargo_owner/list_help/stdout.log +++ b/tests/testsuite/cargo_owner/list_help/stdout.log @@ -1,6 +1,6 @@ List owners of a crate -Usage: cargo[EXE] owner list [CRATE_NAME] [OPTIONS] +Usage: cargo owner list [CRATE_NAME] [OPTIONS] Options: --crate Crate name that you want to manage the owner From 6d2b554da0a444167fd71d427c687400b8264137 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Wed, 20 Dec 2023 18:19:37 +0800 Subject: [PATCH 28/28] zsh completions --- src/etc/_cargo | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/etc/_cargo b/src/etc/_cargo index 7fb3352523d..8c6264d733a 100644 --- a/src/etc/_cargo +++ b/src/etc/_cargo @@ -153,8 +153,7 @@ _cargo() { '--allow-dirty[fix code even if the working directory is dirty]' \ '--allow-staged[fix code even if the working directory has staged changes]' \ '--ignore-rust-version[Ignore rust-version specification in packages]' - ;; - + ;; generate-lockfile) _arguments -s -S $common $manifest ;; @@ -218,9 +217,11 @@ _cargo() { _arguments -s -S $common $registry \ '(-a --add)'{-a,--add}'[specify name of a user or team to invite as an owner]:name' \ '--index=[specify registry index]:index' \ + '--crate=[Crate name that you want to manage the owner]:crate' \ '(-l --list)'{-l,--list}'[list owners of a crate]' \ '(-r --remove)'{-r,--remove}'[specify name of a user or team to remove as an owner]:name' \ '--token=[specify API token to use when authenticating]:token' \ + '(--add -a --remove -r --list -l 1): :_cargo_owner_subcommand' \ '*: :_guard "^-*" "crate"' ;; @@ -378,6 +379,17 @@ _cargo() { esac } +_cargo_owner_subcommand() { + local -a subcommands + + subcommands=( + 'add:specify name of a user or team to invite as an owner' + 'remove:specify name of a user or team to remove as an owner' + 'list:list owners of a crate' + ) + _describe -t subcommands 'command' subcommands +} + _cargo_unstable_flags() { local flags flags=( help ${${${(M)${(f)"$(_call_program flags cargo -Z help)"}:#*--*}/ #-- #/:}##*-Z } )