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