diff --git a/e2e/lockfile/test_lockfile_aqua_version_prefix_override b/e2e/lockfile/test_lockfile_aqua_version_prefix_override index a9e1257cb6b..17a116ce69b 100644 --- a/e2e/lockfile/test_lockfile_aqua_version_prefix_override +++ b/e2e/lockfile/test_lockfile_aqua_version_prefix_override @@ -62,8 +62,8 @@ cat <<'EOF' >mise.toml "aqua:example/ambiguous" = "1.0.0" EOF -output=$(mise lock aqua:example/ambiguous --platform windows-x64 2>&1) || true -assert_contains "echo '$output'" "ambiguous aqua version prefixes for 1.0.0: old-v, new-v" +# A platform that cannot resolve is reported and skipped; mise lock itself exits 0. +assert_contains "mise lock aqua:example/ambiguous --platform windows-x64 2>&1" "ambiguous aqua version prefixes for 1.0.0: old-v, new-v" if [[ -f mise.lock ]]; then assert_not_contains "cat mise.lock" "/old.zip" assert_not_contains "cat mise.lock" "/new.zip" diff --git a/src/backend/aqua.rs b/src/backend/aqua.rs index 9fc997ec0d2..7d9cbf6775a 100644 --- a/src/backend/aqua.rs +++ b/src/backend/aqua.rs @@ -3939,7 +3939,13 @@ fn lock_package_for_version( ) -> Result { let candidates = resolved_package_version_candidates(version, tag, &pkg); let versions = candidates.iter().map(|v| v.as_ref()).collect_vec(); - if tag.is_none() { + // Without a prefix on any override every candidate resolves to the root prefix, + // so there is nothing to disambiguate and no reason to clone the package. + let has_override_prefix = pkg + .version_overrides + .iter() + .any(|vo| vo.version_prefix.is_some()); + if tag.is_none() && has_override_prefix { let prefixes = versions .iter() .filter(|v| pkg.version_constraint_ok(&[v])) @@ -3953,7 +3959,7 @@ fn lock_package_for_version( .collect_vec(); if prefixes.len() > 1 { bail!( - "ambiguous aqua version prefixes for {version}: {}; no exact release tag was found", + "ambiguous aqua version prefixes for {version}: {}; no exact release tag matched", prefixes .iter() .map(|prefix| if prefix.is_empty() { "(none)" } else { prefix }) @@ -4730,11 +4736,6 @@ version_overrides: "#, ) .unwrap(); - let err = lock_package_for_version(pkg.clone(), "1.0.0", None, "windows", "amd64", None) - .unwrap_err(); - assert!(err.to_string().contains("ambiguous aqua version prefixes")); - assert!(err.to_string().contains("old-v, new-v")); - let pkg = lock_package_for_version(pkg, "1.0.0", Some("new-v1.0.0"), "windows", "amd64", None) .unwrap(); @@ -4745,6 +4746,27 @@ version_overrides: ); } + #[test] + fn test_lock_package_without_tag_rejects_ambiguous_override_prefixes() { + let pkg: AquaPackage = serde_yaml::from_str( + r#" +version_constraint: "false" +version_overrides: + - version_constraint: "true" + version_prefix: old-v + asset: old-layout.zip + - version_constraint: "true" + version_prefix: new-v + asset: new-layout.zip +"#, + ) + .unwrap(); + let err = + lock_package_for_version(pkg, "1.0.0", None, "windows", "amd64", None).unwrap_err(); + assert!(err.to_string().contains("ambiguous aqua version prefixes")); + assert!(err.to_string().contains("old-v, new-v")); + } + #[test] fn test_lock_package_prefixes_with_disjoint_constraints() { let pkg: AquaPackage = serde_yaml::from_str(