Move owner to clap
authorAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 7 Mar 2018 14:40:33 +0000 (17:40 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 8 Mar 2018 20:30:46 +0000 (23:30 +0300)
src/bin/cargo.rs
src/bin/cli/mod.rs
src/bin/cli/owner.rs [new file with mode: 0644]

index ed0739c6d0f404daa3f40dbbf4ab19febfe51223..a85c0e5c6c634df47169881a22258a6083656d9b 100644 (file)
@@ -90,7 +90,8 @@ fn main() {
 
     let is_clapified = ::std::env::args().any(|arg| match arg.as_ref() {
         "build" | "bench" | "check" | "clean" | "doc" | "fetch" | "generate-lockfile" | "git-checkout" |
-        "init" | "install" | "locate-project" | "login" | "metadata" | "new" => true,
+        "init" | "install" | "locate-project" | "login" | "metadata" | "new" |
+        "owner" => true,
         _ => false
     });
 
@@ -133,7 +134,7 @@ macro_rules! each_subcommand{
 //        $mac!(login);
 //        $mac!(metadata);
 //        $mac!(new);
-        $mac!(owner);
+//        $mac!(owner);
         $mac!(package);
         $mac!(pkgid);
         $mac!(publish);
index 0f40a8b15a816a6f0275ff29f7817e54915207ee..f394b3ae886e52085f225aa9b6d17ecc65660334 100644 (file)
@@ -129,6 +129,19 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
                         args.value_of("name"))
     }
 
+    fn registry_from_args(config: &Config, args: &ArgMatches) -> CargoResult<Option<String>> {
+        match args.value_of("registry") {
+            Some(registry) => {
+                if !config.cli_unstable().unstable_options {
+                    return Err(format_err!("registry option is an unstable feature and \
+                                requires -Zunstable-options to use.").into());
+                }
+                Ok(Some(registry.to_string()))
+            }
+            None => Ok(None),
+        }
+    }
+
     config_from_args(config, &args)?;
     match args.subcommand() {
         ("bench", Some(args)) => {
@@ -288,11 +301,7 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
             return Ok(());
         }
         ("login", Some(args)) => {
-            let registry = args.value_of("registry").map(|s| s.to_string());
-            if registry.is_some() && !config.cli_unstable().unstable_options {
-                return Err(format_err!("registry option is an unstable feature and \
-                                requires -Zunstable-options to use.").into());
-            }
+            let registry = registry_from_args(config, args)?;
 
             let token = match args.value_of("token") {
                 Some(token) => token.to_string(),
@@ -357,6 +366,22 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
             config.shell().status("Created", format!("{} `{}` project", opts.kind, path))?;
             Ok(())
         }
+        ("owner", Some(args)) => {
+            let registry = registry_from_args(config, args)?;
+            let opts = ops::OwnersOptions {
+                krate: args.value_of("crate").map(|s| s.to_string()),
+                token: args.value_of("token").map(|s| s.to_string()),
+                index: args.value_of("index").map(|s| s.to_string()),
+                to_add: args.values_of("add")
+                    .map(|xs| xs.map(|s| s.to_string()).collect()),
+                to_remove: args.values_of("remove")
+                    .map(|xs| xs.map(|s| s.to_string()).collect()),
+                list: args.is_present("list"),
+                registry: args.value_of("registry").map(|s| s.to_string()),
+            };
+            ops::modify_owners(config, &opts)?;
+            return Ok(());
+        }
         _ => return Ok(())
     }
 }
@@ -440,6 +465,7 @@ See 'cargo help <command>' for more information on a specific command.
             login::cli(),
             metadata::cli(),
             new::cli(),
+            owner::cli(),
         ])
     ;
     app
@@ -462,6 +488,7 @@ mod locate_project;
 mod login;
 mod metadata;
 mod new;
+mod owner;
 
 mod utils {
     use clap::{self, SubCommand, AppSettings};
diff --git a/src/bin/cli/owner.rs b/src/bin/cli/owner.rs
new file mode 100644 (file)
index 0000000..a65d0f2
--- /dev/null
@@ -0,0 +1,28 @@
+use super::utils::*;
+
+pub fn cli() -> App {
+    subcommand("owner")
+        .about("Manage the owners of a crate on the registry")
+        .arg(Arg::with_name("crate"))
+        .arg(
+            opt("add", "Name of a user or team to add as an owner")
+                .short("a").value_name("LOGIN").multiple(true)
+        )
+        .arg(
+            opt("remove", "Name of a user or team to remove as an owner")
+                .short("r").value_name("LOGIN").multiple(true)
+        )
+        .arg(opt("list", "List owners of a crate").short("l"))
+        .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"))
+        .after_help("\
+    This command will modify the owners for a package
+    on the specified registry(or
+    default).Note that owners of a package can upload new versions, yank old
+    versions.Explicitly named owners can also modify the set of owners, so take
+    caution!
+
+        See http://doc.crates.io/crates-io.html#cargo-owner for detailed documentation
+        and troubleshooting.")
+}