From 53b9bba1cefbe3831eb97b8a6ded9ad1ba00714a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:03:35 +0000 Subject: [PATCH 1/3] Initial plan From d03734abca8b5d69f0a8c944be0abdd096be3904 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:25:02 +0000 Subject: [PATCH 2/3] fix(upgrade): apply before-date filter to dry-run output Pass ResolveOptions with before_date to list_outdated_versions so the dry-run output matches what would actually be installed. Previously, dry-run showed the unfiltered latest version while the actual upgrade would apply the before-date filter. Co-authored-by: jdx <216188+jdx@users.noreply.github.com> --- src/cli/outdated.rs | 6 +++-- src/cli/upgrade.rs | 7 +++++- src/plugins/core/rust.rs | 5 ++-- src/toolset/mod.rs | 48 +++++++++++++++++++----------------- src/toolset/outdated_info.rs | 15 ++++++++--- src/toolset/tool_version.rs | 11 ++++++++- 6 files changed, 60 insertions(+), 32 deletions(-) diff --git a/src/cli/outdated.rs b/src/cli/outdated.rs index 7f37da9454..2940c11e8d 100644 --- a/src/cli/outdated.rs +++ b/src/cli/outdated.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use crate::cli::args::ToolArg; use crate::config::Config; -use crate::toolset::ToolsetBuilder; +use crate::toolset::{ResolveOptions, ToolsetBuilder}; use crate::toolset::outdated_info::OutdatedInfo; use crate::ui::table; use eyre::Result; @@ -54,7 +54,9 @@ impl Outdated { .collect::>(); ts.versions .retain(|_, tvl| tool_set.is_empty() || tool_set.contains(&tvl.backend)); - let outdated = ts.list_outdated_versions(&config, self.bump).await; + let outdated = ts + .list_outdated_versions(&config, self.bump, &ResolveOptions::default()) + .await; self.display(outdated).await?; Ok(()) } diff --git a/src/cli/upgrade.rs b/src/cli/upgrade.rs index 87090e53c3..db5be4e0b0 100644 --- a/src/cli/upgrade.rs +++ b/src/cli/upgrade.rs @@ -77,7 +77,12 @@ impl Upgrade { .with_args(&self.tool) .build(&config) .await?; - let mut outdated = ts.list_outdated_versions(&config, self.bump).await; + let opts = ResolveOptions { + use_locked_version: false, + latest_versions: true, + before_date: self.get_before_date()?, + }; + let mut outdated = ts.list_outdated_versions(&config, self.bump, &opts).await; if self.interactive && !outdated.is_empty() { outdated = self.get_interactive_tool_set(&outdated)?; } else if !self.tool.is_empty() { diff --git a/src/plugins/core/rust.rs b/src/plugins/core/rust.rs index 80f4e6d922..befed2ec65 100644 --- a/src/plugins/core/rust.rs +++ b/src/plugins/core/rust.rs @@ -11,7 +11,7 @@ use crate::http::HTTP; use crate::install_context::InstallContext; use crate::toolset::ToolSource::IdiomaticVersionFile; use crate::toolset::outdated_info::OutdatedInfo; -use crate::toolset::{ToolVersion, Toolset}; +use crate::toolset::{ResolveOptions, ToolVersion, Toolset}; use crate::ui::progress_report::SingleReport; use crate::{dirs, env, file, github, plugins}; use async_trait::async_trait; @@ -196,7 +196,8 @@ impl Backend for RustPlugin { ) -> Result> { let v_re = regex!(r#"Update available : (.*) -> (.*)"#); if regex!(r"(\d+)\.(\d+)\.(\d+)").is_match(&tv.version) { - let oi = OutdatedInfo::resolve(config, tv.clone(), bump).await?; + let oi = OutdatedInfo::resolve(config, tv.clone(), bump, &ResolveOptions::default()) + .await?; Ok(oi) } else { let ts = config.get_toolset().await?; diff --git a/src/toolset/mod.rs b/src/toolset/mod.rs index fb5d219cbf..6e5f61c655 100644 --- a/src/toolset/mod.rs +++ b/src/toolset/mod.rs @@ -633,37 +633,41 @@ impl Toolset { &self, config: &Arc, bump: bool, + opts: &ResolveOptions, ) -> Vec { let versions = self .list_current_versions() .into_iter() // Respect per-tool os constraints set via options.os .filter(|(_, tv)| tv.request.is_os_supported()) - .map(|(t, tv)| (config.clone(), t, tv, bump)) + .map(|(t, tv)| (config.clone(), t, tv, bump, opts.clone())) .collect::>(); - let outdated = parallel::parallel(versions, |(config, t, tv, bump)| async move { - let mut outdated = vec![]; - match t.outdated_info(&config, &tv, bump).await { - Ok(Some(oi)) => outdated.push(oi), - Ok(None) => {} - Err(e) => { - warn!("Error getting outdated info for {tv}: {e:#}"); + let outdated = parallel::parallel( + versions, + |(config, t, tv, bump, opts)| async move { + let mut outdated = vec![]; + match t.outdated_info(&config, &tv, bump).await { + Ok(Some(oi)) => outdated.push(oi), + Ok(None) => {} + Err(e) => { + warn!("Error getting outdated info for {tv}: {e:#}"); + } } - } - if t.symlink_path(&tv).is_some() { - trace!("skipping symlinked version {tv}"); - // do not consider symlinked versions to be outdated - return Ok(outdated); - } - match OutdatedInfo::resolve(&config, tv.clone(), bump).await { - Ok(Some(oi)) => outdated.push(oi), - Ok(None) => {} - Err(e) => { - warn!("Error creating OutdatedInfo for {tv}: {e:#}"); + if t.symlink_path(&tv).is_some() { + trace!("skipping symlinked version {tv}"); + // do not consider symlinked versions to be outdated + return Ok(outdated); } - } - Ok(outdated) - }) + match OutdatedInfo::resolve(&config, tv.clone(), bump, &opts).await { + Ok(Some(oi)) => outdated.push(oi), + Ok(None) => {} + Err(e) => { + warn!("Error creating OutdatedInfo for {tv}: {e:#}"); + } + } + Ok(outdated) + }, + ) .await .unwrap_or_else(|e| { warn!("Error in parallel outdated version check: {e:#}"); diff --git a/src/toolset/outdated_info.rs b/src/toolset/outdated_info.rs index 0a65397acf..6e930d4fbf 100644 --- a/src/toolset/outdated_info.rs +++ b/src/toolset/outdated_info.rs @@ -1,6 +1,6 @@ use crate::semver::{chunkify_version, split_version_prefix}; use crate::toolset; -use crate::toolset::{ToolRequest, ToolSource, ToolVersion}; +use crate::toolset::{ResolveOptions, ToolRequest, ToolSource, ToolVersion}; use crate::{Result, config::Config}; use serde_derive::Serialize; use std::{ @@ -53,15 +53,22 @@ impl OutdatedInfo { config: &Arc, tv: ToolVersion, bump: bool, + opts: &ResolveOptions, ) -> eyre::Result> { let t = tv.backend()?; // prefix is something like "temurin-" or "corretto-" let (prefix, _) = split_version_prefix(&tv.request.version()); let latest_result = if bump { - t.latest_version(config, Some(prefix.clone()).filter(|s| !s.is_empty())) - .await + t.latest_version_with_opts( + config, + Some(prefix.clone()).filter(|s| !s.is_empty()), + opts.before_date, + ) + .await } else { - tv.latest_version(config).await.map(Option::from) + tv.latest_version_with_opts(config, opts) + .await + .map(Option::from) }; let latest = match latest_result { Ok(Some(latest)) => latest, diff --git a/src/toolset/tool_version.rs b/src/toolset/tool_version.rs index eec7c925db..16c5bb890e 100644 --- a/src/toolset/tool_version.rs +++ b/src/toolset/tool_version.rs @@ -128,10 +128,19 @@ impl ToolVersion { self.request.ba().downloads_path.join(self.tv_pathname()) } pub async fn latest_version(&self, config: &Arc) -> Result { + self.latest_version_with_opts(config, &ResolveOptions::default()) + .await + } + + pub async fn latest_version_with_opts( + &self, + config: &Arc, + base_opts: &ResolveOptions, + ) -> Result { let opts = ResolveOptions { latest_versions: true, use_locked_version: false, - ..Default::default() + before_date: base_opts.before_date, }; let tv = self.request.resolve(config, &opts).await?; // map cargo backend specific prefixes to ref From ad374edce68fb8a3751b4bf2b673fb0cf0093124 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:31:22 +0000 Subject: [PATCH 3/3] docs: add clarifying comments for ResolveOptions usage Add comments explaining why only before_date is preserved from base_opts and clarifying the parameter differences between Backend and ToolVersion methods. Co-authored-by: jdx <216188+jdx@users.noreply.github.com> --- mise.toml | 37 ------------------------------------ src/toolset/outdated_info.rs | 2 ++ src/toolset/tool_version.rs | 2 ++ 3 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 mise.toml diff --git a/mise.toml b/mise.toml deleted file mode 100644 index e480e13521..0000000000 --- a/mise.toml +++ /dev/null @@ -1,37 +0,0 @@ -#:schema ./schema/mise.json -min_version = "2024.1.1" - -[env] -_.path = ["./target/debug", "./node_modules/.bin"] - -[tools] -"actionlint" = "latest" -age = "latest" -bun = "latest" -cargo-binstall = "latest" -"cargo:cargo-edit" = "latest" -"cargo:cargo-insta" = "latest" -"cargo:cargo-release" = "latest" -"cargo:git-cliff" = "latest" -"cargo:toml-cli" = "latest" -"cargo:usage-cli" = { version = "latest", os = ["linux", "macos"] } -gh = "latest" -hk = "latest" -jq = "latest" -fd = "latest" -"npm:markdownlint-cli" = "latest" -"npm:prettier" = "3" -"npm:ajv-cli" = "latest" -pkl = "latest" -pre-commit = "latest" -#"python" = { version = "latest", virtualenv = "{{env.HOME}}/.cache/venv" } -"ripgrep" = "latest" -"shellcheck" = "latest" -"shfmt" = "latest" -taplo = "latest" -wait-for-gh-rate-limit = "latest" -sops = "latest" -node = "24" - -[task_config] -includes = ["tasks.toml", "xtasks"] diff --git a/src/toolset/outdated_info.rs b/src/toolset/outdated_info.rs index 6e930d4fbf..104ed4e3a2 100644 --- a/src/toolset/outdated_info.rs +++ b/src/toolset/outdated_info.rs @@ -59,6 +59,8 @@ impl OutdatedInfo { // prefix is something like "temurin-" or "corretto-" let (prefix, _) = split_version_prefix(&tv.request.version()); let latest_result = if bump { + // Note: Backend's latest_version_with_opts takes individual parameters, + // not a ResolveOptions struct like ToolVersion's method t.latest_version_with_opts( config, Some(prefix.clone()).filter(|s| !s.is_empty()), diff --git a/src/toolset/tool_version.rs b/src/toolset/tool_version.rs index 16c5bb890e..cc6c1dbc7c 100644 --- a/src/toolset/tool_version.rs +++ b/src/toolset/tool_version.rs @@ -137,6 +137,8 @@ impl ToolVersion { config: &Arc, base_opts: &ResolveOptions, ) -> Result { + // Note: We always use latest_versions=true and use_locked_version=false for latest version lookup, + // but we preserve before_date from base_opts to respect date-based filtering let opts = ResolveOptions { latest_versions: true, use_locked_version: false,