From 4797aa91333712a48fcfc24d7df7e6c5f0f1fe00 Mon Sep 17 00:00:00 2001 From: KristofferC Date: Mon, 3 Jun 2024 11:15:01 +0200 Subject: [PATCH] fix missing uuid check on extension when finding the location of an extension in stacked environments with name collisions of extensions this could compute the path for the wrong extension --- base/loading.jl | 14 ++++++-------- test/loading.jl | 13 +++++++++++++ .../Extensions/ExtNameCollision_A/Project.toml | 9 +++++++++ .../Extensions/ExtNameCollision_A/ext/REPLExt.jl | 0 .../ExtNameCollision_A/src/ExtNameCollision_A.jl | 5 +++++ .../Extensions/ExtNameCollision_B/Project.toml | 9 +++++++++ .../Extensions/ExtNameCollision_B/ext/REPLExt.jl | 0 .../ExtNameCollision_B/src/ExtNameCollision_B.jl | 5 +++++ 8 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 test/project/Extensions/ExtNameCollision_A/Project.toml create mode 100644 test/project/Extensions/ExtNameCollision_A/ext/REPLExt.jl create mode 100644 test/project/Extensions/ExtNameCollision_A/src/ExtNameCollision_A.jl create mode 100644 test/project/Extensions/ExtNameCollision_B/Project.toml create mode 100644 test/project/Extensions/ExtNameCollision_B/ext/REPLExt.jl create mode 100644 test/project/Extensions/ExtNameCollision_B/src/ExtNameCollision_B.jl diff --git a/base/loading.jl b/base/loading.jl index ec90015350d7a..0c537f8fc9a5f 100644 --- a/base/loading.jl +++ b/base/loading.jl @@ -694,7 +694,7 @@ function manifest_uuid_path(env::String, pkg::PkgId)::Union{Nothing,String,Missi # if `pkg` matches the project, return the project itself return project_file_path(project_file, pkg.name) end - mby_ext = project_file_ext_path(project_file, pkg.name) + mby_ext = project_file_ext_path(project_file, pkg) mby_ext === nothing || return mby_ext # look for manifest file and `where` stanza return explicit_manifest_uuid_path(project_file, pkg) @@ -709,7 +709,7 @@ function manifest_uuid_path(env::String, pkg::PkgId)::Union{Nothing,String,Missi if parent_project_file !== nothing parentproj = project_file_name_uuid(parent_project_file, parentid.name) if parentproj == parentid - mby_ext = project_file_ext_path(parent_project_file, pkg.name) + mby_ext = project_file_ext_path(parent_project_file, pkg) mby_ext === nothing || return mby_ext end end @@ -725,13 +725,13 @@ function find_ext_path(project_path::String, extname::String) return joinpath(project_path, "ext", extname * ".jl") end -function project_file_ext_path(project_file::String, name::String) +function project_file_ext_path(project_file::String, ext::PkgId) d = parsed_toml(project_file) p = dirname(project_file) exts = get(d, "extensions", nothing)::Union{Dict{String, Any}, Nothing} if exts !== nothing - if name in keys(exts) - return find_ext_path(p, name) + if ext.name in keys(exts) && ext.uuid == uuid5(UUID(d["uuid"]::String), ext.name) + return find_ext_path(p, ext.name) end end return nothing @@ -834,9 +834,7 @@ function implicit_env_project_file_extension(dir::String, ext::PkgId) for pkg in readdir(dir; join=true) project_file = env_project_file(pkg) project_file isa String || continue - proj = project_file_name_uuid(project_file, "") - uuid5(proj.uuid, ext.name) == ext.uuid || continue - path = project_file_ext_path(project_file, ext.name) + path = project_file_ext_path(project_file, ext) if path !== nothing return path, project_file end diff --git a/test/loading.jl b/test/loading.jl index 4cd0cb7dac823..9230bc75599e6 100644 --- a/test/loading.jl +++ b/test/loading.jl @@ -1630,3 +1630,16 @@ end copy!(LOAD_PATH, old_load_path) end end + +@testset "extension path computation name collision" begin + old_load_path = copy(LOAD_PATH) + try + empty!(LOAD_PATH) + push!(LOAD_PATH, joinpath(@__DIR__, "project", "Extensions", "ExtNameCollision_A")) + push!(LOAD_PATH, joinpath(@__DIR__, "project", "Extensions", "ExtNameCollision_B")) + ext_B = Base.PkgId(Base.uuid5(Base.identify_package("ExtNameCollision_B").uuid, "REPLExt"), "REPLExt") + @test Base.locate_package(ext_B) == joinpath(@__DIR__, "project", "Extensions", "ExtNameCollision_B", "ext", "REPLExt.jl") + finally + copy!(LOAD_PATH, old_load_path) + end +end diff --git a/test/project/Extensions/ExtNameCollision_A/Project.toml b/test/project/Extensions/ExtNameCollision_A/Project.toml new file mode 100644 index 0000000000000..f4cc37786f508 --- /dev/null +++ b/test/project/Extensions/ExtNameCollision_A/Project.toml @@ -0,0 +1,9 @@ +name = "ExtNameCollision_A" +uuid = "9f48de98-8f56-4937-aa32-2a5530882eaa" +version = "0.1.0" + +[weakdeps] +REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[extensions] +REPLExt = "REPL" diff --git a/test/project/Extensions/ExtNameCollision_A/ext/REPLExt.jl b/test/project/Extensions/ExtNameCollision_A/ext/REPLExt.jl new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/test/project/Extensions/ExtNameCollision_A/src/ExtNameCollision_A.jl b/test/project/Extensions/ExtNameCollision_A/src/ExtNameCollision_A.jl new file mode 100644 index 0000000000000..2f47a862dd9c5 --- /dev/null +++ b/test/project/Extensions/ExtNameCollision_A/src/ExtNameCollision_A.jl @@ -0,0 +1,5 @@ +module ExtNameCollision_A + +greet() = print("Hello World!") + +end # module ExtNameCollision_A diff --git a/test/project/Extensions/ExtNameCollision_B/Project.toml b/test/project/Extensions/ExtNameCollision_B/Project.toml new file mode 100644 index 0000000000000..ac52d64a82a7c --- /dev/null +++ b/test/project/Extensions/ExtNameCollision_B/Project.toml @@ -0,0 +1,9 @@ +name = "ExtNameCollision_B" +uuid = "597d654f-44d8-4443-9b1e-1f2f4b45906f" +version = "0.1.0" + +[weakdeps] +REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[extensions] +REPLExt = "REPL" diff --git a/test/project/Extensions/ExtNameCollision_B/ext/REPLExt.jl b/test/project/Extensions/ExtNameCollision_B/ext/REPLExt.jl new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/test/project/Extensions/ExtNameCollision_B/src/ExtNameCollision_B.jl b/test/project/Extensions/ExtNameCollision_B/src/ExtNameCollision_B.jl new file mode 100644 index 0000000000000..e7665982a79b3 --- /dev/null +++ b/test/project/Extensions/ExtNameCollision_B/src/ExtNameCollision_B.jl @@ -0,0 +1,5 @@ +module ExtNameCollision_B + +greet() = print("Hello World!") + +end # module ExtNameCollision_B