Skip to content

Commit 6b889c6

Browse files
KristofferCKristofferC
authored andcommitted
make insert_extension_triggers idempotent
(cherry picked from commit 2a0b9dd)
1 parent c70094e commit 6b889c6

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

base/loading.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,18 +1104,18 @@ mutable struct ExtensionId
11041104
ntriggers::Int # how many more packages must be defined until this is loaded
11051105
end
11061106

1107-
const EXT_DORMITORY = Dict{PkgId,Vector{ExtensionId}}()
1107+
const EXT_PRIMED = Dict{PkgId, PkgId}() # Extension -> Parent
1108+
const EXT_DORMITORY = Dict{PkgId,Vector{ExtensionId}}() # Trigger -> Extensions that can be triggered by it
11081109
const EXT_DORMITORY_FAILED = ExtensionId[]
11091110

11101111
function insert_extension_triggers(pkg::PkgId)
11111112
pkg.uuid === nothing && return
1112-
extensions_added = Set{PkgId}()
11131113
for env in load_path()
1114-
insert_extension_triggers!(extensions_added, env, pkg)
1114+
insert_extension_triggers(env, pkg)
11151115
end
11161116
end
11171117

1118-
function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, pkg::PkgId)::Union{Nothing,Missing}
1118+
function insert_extension_triggers(env::String, pkg::PkgId)::Union{Nothing,Missing}
11191119
project_file = env_project_file(env)
11201120
if project_file isa String
11211121
manifest_file = project_file_manifest_path(project_file)
@@ -1133,7 +1133,7 @@ function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, p
11331133
extensions === nothing && return
11341134
weakdeps === nothing && return
11351135
if weakdeps isa Dict{String, Any}
1136-
return _insert_extension_triggers!(extensions_added, pkg, extensions, weakdeps)
1136+
return _insert_extension_triggers(pkg, extensions, weakdeps)
11371137
end
11381138

11391139
d_weakdeps = Dict{String, String}()
@@ -1148,21 +1148,22 @@ function insert_extension_triggers!(extensions_added::Set{PkgId}, env::String, p
11481148
d_weakdeps[dep_name] = uuid
11491149
end
11501150
@assert length(d_weakdeps) == length(weakdeps)
1151-
return _insert_extension_triggers!(extensions_added, pkg, extensions, d_weakdeps)
1151+
return _insert_extension_triggers(pkg, extensions, d_weakdeps)
11521152
end
11531153
end
11541154
end
11551155
end
11561156
return nothing
11571157
end
11581158

1159-
function _insert_extension_triggers!(extensions_added::Set{PkgId}, parent::PkgId, extensions::Dict{String, <:Any}, weakdeps::Dict{String, <:Any})
1159+
function _insert_extension_triggers(parent::PkgId, extensions::Dict{String, <:Any}, weakdeps::Dict{String, <:Any})
11601160
for (ext::String, triggers::Union{String, Vector{String}}) in extensions
11611161
triggers isa String && (triggers = [triggers])
11621162
id = PkgId(uuid5(parent.uuid, ext), ext)
1163-
# Only add triggers for an extension from one env.
1164-
id in extensions_added && continue
1165-
push!(extensions_added, id)
1163+
if id in keys(EXT_PRIMED) || haskey(Base.loaded_modules, id)
1164+
continue # extension is already primed or loaded, don't add it again
1165+
end
1166+
EXT_PRIMED[id] = parent
11661167
gid = ExtensionId(id, parent, 1 + length(triggers))
11671168
trigger1 = get!(Vector{ExtensionId}, EXT_DORMITORY, parent)
11681169
push!(trigger1, gid)

0 commit comments

Comments
 (0)