mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-05-05 03:30:03 +00:00
Ignore if package already up-to-date
Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
b69d7e7c06
commit
a271e695a5
3 changed files with 40 additions and 18 deletions
|
@ -15,6 +15,7 @@ pub async fn install(
|
||||||
jobserver_client: LazyJobserverClient,
|
jobserver_client: LazyJobserverClient,
|
||||||
) -> Result<Option<MetaData>> {
|
) -> Result<Option<MetaData>> {
|
||||||
match resolution {
|
match resolution {
|
||||||
|
Resolution::AlreadyUpToDate => Ok(None),
|
||||||
Resolution::Fetch {
|
Resolution::Fetch {
|
||||||
fetcher,
|
fetcher,
|
||||||
package,
|
package,
|
||||||
|
|
|
@ -8,7 +8,7 @@ use compact_str::{CompactString, ToCompactString};
|
||||||
use log::{debug, error, info, warn};
|
use log::{debug, error, info, warn};
|
||||||
use miette::{miette, Result};
|
use miette::{miette, Result};
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use semver::VersionReq;
|
use semver::{Version, VersionReq};
|
||||||
|
|
||||||
use super::Options;
|
use super::Options;
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -29,6 +29,7 @@ pub enum Resolution {
|
||||||
InstallFromSource {
|
InstallFromSource {
|
||||||
package: Package<Meta>,
|
package: Package<Meta>,
|
||||||
},
|
},
|
||||||
|
AlreadyUpToDate,
|
||||||
}
|
}
|
||||||
impl Resolution {
|
impl Resolution {
|
||||||
fn print(&self, opts: &Options) {
|
fn print(&self, opts: &Options) {
|
||||||
|
@ -70,6 +71,7 @@ impl Resolution {
|
||||||
Resolution::InstallFromSource { .. } => {
|
Resolution::InstallFromSource { .. } => {
|
||||||
warn!("The package will be installed from source (with cargo)",)
|
warn!("The package will be installed from source (with cargo)",)
|
||||||
}
|
}
|
||||||
|
Resolution::AlreadyUpToDate => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,6 +79,7 @@ impl Resolution {
|
||||||
pub async fn resolve(
|
pub async fn resolve(
|
||||||
opts: Arc<Options>,
|
opts: Arc<Options>,
|
||||||
crate_name: CrateName,
|
crate_name: CrateName,
|
||||||
|
curr_version: Option<Version>,
|
||||||
temp_dir: Arc<Path>,
|
temp_dir: Arc<Path>,
|
||||||
install_path: Arc<Path>,
|
install_path: Arc<Path>,
|
||||||
client: Client,
|
client: Client,
|
||||||
|
@ -109,6 +112,19 @@ pub async fn resolve(
|
||||||
|
|
||||||
let package = manifest.package.unwrap();
|
let package = manifest.package.unwrap();
|
||||||
|
|
||||||
|
if let Some(curr_version) = curr_version {
|
||||||
|
let new_version =
|
||||||
|
Version::parse(&package.version).map_err(|err| BinstallError::VersionParse {
|
||||||
|
v: package.version.clone(),
|
||||||
|
err,
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if new_version == curr_version {
|
||||||
|
info!("package {crate_name} is already up to date {curr_version}");
|
||||||
|
return Ok(Resolution::AlreadyUpToDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let (mut meta, binaries) = (
|
let (mut meta, binaries) = (
|
||||||
package
|
package
|
||||||
.metadata
|
.metadata
|
||||||
|
|
39
src/main.rs
39
src/main.rs
|
@ -354,26 +354,29 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Remove installed crates
|
// Remove installed crates
|
||||||
let crate_names = CrateName::dedup(crate_names).filter(|crate_name| {
|
let crate_names = CrateName::dedup(crate_names).filter_map(|crate_name| {
|
||||||
if opts.force {
|
if opts.force {
|
||||||
true
|
Some((crate_name, None))
|
||||||
} else if let Some(records) = &metadata {
|
} else if let Some(records) = &metadata {
|
||||||
let keep = if let Some(version_req) = &crate_name.version_req {
|
if let Some(metadata) = records.get(&crate_name.name) {
|
||||||
records
|
if let Some(version_req) = &crate_name.version_req {
|
||||||
.get(&crate_name.name)
|
if version_req.is_latest_compatible(&metadata.current_version) {
|
||||||
.map(|metadata| !version_req.is_latest_compatible(&metadata.current_version))
|
info!(
|
||||||
.unwrap_or(true)
|
"package {crate_name} is already installed and cannot be upgraded, use --force to override"
|
||||||
|
);
|
||||||
|
None
|
||||||
} else {
|
} else {
|
||||||
!records.contains(&crate_name.name)
|
Some((crate_name, Some(metadata.current_version.clone())))
|
||||||
};
|
|
||||||
|
|
||||||
if !keep {
|
|
||||||
info!("package {crate_name} is already installed, use --force to override")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
keep
|
|
||||||
} else {
|
} else {
|
||||||
true
|
info!("package {crate_name} is already installed, use --force to override");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Some((crate_name, None))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Some((crate_name, None))
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -395,10 +398,11 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
||||||
// Resolve crates
|
// Resolve crates
|
||||||
let tasks: Vec<_> = crate_names
|
let tasks: Vec<_> = crate_names
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|crate_name| {
|
.map(|(crate_name, current_version)| {
|
||||||
AutoAbortJoinHandle::spawn(binstall::resolve(
|
AutoAbortJoinHandle::spawn(binstall::resolve(
|
||||||
binstall_opts.clone(),
|
binstall_opts.clone(),
|
||||||
crate_name,
|
crate_name,
|
||||||
|
current_version,
|
||||||
temp_dir_path.clone(),
|
temp_dir_path.clone(),
|
||||||
install_path.clone(),
|
install_path.clone(),
|
||||||
client.clone(),
|
client.clone(),
|
||||||
|
@ -430,7 +434,7 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
||||||
// Resolve crates and install without confirmation
|
// Resolve crates and install without confirmation
|
||||||
crate_names
|
crate_names
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|crate_name| {
|
.map(|(crate_name, current_version)| {
|
||||||
let opts = binstall_opts.clone();
|
let opts = binstall_opts.clone();
|
||||||
let temp_dir_path = temp_dir_path.clone();
|
let temp_dir_path = temp_dir_path.clone();
|
||||||
let jobserver_client = jobserver_client.clone();
|
let jobserver_client = jobserver_client.clone();
|
||||||
|
@ -442,6 +446,7 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
||||||
let resolution = binstall::resolve(
|
let resolution = binstall::resolve(
|
||||||
opts.clone(),
|
opts.clone(),
|
||||||
crate_name,
|
crate_name,
|
||||||
|
current_version,
|
||||||
temp_dir_path,
|
temp_dir_path,
|
||||||
install_path,
|
install_path,
|
||||||
client,
|
client,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue