diff --git a/src/bin/cargo/commands/install.rs b/src/bin/cargo/commands/install.rs index 55b5f116b65..b26c0cc6d4a 100644 --- a/src/bin/cargo/commands/install.rs +++ b/src/bin/cargo/commands/install.rs @@ -18,7 +18,7 @@ pub fn cli() -> App { .arg( opt("git", "Git URL to install the specified crate from") .value_name("URL") - .conflicts_with_all(&["path", "registry"]), + .conflicts_with_all(&["path", "index", "registry"]), ) .arg( opt("branch", "Branch to use when installing from git") @@ -38,7 +38,7 @@ pub fn cli() -> App { .arg( opt("path", "Filesystem path to local crate to install") .value_name("PATH") - .conflicts_with_all(&["git", "registry"]), + .conflicts_with_all(&["git", "index", "registry"]), ) .arg(opt( "list", @@ -58,11 +58,17 @@ pub fn cli() -> App { ) .arg_target_triple("Build for the target triple") .arg(opt("root", "Directory to install packages into").value_name("DIR")) + .arg( + opt("index", "Registry index to install from") + .value_name("INDEX") + .requires("crate") + .conflicts_with_all(&["git", "path", "registry"]), + ) .arg( opt("registry", "Registry to use") .value_name("REGISTRY") .requires("crate") - .conflicts_with_all(&["git", "path"]), + .conflicts_with_all(&["git", "path", "index"]), ) .after_help( "\ @@ -100,8 +106,6 @@ continuous integration systems.", } pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { - let registry = args.registry(config)?; - if let Some(path) = args.value_of_path("path", config) { config.reload_rooted_at(path)?; } else { @@ -143,8 +147,10 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { } else if krates.is_empty() { from_cwd = true; SourceId::for_path(config.cwd())? - } else if let Some(registry) = registry { + } else if let Some(registry) = args.registry(config)? { SourceId::alt_registry(config, ®istry)? + } else if let Some(index) = args.value_of("index") { + SourceId::for_registry(&index.into_url()?)? } else { SourceId::crates_io(config)? }; diff --git a/src/doc/man/cargo-install.adoc b/src/doc/man/cargo-install.adoc index e88909ba11b..4c33e264b5e 100644 --- a/src/doc/man/cargo-install.adoc +++ b/src/doc/man/cargo-install.adoc @@ -135,6 +135,8 @@ available. include::options-registry.adoc[] +include::options-index.adoc[] + include::options-features.adoc[] === Compilation Options diff --git a/src/doc/man/generated/cargo-install.html b/src/doc/man/generated/cargo-install.html index 9915e1cc74a..0dee05d2a41 100644 --- a/src/doc/man/generated/cargo-install.html +++ b/src/doc/man/generated/cargo-install.html @@ -197,6 +197,10 @@

Install Options

If not specified, the default registry is used, which is defined by the registry.default config key which defaults to crates-io.

+
--index INDEX
+
+

The URL of the registry index to use.

+
diff --git a/src/etc/man/cargo-install.1 b/src/etc/man/cargo-install.1 index dfefe58330a..8ad897030a8 100644 --- a/src/etc/man/cargo-install.1 +++ b/src/etc/man/cargo-install.1 @@ -2,12 +2,12 @@ .\" Title: cargo-install .\" Author: [see the "AUTHOR(S)" section] .\" Generator: Asciidoctor 2.0.10 -.\" Date: 2020-02-06 +.\" Date: 2020-06-14 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "CARGO\-INSTALL" "1" "2020-02-06" "\ \&" "\ \&" +.TH "CARGO\-INSTALL" "1" "2020-06-14" "\ \&" "\ \&" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 @@ -293,6 +293,11 @@ Name of the registry to use. Registry names are defined in \c If not specified, the default registry is used, which is defined by the \fBregistry.default\fP config key which defaults to \fBcrates\-io\fP. .RE +.sp +\fB\-\-index\fP \fIINDEX\fP +.RS 4 +The URL of the registry index to use. +.RE .SS "Feature Selection" .sp The feature flags allow you to control the enabled features for the "current" diff --git a/tests/testsuite/install.rs b/tests/testsuite/install.rs index 3761d0b11ab..842844819fa 100644 --- a/tests/testsuite/install.rs +++ b/tests/testsuite/install.rs @@ -9,7 +9,7 @@ use cargo_test_support::install::{ assert_has_installed_exe, assert_has_not_installed_exe, cargo_home, }; use cargo_test_support::paths; -use cargo_test_support::registry::Package; +use cargo_test_support::registry::{registry_path, registry_url, Package}; use cargo_test_support::{ basic_manifest, cargo_process, no_such_file_err_msg, project, symlink_supported, t, }; @@ -51,6 +51,35 @@ fn simple() { assert_has_not_installed_exe(cargo_home(), "foo"); } +#[cargo_test] +fn with_index() { + pkg("foo", "0.0.1"); + + cargo_process("install foo --index") + .arg(registry_url().to_string()) + .with_stderr(&format!( + "\ +[UPDATING] `{reg}` index +[DOWNLOADING] crates ... +[DOWNLOADED] foo v0.0.1 (registry `{reg}`) +[INSTALLING] foo v0.0.1 (registry `{reg}`) +[COMPILING] foo v0.0.1 (registry `{reg}`) +[FINISHED] release [optimized] target(s) in [..] +[INSTALLING] [CWD]/home/.cargo/bin/foo[EXE] +[INSTALLED] package `foo v0.0.1 (registry `{reg}`)` (executable `foo[EXE]`) +[WARNING] be sure to add `[..]` to your PATH to be able to run the installed binaries +", + reg = registry_path().to_str().unwrap() + )) + .run(); + assert_has_installed_exe(cargo_home(), "foo"); + + cargo_process("uninstall foo") + .with_stderr("[REMOVING] [CWD]/home/.cargo/bin/foo[EXE]") + .run(); + assert_has_not_installed_exe(cargo_home(), "foo"); +} + #[cargo_test] fn multiple_pkgs() { pkg("foo", "0.0.1");