mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-21 13:08:42 +00:00
Refactor: Extract find_version
into mod
Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
5d79af545b
commit
c916814e7e
2 changed files with 50 additions and 43 deletions
|
@ -1,11 +1,9 @@
|
||||||
use std::collections::BTreeSet;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use cargo_toml::Manifest;
|
use cargo_toml::Manifest;
|
||||||
use crates_io_api::AsyncClient;
|
use crates_io_api::AsyncClient;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use semver::{Version, VersionReq};
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
use crate::{helpers::*, BinstallError, Meta, TarBasedFmt};
|
use crate::{helpers::*, BinstallError, Meta, TarBasedFmt};
|
||||||
|
@ -15,47 +13,8 @@ mod vfs;
|
||||||
mod visitor;
|
mod visitor;
|
||||||
use visitor::ManifestVisitor;
|
use visitor::ManifestVisitor;
|
||||||
|
|
||||||
fn find_version<'a, V: Iterator<Item = &'a String>>(
|
mod version;
|
||||||
requirement: &str,
|
use version::find_version;
|
||||||
version_iter: V,
|
|
||||||
) -> Result<Version, BinstallError> {
|
|
||||||
// Parse version requirement
|
|
||||||
let version_req = VersionReq::parse(requirement).map_err(|err| BinstallError::VersionReq {
|
|
||||||
req: requirement.into(),
|
|
||||||
err,
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Filter for matching versions
|
|
||||||
let filtered: BTreeSet<_> = version_iter
|
|
||||||
.filter_map(|v| {
|
|
||||||
// Remove leading `v` for git tags
|
|
||||||
let ver_str = match v.strip_prefix('s') {
|
|
||||||
Some(v) => v,
|
|
||||||
None => v,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parse out version
|
|
||||||
let ver = Version::parse(ver_str).ok()?;
|
|
||||||
debug!("Version: {:?}", ver);
|
|
||||||
|
|
||||||
// Filter by version match
|
|
||||||
if version_req.matches(&ver) {
|
|
||||||
Some(ver)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
debug!("Filtered: {:?}", filtered);
|
|
||||||
|
|
||||||
// Return highest version
|
|
||||||
filtered
|
|
||||||
.iter()
|
|
||||||
.max()
|
|
||||||
.cloned()
|
|
||||||
.ok_or(BinstallError::VersionMismatch { req: version_req })
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Fetch a crate Cargo.toml by name and version from crates.io
|
/// Fetch a crate Cargo.toml by name and version from crates.io
|
||||||
pub async fn fetch_crate_cratesio(
|
pub async fn fetch_crate_cratesio(
|
||||||
|
|
48
src/drivers/version.rs
Normal file
48
src/drivers/version.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
use std::collections::BTreeSet;
|
||||||
|
|
||||||
|
use log::debug;
|
||||||
|
use semver::{Version, VersionReq};
|
||||||
|
|
||||||
|
use crate::BinstallError;
|
||||||
|
|
||||||
|
pub(super) fn find_version<'a, V: Iterator<Item = &'a String>>(
|
||||||
|
requirement: &str,
|
||||||
|
version_iter: V,
|
||||||
|
) -> Result<Version, BinstallError> {
|
||||||
|
// Parse version requirement
|
||||||
|
let version_req = VersionReq::parse(requirement).map_err(|err| BinstallError::VersionReq {
|
||||||
|
req: requirement.into(),
|
||||||
|
err,
|
||||||
|
})?;
|
||||||
|
|
||||||
|
// Filter for matching versions
|
||||||
|
let filtered: BTreeSet<_> = version_iter
|
||||||
|
.filter_map(|v| {
|
||||||
|
// Remove leading `v` for git tags
|
||||||
|
let ver_str = match v.strip_prefix('s') {
|
||||||
|
Some(v) => v,
|
||||||
|
None => v,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parse out version
|
||||||
|
let ver = Version::parse(ver_str).ok()?;
|
||||||
|
debug!("Version: {:?}", ver);
|
||||||
|
|
||||||
|
// Filter by version match
|
||||||
|
if version_req.matches(&ver) {
|
||||||
|
Some(ver)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
debug!("Filtered: {:?}", filtered);
|
||||||
|
|
||||||
|
// Return highest version
|
||||||
|
filtered
|
||||||
|
.iter()
|
||||||
|
.max()
|
||||||
|
.cloned()
|
||||||
|
.ok_or(BinstallError::VersionMismatch { req: version_req })
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue