Ignore if package already up-to-date

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-08-08 19:18:30 +10:00
parent b69d7e7c06
commit a271e695a5
No known key found for this signature in database
GPG key ID: 591C0B03040416D6
3 changed files with 40 additions and 18 deletions

View file

@ -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,

View file

@ -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

View file

@ -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 {
Some((crate_name, Some(metadata.current_version.clone())))
}
} else {
info!("package {crate_name} is already installed, use --force to override");
None
}
} else { } else {
!records.contains(&crate_name.name) Some((crate_name, None))
};
if !keep {
info!("package {crate_name} is already installed, use --force to override")
} }
keep
} else { } else {
true 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,