}
};
- match main_inner(&mut config) {
+ let result = {
+ init_git_transports(&mut config);
+ let _token = cargo::util::job::setup();
+ cli::do_main(&mut config)
+ };
+
+ match result {
Err(e) => cargo::exit_with_error(e, &mut *config.shell()),
Ok(()) => {}
}
}
-fn main_inner(config: &mut Config) -> CliResult {
- init_git_transports(config);
- let _token = cargo::util::job::setup();
- cli::do_main(config)
-}
-
fn aliased_command(config: &Config, command: &str) -> CargoResult<Option<Vec<String>>> {
let alias_name = format!("alias.{}", command);
let mut result = Ok(None);
use is_executable;
pub fn do_main(config: &mut Config) -> CliResult {
- let args = cli().get_matches();
+ let args = cli().get_matches_safe()?;
let is_verbose = args.occurrences_of("verbose") > 0;
if args.is_present("version") {
let version = cargo::version();
alias.extend(args.values_of("").unwrap_or_default().map(|s| s.to_string()));
let args = cli()
.setting(AppSettings::NoBinaryName)
- .get_matches_from(alias);
+ .get_matches_from_safe(alias)?;
return execute_subcommand(config, args);
}
let mut ext_args: Vec<&str> = vec![cmd];
#[macro_use] extern crate serde_derive;
#[macro_use] extern crate serde_json;
extern crate atty;
+extern crate clap;
extern crate crates_io as registry;
extern crate crossbeam;
extern crate curl;
pub fn exit_with_error(err: CliError, shell: &mut Shell) -> ! {
debug!("exit_with_error; err={:?}", err);
+ if let Some(ref err) = err.error {
+ if let Some(clap_err) = err.downcast_ref::<clap::Error>() {
+ clap_err.exit()
+ }
+ }
let CliError { error, exit_code, unknown } = err;
// exit_code == 0 is non-fatal error, e.g. docopt version info
use core::{TargetKind, Workspace};
use failure::{Context, Error, Fail};
+use clap;
pub use failure::Error as CargoError;
pub type CargoResult<T> = Result<T, Error>;
}
}
+impl From<clap::Error> for CliError {
+ fn from(err: clap::Error) -> CliError {
+ let code = if err.use_stderr() { 1 } else { 0 };
+ CliError::new(err.into(), code)
+ }
+}
+
// =============================================================================
// Construction helpers
use std::io::prelude::*;
use cargo::util::ProcessBuilder;
-use cargotest::ChannelChanger;
use cargotest::install::{cargo_home, has_installed_exe};
use cargotest::support::git;
use cargotest::support::paths;