diff --git a/crates/aqua-registry/src/types.rs b/crates/aqua-registry/src/types.rs index 4a04e160ac..87c4c52580 100644 --- a/crates/aqua-registry/src/types.rs +++ b/crates/aqua-registry/src/types.rs @@ -611,13 +611,16 @@ impl AquaPackage { } /// Apply Windows executable extension to an asset or URL string if appropriate. - /// Mirrors upstream aqua's `completeWindowsExtToAsset` decision tree. + /// Keeps already-extended raw assets unchanged to avoid doubling custom Windows extensions. fn complete_windows_ext_to_asset(&self, s: &str, v: &str, os: &str) -> Result { if os != "windows" || s.ends_with(".exe") || s.ends_with(".jar") { return Ok(s.to_string()); } if self.format == "raw" { - return Ok(self.complete_windows_ext(s)); + if self.os_file_ext_is_empty(s, v) { + return Ok(self.complete_windows_ext(s)); + } + return Ok(s.to_string()); } if !self.format.is_empty() { return Ok(s.to_string()); @@ -1501,6 +1504,20 @@ packages: assert_eq!(url, "https://example.com/tool/1.0.0/tool.jar"); } + #[test] + fn test_url_raw_preserves_custom_windows_ext() { + let pkg = AquaPackage { + url: "https://example.com/tool/{{.Version}}/tool.bat".to_string(), + format: "raw".to_string(), + windows_ext: ".bat".to_string(), + ..Default::default() + }; + + let url = pkg.url("1.0.0", "windows", "amd64").unwrap(); + + assert_eq!(url, "https://example.com/tool/1.0.0/tool.bat"); + } + #[test] fn test_asset_appends_format_ext_by_default() { let pkg = AquaPackage { @@ -1542,6 +1559,20 @@ packages: assert_eq!(asset, "tool-1.0.0-windows-amd64.bat"); } + #[test] + fn test_asset_raw_preserves_custom_windows_ext() { + let pkg = AquaPackage { + asset: "tool-{{.Version}}-{{.OS}}-{{.Arch}}.bat".to_string(), + format: "raw".to_string(), + windows_ext: ".bat".to_string(), + ..Default::default() + }; + + let asset = pkg.asset("1.0.0", "windows", "amd64").unwrap(); + + assert_eq!(asset, "tool-1.0.0-windows-amd64.bat"); + } + #[test] fn test_asset_normalizes_custom_windows_ext() { let pkg = AquaPackage {