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,
) -> Result<Option<MetaData>> {
match resolution {
Resolution::AlreadyUpToDate => Ok(None),
Resolution::Fetch {
fetcher,
package,

View file

@ -8,7 +8,7 @@ use compact_str::{CompactString, ToCompactString};
use log::{debug, error, info, warn};
use miette::{miette, Result};
use reqwest::Client;
use semver::VersionReq;
use semver::{Version, VersionReq};
use super::Options;
use crate::{
@ -29,6 +29,7 @@ pub enum Resolution {
InstallFromSource {
package: Package<Meta>,
},
AlreadyUpToDate,
}
impl Resolution {
fn print(&self, opts: &Options) {
@ -70,6 +71,7 @@ impl Resolution {
Resolution::InstallFromSource { .. } => {
warn!("The package will be installed from source (with cargo)",)
}
Resolution::AlreadyUpToDate => (),
}
}
}
@ -77,6 +79,7 @@ impl Resolution {
pub async fn resolve(
opts: Arc<Options>,
crate_name: CrateName,
curr_version: Option<Version>,
temp_dir: Arc<Path>,
install_path: Arc<Path>,
client: Client,
@ -109,6 +112,19 @@ pub async fn resolve(
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) = (
package
.metadata

View file

@ -354,26 +354,29 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
})?;
// 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 {
true
Some((crate_name, None))
} else if let Some(records) = &metadata {
let keep = if let Some(version_req) = &crate_name.version_req {
records
.get(&crate_name.name)
.map(|metadata| !version_req.is_latest_compatible(&metadata.current_version))
.unwrap_or(true)
if let Some(metadata) = records.get(&crate_name.name) {
if let Some(version_req) = &crate_name.version_req {
if version_req.is_latest_compatible(&metadata.current_version) {
info!(
"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 {
!records.contains(&crate_name.name)
};
if !keep {
info!("package {crate_name} is already installed, use --force to override")
Some((crate_name, None))
}
keep
} else {
true
Some((crate_name, None))
}
});
@ -395,10 +398,11 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
// Resolve crates
let tasks: Vec<_> = crate_names
.into_iter()
.map(|crate_name| {
.map(|(crate_name, current_version)| {
AutoAbortJoinHandle::spawn(binstall::resolve(
binstall_opts.clone(),
crate_name,
current_version,
temp_dir_path.clone(),
install_path.clone(),
client.clone(),
@ -430,7 +434,7 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
// Resolve crates and install without confirmation
crate_names
.into_iter()
.map(|crate_name| {
.map(|(crate_name, current_version)| {
let opts = binstall_opts.clone();
let temp_dir_path = temp_dir_path.clone();
let jobserver_client = jobserver_client.clone();
@ -442,6 +446,7 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
let resolution = binstall::resolve(
opts.clone(),
crate_name,
current_version,
temp_dir_path,
install_path,
client,