diff --git a/src/Operations.jl b/src/Operations.jl index ac05daefe8..7fca5574d3 100644 --- a/src/Operations.jl +++ b/src/Operations.jl @@ -3313,6 +3313,15 @@ function apply_force_latest_compatible_version!( uuid, old_compat_spec, ) + if latest_compatible_version === nothing + if name != target_name + @warn( + "Skipping force_latest_compatible_version for unregistered dependency", + name, uuid, target_name, + ) + end + return nothing + end earliest_backwards_compatible_version = get_earliest_backwards_compatible_version(latest_compatible_version) if allow_earlier_backwards_compatible_versions version_for_intersect = only_major_minor_patch(earliest_backwards_compatible_version) @@ -3342,6 +3351,9 @@ function get_latest_compatible_version( ) all_registered_versions = get_all_registered_versions(ctx, uuid) compatible_versions = filter(in(compat_spec), all_registered_versions) + if isempty(compatible_versions) + return nothing # No registered versions found + end latest_compatible_version = maximum(compatible_versions) return latest_compatible_version end diff --git a/test/force_latest_compatible_version.jl b/test/force_latest_compatible_version.jl index bc5402b956..b32f251b4d 100644 --- a/test/force_latest_compatible_version.jl +++ b/test/force_latest_compatible_version.jl @@ -327,6 +327,23 @@ const test_package_parent_dir = joinpath( end end end + + @testset "UnregisteredDep: package with unregistered dependencies" begin + mktempdir() do tmp_dir + test_package = joinpath(tmp_dir, "UnregisteredDep") + cp(joinpath(test_package_parent_dir, "UnregisteredDep"), test_package; force = true) + Utils.isolate(loaded_depot = true) do + Pkg.activate(test_package) + # Note: we can't actually instantiate this package since it has unregistered deps + # But we can test that force_latest_compatible_version handles it gracefully + + # Test that it throws and shows warning for unregistered dependency + @test_logs (:warn, r"Skipping force_latest_compatible_version for unregistered dependency") begin + @test_throws Pkg.Types.PkgError "expected package `SomeUnregisteredPackage [deadbeef]` to be registered" Pkg.test(; force_latest_compatible_version = true) + end + end + end + end end end # module diff --git a/test/test_packages/force_latest_compatible_version/UnregisteredDep/Project.toml b/test/test_packages/force_latest_compatible_version/UnregisteredDep/Project.toml new file mode 100644 index 0000000000..db2067c472 --- /dev/null +++ b/test/test_packages/force_latest_compatible_version/UnregisteredDep/Project.toml @@ -0,0 +1,16 @@ +name = "UnregisteredDep" +uuid = "abc047b9-6ad4-4533-a374-d50ae908e3e9" +authors = ["Test "] +version = "0.1.0" + +[deps] +SomeUnregisteredPackage = "deadbeef-dead-beef-dead-beefdeadbeef" + +[compat] +SomeUnregisteredPackage = "^1.0" + +[extras] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test"] diff --git a/test/test_packages/force_latest_compatible_version/UnregisteredDep/src/UnregisteredDep.jl b/test/test_packages/force_latest_compatible_version/UnregisteredDep/src/UnregisteredDep.jl new file mode 100644 index 0000000000..a92c14ffb5 --- /dev/null +++ b/test/test_packages/force_latest_compatible_version/UnregisteredDep/src/UnregisteredDep.jl @@ -0,0 +1,5 @@ +module UnregisteredDep + +# This is a dummy module for testing + +end diff --git a/test/test_packages/force_latest_compatible_version/UnregisteredDep/test/runtests.jl b/test/test_packages/force_latest_compatible_version/UnregisteredDep/test/runtests.jl new file mode 100644 index 0000000000..680bb53983 --- /dev/null +++ b/test/test_packages/force_latest_compatible_version/UnregisteredDep/test/runtests.jl @@ -0,0 +1,5 @@ +using Test + +@testset "UnregisteredDep tests" begin + @test true # Just a dummy test +end