Move locate-project to clap
authorAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 7 Mar 2018 11:42:39 +0000 (14:42 +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/locate_project.rs [new file with mode: 0644]
src/bin/cli/mod.rs

index d04731cc549f07c2682331a8cafbab457e3f5b38..7b34fecee045a416d993c3ea5604c32b46910f23 100644 (file)
@@ -90,7 +90,7 @@ 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" => true,
+        "init" | "install" | "locate-project" => true,
         _ => false
     });
 
@@ -129,7 +129,7 @@ macro_rules! each_subcommand{
         $mac!(help);
 //        $mac!(init);
 //        $mac!(install);
-        $mac!(locate_project);
+//        $mac!(locate_project);
         $mac!(login);
         $mac!(metadata);
         $mac!(new);
diff --git a/src/bin/cli/locate_project.rs b/src/bin/cli/locate_project.rs
new file mode 100644 (file)
index 0000000..c2cd7cd
--- /dev/null
@@ -0,0 +1,7 @@
+use super::utils::*;
+
+pub fn cli() -> App {
+    subcommand("locate-project")
+        .about("Checkout a copy of a Git repository")
+        .arg_manifest_path()
+}
index 416c6b398647244cfc9458f985ebc418e08f5237..755f53077ba2583063385898ab1356cb5bf7956f 100644 (file)
@@ -60,9 +60,13 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
         )
     }
 
-    fn workspace_from_args<'a>(config: &'a Config, args: &ArgMatches) -> CargoResult<Workspace<'a>> {
+    fn root_manifest_from_args(config: &Config, args: &ArgMatches) -> CargoResult<PathBuf> {
         let manifest_path = args.value_of("manifest-path").map(|s| s.to_string());
-        let root = find_root_manifest_for_wd(manifest_path, config.cwd())?;
+        find_root_manifest_for_wd(manifest_path, config.cwd())
+    }
+
+    fn workspace_from_args<'a>(config: &'a Config, args: &ArgMatches) -> CargoResult<Workspace<'a>> {
+        let root = root_manifest_from_args(config, args)?;
         Workspace::new(&root, config)
     }
 
@@ -259,11 +263,31 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
             return Ok(());
 
         }
+        ("locate-project", Some(args)) => {
+            let root = root_manifest_from_args(config, args)?;
+
+            let root = root.to_str()
+                .ok_or_else(|| format_err!("your project path contains characters \
+                                            not representable in Unicode"))
+                .map_err(|e| CliError::new(e, 1))?
+                .to_string();
+
+            #[derive(Serialize)]
+            pub struct ProjectLocation {
+                root: String
+            }
+
+            let location = ProjectLocation { root };
+
+            cargo::print_json(&location);
+            return Ok(());
+        }
         _ => return Ok(())
     }
 }
 
 use self::utils::*;
+use std::path::PathBuf;
 
 fn cli() -> App {
     let app = App::new("cargo")
@@ -339,6 +363,7 @@ See 'cargo help <command>' for more information on a specific command.
             git_checkout::cli(),
             init::cli(),
             install::cli(),
+            locate_project::cli(),
         ])
     ;
     app
@@ -357,6 +382,7 @@ mod git_checkout;
 
 mod init;
 mod install;
+mod locate_project;
 
 mod utils {
     use clap::{self, SubCommand, AppSettings};