Skip to content

Commit

Permalink
fix: handle sub-0.1 in new resolving logic
Browse files Browse the repository at this point in the history
Fixes #2112
Fixes #600
  • Loading branch information
jdx committed May 14, 2024
1 parent eeecfc1 commit fd943a1
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 60 deletions.
20 changes: 9 additions & 11 deletions src/toolset/tool_request_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ impl ToolRequestSet {
Self::default()
}

pub fn tools_with_sources(&self) -> Vec<(&ForgeArg, &Vec<ToolRequest>, &ToolSource)> {
self.tools
.iter()
.map(|(forge, tvr)| (forge, tvr, self.sources.get(forge).unwrap()))
.collect()
}
// pub fn tools_with_sources(&self) -> Vec<(&ForgeArg, &Vec<ToolRequest>, &ToolSource)> {
// self.tools
// .iter()
// .map(|(forge, tvr)| (forge, tvr, self.sources.get(forge).unwrap()))
// .collect()
// }

// pub fn installed_tools(&self) -> eyre::Result<Vec<&ToolRequest>> {
// self.tools
Expand Down Expand Up @@ -57,10 +57,8 @@ impl ToolRequestSet {

impl Display for ToolRequestSet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for (forge, versions, source) in self.tools_with_sources() {
writeln!(f, "ToolRequestSet: {} ({:?})", forge, source)?;
writeln!(f, " {}", versions.iter().join(" "))?;
}
let versions = self.tools.values().flatten().join(" ");
writeln!(f, "ToolRequestSet: {}", versions)?;
Ok(())
}
}
Expand Down Expand Up @@ -122,7 +120,7 @@ impl ToolRequestSetBuilder {
}
}

debug!("ToolRequestSet ({:?}): {trs}", start_ms.elapsed());
debug!("ToolRequestSet.build({:?}): {trs}", start_ms.elapsed());
Ok(trs)
}

Expand Down
32 changes: 2 additions & 30 deletions src/toolset/tool_version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@ use std::path::PathBuf;

use console::style;
use eyre::Result;
use versions::{Chunk, Version};

use crate::cli::args::ForgeArg;
use crate::config::Config;
use crate::forge;
use crate::forge::{AForge, Forge};
use crate::hash::hash_to_str;
use crate::toolset::{ToolVersionOptions, ToolVersionRequest};
use crate::toolset::{tool_version_request, ToolVersionOptions, ToolVersionRequest};

/// represents a single version of a tool for a particular plugin
#[derive(Debug, Clone)]
Expand Down Expand Up @@ -192,7 +191,7 @@ impl ToolVersion {
"latest" => tool.latest_version(None)?.unwrap(),
_ => Config::get().resolve_alias(tool, v)?,
};
let v = version_sub(&v, sub);
let v = tool_version_request::version_sub(&v, sub);
Self::resolve_version(tool, request, latest_versions, &v)
}

Expand Down Expand Up @@ -259,30 +258,3 @@ impl Hash for ToolVersion {
self.version.hash(state);
}
}

/// subtracts sub from orig and removes suffix
/// e.g. version_sub("18.2.3", "2") -> "16"
/// e.g. version_sub("18.2.3", "0.1") -> "18.1"
fn version_sub(orig: &str, sub: &str) -> String {
let mut orig = Version::new(orig).unwrap();
let sub = Version::new(sub).unwrap();
while orig.chunks.0.len() > sub.chunks.0.len() {
orig.chunks.0.pop();
}
for (i, orig_chunk) in orig.clone().chunks.0.iter().enumerate() {
let m = sub.nth(i).unwrap();
orig.chunks.0[i] = Chunk::Numeric(orig_chunk.single_digit().unwrap() - m);
}
orig.to_string()
}

#[cfg(test)]
mod tests {
use super::version_sub;

#[test]
fn test_version_sub() {
assert_str_eq!(version_sub("18.2.3", "2"), "16");
assert_str_eq!(version_sub("18.2.3", "0.1"), "18.1");
}
}
61 changes: 42 additions & 19 deletions src/toolset/tool_version_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,11 @@ impl ToolVersionRequest {
forge,
sub,
orig_version,
} => Some(
forge
.installs_path
.join(Self::version_sub(orig_version, sub.as_str())),
),
} => self
.local_resolve(orig_version)
.inspect_err(|e| warn!("ToolRequest.local_resolve: {e:#}"))
.unwrap_or_default()
.map(|v| forge.installs_path.join(version_sub(&v, sub.as_str()))),
Self::Prefix { forge, prefix, .. } => match file::ls(&forge.installs_path) {
Ok(installs) => {
let path = installs.iter().find(|p| p.starts_with(prefix));
Expand All @@ -154,29 +154,52 @@ impl ToolVersionRequest {
}
}

pub fn local_resolve(&self, v: &str) -> eyre::Result<Option<String>> {
let forge = forge::get(self.forge());
let matches = forge.list_installed_versions_matching(v)?;
if matches.iter().any(|m| m == v) {
return Ok(Some(v.to_string()));
}
if let Some(v) = matches.last() {
return Ok(Some(v.to_string()));
}
Ok(None)
}

pub fn resolve(&self, plugin: &dyn Forge, latest_versions: bool) -> Result<ToolVersion> {
ToolVersion::resolve(plugin, self.clone(), latest_versions)
}
}

/// subtracts sub from orig and removes suffix
/// e.g. version_sub("18.2.3", "2") -> "16"
/// e.g. version_sub("18.2.3", "0.1") -> "18.1"
fn version_sub(orig: &str, sub: &str) -> String {
let mut orig = Version::new(orig).unwrap();
let sub = Version::new(sub).unwrap();
while orig.chunks.0.len() > sub.chunks.0.len() {
orig.chunks.0.pop();
}
for (i, orig_chunk) in orig.clone().chunks.0.iter().enumerate() {
let m = sub.nth(i).unwrap();
orig.chunks.0[i] = Chunk::Numeric(orig_chunk.single_digit().unwrap() - m);
}
orig.to_string()
/// subtracts sub from orig and removes suffix
/// e.g. version_sub("18.2.3", "2") -> "16"
/// e.g. version_sub("18.2.3", "0.1") -> "18.1"
pub fn version_sub(orig: &str, sub: &str) -> String {
let mut orig = Version::new(orig).unwrap();
let sub = Version::new(sub).unwrap();
while orig.chunks.0.len() > sub.chunks.0.len() {
orig.chunks.0.pop();
}
for (i, orig_chunk) in orig.clone().chunks.0.iter().enumerate() {
let m = sub.nth(i).unwrap();
orig.chunks.0[i] = Chunk::Numeric(orig_chunk.single_digit().unwrap() - m);
}
orig.to_string()
}

impl Display for ToolVersionRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(f, "{}@{}", &self.forge(), self.version())
}
}

#[cfg(test)]
mod tests {
use super::version_sub;

#[test]
fn test_version_sub() {
assert_str_eq!(version_sub("18.2.3", "2"), "16");
assert_str_eq!(version_sub("18.2.3", "0.1"), "18.1");
}
}

0 comments on commit fd943a1

Please sign in to comment.