From 424dd861359e2b07d071941c09784ae5337b8dbb Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Mon, 1 Jun 2026 03:09:40 +1000 Subject: [PATCH 1/2] fix(dotnet): include runtime in lock identity --- src/plugins/core/dotnet.rs | 53 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/plugins/core/dotnet.rs b/src/plugins/core/dotnet.rs index 2f9a1d7611..685fea2fe5 100644 --- a/src/plugins/core/dotnet.rs +++ b/src/plugins/core/dotnet.rs @@ -8,15 +8,15 @@ use serde::Deserialize; use versions::Versioning; use crate::backend::Backend; -use crate::backend::VersionInfo; use crate::backend::options::BackendOptions; +use crate::backend::{VersionInfo, platform_target::PlatformTarget}; use crate::cli::args::BackendArg; use crate::cmd::CmdLineRunner; use crate::config::{Config, Settings}; use crate::http::{HTTP, HTTP_FETCH}; use crate::install_context::InstallContext; use crate::parallel; -use crate::toolset::{ToolVersion, ToolVersionOptions, Toolset}; +use crate::toolset::{ToolRequest, ToolVersion, ToolVersionOptions, Toolset}; use crate::ui::progress_report::SingleReport; use crate::{dirs, env, file, plugins}; @@ -44,6 +44,14 @@ impl<'a> DotnetOptions<'a> { fn runtime_framework_name(&self) -> Option<&'static str> { self.runtime().and_then(runtime_framework_name) } + + fn lockfile_options(&self) -> BTreeMap { + let mut opts = BTreeMap::new(); + if let Some(runtime) = self.runtime() { + opts.insert("runtime".to_string(), runtime.to_string()); + } + opts + } } impl DotnetPlugin { @@ -85,6 +93,15 @@ impl Backend for DotnetPlugin { false } + fn resolve_lockfile_options( + &self, + request: &ToolRequest, + _target: &PlatformTarget, + ) -> BTreeMap { + let raw_opts = request.options(); + DotnetOptions::new(&raw_opts).lockfile_options() + } + async fn _list_remote_versions(&self, _config: &Arc) -> Result> { let index: ReleasesIndex = HTTP_FETCH .json("https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json") @@ -417,6 +434,7 @@ impl PartialOrd for SortedVersion { #[cfg(test)] mod tests { use super::*; + use crate::toolset::ToolSource; fn opts_with_runtime(runtime: &str) -> ToolVersionOptions { let mut opts = ToolVersionOptions::default(); @@ -438,4 +456,35 @@ mod tests { Some("Microsoft.AspNetCore.App") ); } + + #[test] + fn dotnet_lockfile_options_include_runtime() { + let opts = opts_with_runtime("dotnet"); + assert_eq!( + DotnetOptions::new(&opts).lockfile_options(), + BTreeMap::from([("runtime".to_string(), "dotnet".to_string())]) + ); + assert!( + DotnetOptions::new(&ToolVersionOptions::default()) + .lockfile_options() + .is_empty() + ); + } + + #[test] + fn resolve_lockfile_options_include_runtime() { + let backend = DotnetPlugin::new(); + let request = ToolRequest::new_opts( + backend.ba().clone(), + "8.0.14", + opts_with_runtime("aspnetcore"), + ToolSource::Unknown, + ) + .unwrap(); + + assert_eq!( + backend.resolve_lockfile_options(&request, &PlatformTarget::from_current()), + BTreeMap::from([("runtime".to_string(), "aspnetcore".to_string())]) + ); + } } From 9de949a3fb44a3b6c1fadddc51ab75551628d532 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Mon, 1 Jun 2026 07:39:15 +1000 Subject: [PATCH 2/2] test(dotnet): cover empty runtime lock identity --- src/plugins/core/dotnet.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/plugins/core/dotnet.rs b/src/plugins/core/dotnet.rs index 685fea2fe5..e4effccd5a 100644 --- a/src/plugins/core/dotnet.rs +++ b/src/plugins/core/dotnet.rs @@ -486,5 +486,18 @@ mod tests { backend.resolve_lockfile_options(&request, &PlatformTarget::from_current()), BTreeMap::from([("runtime".to_string(), "aspnetcore".to_string())]) ); + + let request_no_runtime = ToolRequest::new_opts( + backend.ba().clone(), + "8.0.14", + ToolVersionOptions::default(), + ToolSource::Unknown, + ) + .unwrap(); + assert!( + backend + .resolve_lockfile_options(&request_no_runtime, &PlatformTarget::from_current()) + .is_empty() + ); } }