mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-20 20:48:43 +00:00
parent
d68b0a209a
commit
eeaba76b5f
3 changed files with 535 additions and 192 deletions
607
Cargo.lock
generated
607
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
42
Cargo.toml
42
Cargo.toml
|
@ -19,29 +19,29 @@ pkg-fmt = "zip"
|
|||
pkg-fmt = "zip"
|
||||
|
||||
[dependencies]
|
||||
crates_io_api = "0.8.0"
|
||||
cargo_metadata = "0.14.1"
|
||||
tinytemplate = "1.2.1"
|
||||
tokio = { version = "1.16.1", features = [ "full" ] }
|
||||
log = "0.4.14"
|
||||
structopt = "0.3.26"
|
||||
simplelog = "0.11.2"
|
||||
anyhow = "1.0.53"
|
||||
reqwest = { version = "0.11.9", features = [ "rustls-tls" ], default-features = false }
|
||||
tempdir = "0.3.7"
|
||||
flate2 = "1.0.22"
|
||||
tar = "0.4.38"
|
||||
cargo_toml = "0.11.4"
|
||||
serde = { version = "1.0.136", features = [ "derive" ] }
|
||||
strum_macros = "0.23.1"
|
||||
strum = "0.23.0"
|
||||
dirs = "4.0.0"
|
||||
crates-index = "0.18.5"
|
||||
semver = "1.0.7"
|
||||
xz2 = "0.1.6"
|
||||
zip = "0.5.13"
|
||||
anyhow = "1.0.57"
|
||||
async-trait = "0.1.52"
|
||||
cargo_metadata = "0.14.2"
|
||||
cargo_toml = "0.11.4"
|
||||
crates-index = "0.18.7"
|
||||
crates_io_api = "0.8.0"
|
||||
dirs = "4.0.0"
|
||||
flate2 = "1.0.22"
|
||||
log = "0.4.14"
|
||||
reqwest = { version = "0.11.10", features = [ "rustls-tls" ], default-features = false }
|
||||
semver = "1.0.7"
|
||||
serde = { version = "1.0.136", features = [ "derive" ] }
|
||||
simplelog = "0.12.0"
|
||||
structopt = "0.3.26"
|
||||
strum = "0.24.0"
|
||||
strum_macros = "0.24.0"
|
||||
tar = "0.4.38"
|
||||
tempdir = "0.3.7"
|
||||
tinytemplate = "1.2.1"
|
||||
tokio = { version = "1.18.0", features = [ "full" ] }
|
||||
url = "2.2.2"
|
||||
xz2 = "0.1.6"
|
||||
zip = "0.6.2"
|
||||
|
||||
[dev-dependencies]
|
||||
env_logger = "0.9.0"
|
||||
|
|
78
src/main.rs
78
src/main.rs
|
@ -1,11 +1,11 @@
|
|||
use std::{path::PathBuf, str::FromStr};
|
||||
|
||||
use cargo_toml::{Package, Product};
|
||||
use log::{debug, error, info, warn, LevelFilter};
|
||||
use simplelog::{ColorChoice, ConfigBuilder, TermLogger, TerminalMode};
|
||||
|
||||
use structopt::StructOpt;
|
||||
|
||||
use tempdir::TempDir;
|
||||
use tokio::process::Command;
|
||||
|
||||
use cargo_binstall::{
|
||||
bins,
|
||||
|
@ -121,7 +121,8 @@ async fn main() -> Result<(), anyhow::Error> {
|
|||
let (mut meta, binaries) = (
|
||||
package
|
||||
.metadata
|
||||
.map(|m| m.binstall)
|
||||
.as_ref()
|
||||
.map(|m| m.binstall.clone())
|
||||
.flatten()
|
||||
.unwrap_or(PkgMeta::default()),
|
||||
manifest.bin,
|
||||
|
@ -160,11 +161,34 @@ async fn main() -> Result<(), anyhow::Error> {
|
|||
fetchers.add(GhCrateMeta::new(&fetcher_data).await);
|
||||
fetchers.add(QuickInstall::new(&fetcher_data).await);
|
||||
|
||||
let fetcher = fetchers.first_available().await.ok_or_else(|| {
|
||||
error!("File does not exist remotely, cannot proceed");
|
||||
anyhow::anyhow!("No viable remote package found")
|
||||
})?;
|
||||
match fetchers.first_available().await {
|
||||
Some(fetcher) => {
|
||||
install_from_package(
|
||||
binaries,
|
||||
fetcher,
|
||||
install_path,
|
||||
meta,
|
||||
opts,
|
||||
package,
|
||||
pkg_path,
|
||||
temp_dir,
|
||||
)
|
||||
.await
|
||||
}
|
||||
None => install_from_source(opts, package).await,
|
||||
}
|
||||
}
|
||||
|
||||
async fn install_from_package(
|
||||
binaries: Vec<Product>,
|
||||
fetcher: &dyn Fetcher,
|
||||
install_path: PathBuf,
|
||||
mut meta: PkgMeta,
|
||||
opts: Options,
|
||||
package: Package<Meta>,
|
||||
pkg_path: PathBuf,
|
||||
temp_dir: TempDir,
|
||||
) -> Result<(), anyhow::Error> {
|
||||
// Prompt user for third-party source
|
||||
if fetcher.is_third_party() {
|
||||
warn!(
|
||||
|
@ -293,3 +317,43 @@ async fn main() -> Result<(), anyhow::Error> {
|
|||
info!("Installation complete!");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn install_from_source(opts: Options, package: Package<Meta>) -> Result<(), anyhow::Error> {
|
||||
// Prompt user for source install
|
||||
warn!("The package will be installed from source (with cargo)",);
|
||||
if !opts.no_confirm && !opts.dry_run && !confirm()? {
|
||||
warn!("Installation cancelled");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if opts.dry_run {
|
||||
info!(
|
||||
"Dry-run: running `cargo install {} --version {} --target {}`",
|
||||
package.name, package.version, opts.target
|
||||
);
|
||||
Ok(())
|
||||
} else {
|
||||
debug!(
|
||||
"Running `cargo install {} --version {} --target {}`",
|
||||
package.name, package.version, opts.target
|
||||
);
|
||||
let mut child = Command::new("cargo")
|
||||
.arg("install")
|
||||
.arg(package.name)
|
||||
.arg("--version")
|
||||
.arg(package.version)
|
||||
.arg("--target")
|
||||
.arg(opts.target)
|
||||
.spawn()?;
|
||||
debug!("Spawned command pid={:?}", child.id());
|
||||
|
||||
let status = child.wait().await?;
|
||||
if status.success() {
|
||||
info!("Cargo finished successfully");
|
||||
Ok(())
|
||||
} else {
|
||||
error!("Cargo errored! {:?}", status);
|
||||
Err(anyhow::anyhow!("Cargo install error"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue