mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-22 13:38:43 +00:00

* Avoid potential panicking in `args::parse` by using `Vec::get` instead of indexing * Refactor: Simplify `opts::{resolve, install}` API Many parameters can be shared and put into `opts::Options` intead and that would also avoid a few `Arc<Path>`. * Optimize `get_install_path`: Avoid cloning `install_path` * Optimize `LazyJobserverClient`: Un`Arc` & remove `Clone` impl to avoid additional boxing * Optimize `find_version`: Avoid cloning `semver::Version` * Optimize `GhCrateMeta::launch_baseline_find_tasks` return `impl Iterator<Item = impl Future<Output = ...>>` instead of `impl Iterator<Item = AutoAbortJoinHandle<...>>` to avoid unnecessary spawning. Each task spawned has to be boxed and then polled by tokio runtime. They might also be moved. While they increase parallelism, spawning these futures does not justify the costs because: - Each `Future` only calls `remote_exists` - Each `remote_exists` call send requests to the same domain, which is likely to share the same http2 connection. Since the conn is shared anyway, spawning does not speedup anything but merely add communication overhead. - Plus the tokio runtime spawning cost * Optimize `install_crates`: Destruct `Args` before any `.await` point to reduce size of the future * Refactor `logging`: Replace param `arg` with `log_level` & `json_output` to avoid dep on `Args` * Add dep strum & strum_macros to crates/bin * Derive `strum_macros::EnumCount` for `Strategy` * Optimize strategies parsing in `install_crates` * Fix panic in `install_crates` when `Compile` is not the last strategy specified * Optimize: Take `Vec<Self>` instead of slice in `CrateName::dedup` * Refactor: Extract new fn `compute_resolvers` * Refactor: Extract new fn `compute_paths_and_load_manifests` * Refactor: Extract new fn `filter_out_installed_crates` * Reorder `install_crates`: Only run target detection if args are valid and there are some crates to be installed. * Optimize `filter_out_installed_crates`: Avoid allocation by returning an `Iterator` * Fix user_agent of `remote::Client`: Let user specify it * Refactor: Replace `UIThread` with `ui::confirm` which is much simpler. Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
use std::{
|
|
env::var_os,
|
|
path::{Path, PathBuf},
|
|
};
|
|
|
|
use binstalk::home::cargo_home;
|
|
use tracing::debug;
|
|
|
|
pub fn get_cargo_roots_path(cargo_roots: Option<PathBuf>) -> Option<PathBuf> {
|
|
if let Some(p) = cargo_roots {
|
|
return Some(p);
|
|
}
|
|
|
|
// Environmental variables
|
|
if let Some(p) = var_os("CARGO_INSTALL_ROOT") {
|
|
let p = PathBuf::from(p);
|
|
debug!("using CARGO_INSTALL_ROOT ({})", p.display());
|
|
return Some(p);
|
|
}
|
|
|
|
if let Ok(p) = cargo_home() {
|
|
debug!("using ({}) as cargo home", p.display());
|
|
Some(p)
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
/// Fetch install path from environment
|
|
/// roughly follows <https://doc.rust-lang.org/cargo/commands/cargo-install.html#description>
|
|
///
|
|
/// Return (install_path, is_custom_install_path)
|
|
pub fn get_install_path(
|
|
install_path: Option<PathBuf>,
|
|
cargo_roots: Option<impl AsRef<Path>>,
|
|
) -> (Option<PathBuf>, bool) {
|
|
// Command line override first first
|
|
if let Some(p) = install_path {
|
|
return (Some(p), true);
|
|
}
|
|
|
|
// Then cargo_roots
|
|
if let Some(p) = cargo_roots {
|
|
return (Some(p.as_ref().join("bin")), false);
|
|
}
|
|
|
|
// Local executable dir if no cargo is found
|
|
let dir = dirs::executable_dir();
|
|
|
|
if let Some(d) = &dir {
|
|
debug!("Fallback to {}", d.display());
|
|
}
|
|
|
|
(dir, true)
|
|
}
|