Move git-checkout to clap
authorAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 7 Mar 2018 08:50:05 +0000 (11:50 +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/git_checkout.rs [new file with mode: 0644]
src/bin/cli/mod.rs

index ab9b31324cf51f1806b42ab220576b9c412fa888..516c747725f9585d2eb51c0963cd8096c0792909 100644 (file)
@@ -89,7 +89,7 @@ fn main() {
     };
 
     let is_clapified = ::std::env::args().any(|arg| match arg.as_ref() {
-        "build" | "bench" | "check" | "clean" | "doc" | "fetch" | "generate-lockfile" => true,
+        "build" | "bench" | "check" | "clean" | "doc" | "fetch" | "generate-lockfile" | "git-checkout" => true,
         _ => false
     });
 
@@ -124,7 +124,7 @@ macro_rules! each_subcommand{
 //        $mac!(doc);
 //        $mac!(fetch);
 //        $mac!(generate_lockfile);
-        $mac!(git_checkout);
+//        $mac!(git_checkout);
         $mac!(help);
         $mac!(init);
         $mac!(install);
diff --git a/src/bin/cli/git_checkout.rs b/src/bin/cli/git_checkout.rs
new file mode 100644 (file)
index 0000000..b926db9
--- /dev/null
@@ -0,0 +1,9 @@
+use super::utils::*;
+
+pub fn cli() -> App {
+    subcommand("git-checkout")
+        .about("Checkout a copy of a Git repository")
+        .arg(Arg::with_name("url").long("url").value_name("URL").required(true))
+        .arg(Arg::with_name("reference").long("reference").value_name("REF").required(true))
+        .arg_locked()
+}
index 9fdc5d89719506ce7d1dd0abda9f3a4896dbc4a1..ae2031776ee6a70e7dc6e581d037004848d292d7 100644 (file)
@@ -7,11 +7,11 @@ use std::slice;
 use cargo;
 
 use clap::{AppSettings, Arg, ArgMatches};
-use cargo::{Config, CargoResult};
-use cargo::core::Workspace;
+use cargo::{Config, CargoResult, CliError};
+use cargo::core::{Workspace, Source};
+use cargo::util::ToUrl;
 use cargo::util::important_paths::find_root_manifest_for_wd;
 use cargo::ops::{self, MessageFormat, Packages, CompileOptions, CompileMode};
-use cargo::CliError;
 
 
 pub fn do_main(config: &mut Config) -> Result<(), CliError> {
@@ -194,11 +194,29 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> {
             ops::generate_lockfile(&ws)?;
             return Ok(());
         }
+        ("git-checkout", Some(args)) => {
+            config_from_args(config, args)?;
+
+            let url = args.value_of("url").unwrap().to_url()?;
+            let reference = args.value_of("reference").unwrap();
+
+            let reference = GitReference::Branch(reference.to_string());
+            let source_id = SourceId::for_git(&url, reference)?;
+
+            let mut source = GitSource::new(&source_id, config)?;
+
+            source.update()?;
+
+            return Ok(());
+        }
         _ => return Ok(())
     }
 }
 
 use self::utils::*;
+use cargo::core::GitReference;
+use cargo::core::SourceId;
+use cargo::sources::GitSource;
 
 fn cli() -> App {
     let app = App::new("cargo")
@@ -263,6 +281,7 @@ See 'cargo help <command>' for more information on a specific command.
             doc::cli(),
             fetch::cli(),
             generate_lockfile::cli(),
+            git_checkout::cli(),
         ])
     ;
     app
@@ -275,6 +294,7 @@ mod clean;
 mod doc;
 mod fetch;
 mod generate_lockfile;
+mod git_checkout; // FIXME: let's just drop this subcommand?
 
 mod utils {
     use clap::{self, SubCommand, AppSettings};