fix [#28005] Python Add-Ons are constantly reloaded if twice in the path
Addons are checked for their timestamps and reloaded when it changes but this failed when, 2 addons had the same name since different times caused 2 reloads on every redraw. Now when duplicate addons are in the path now give a error message in the UI and print path conflict in the console and don't thrash reloading.
This commit is contained in:
parent
13e82ff8e1
commit
8dd72c476e
@ -31,6 +31,8 @@ __all__ = (
|
|||||||
import bpy as _bpy
|
import bpy as _bpy
|
||||||
|
|
||||||
|
|
||||||
|
error_duplicates = False
|
||||||
|
|
||||||
def paths():
|
def paths():
|
||||||
# RELEASE SCRIPTS: official scripts distributed in Blender releases
|
# RELEASE SCRIPTS: official scripts distributed in Blender releases
|
||||||
paths = _bpy.utils.script_paths("addons")
|
paths = _bpy.utils.script_paths("addons")
|
||||||
@ -47,8 +49,11 @@ def paths():
|
|||||||
|
|
||||||
|
|
||||||
def modules(module_cache):
|
def modules(module_cache):
|
||||||
|
global error_duplicates
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
error_duplicates = False
|
||||||
|
|
||||||
path_list = paths()
|
path_list = paths()
|
||||||
|
|
||||||
# fake module importing
|
# fake module importing
|
||||||
@ -117,7 +122,12 @@ def modules(module_cache):
|
|||||||
modules_stale -= {mod_name}
|
modules_stale -= {mod_name}
|
||||||
mod = module_cache.get(mod_name)
|
mod = module_cache.get(mod_name)
|
||||||
if mod:
|
if mod:
|
||||||
if mod.__time__ != os.path.getmtime(mod_path):
|
if mod.__file__ != mod_path:
|
||||||
|
print("multiple addons with the same name:\n %r\n %r" %
|
||||||
|
(mod.__file__, mod_path))
|
||||||
|
error_duplicates = True
|
||||||
|
|
||||||
|
elif mod.__time__ != os.path.getmtime(mod_path):
|
||||||
print("reloading addon:", mod_name, mod.__time__, os.path.getmtime(mod_path), mod_path)
|
print("reloading addon:", mod_name, mod.__time__, os.path.getmtime(mod_path), mod_path)
|
||||||
del module_cache[mod_name]
|
del module_cache[mod_name]
|
||||||
mod = None
|
mod = None
|
||||||
|
@ -889,6 +889,16 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def draw_error(layout, message):
|
||||||
|
lines = message.split("\n")
|
||||||
|
box = layout.box()
|
||||||
|
rowsub = box.row()
|
||||||
|
rowsub.label(lines[0])
|
||||||
|
rowsub.label(icon='ERROR')
|
||||||
|
for l in lines[1:]:
|
||||||
|
box.label(l)
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
@ -909,6 +919,14 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
|||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
|
|
||||||
|
# set in addon_utils.modules(...)
|
||||||
|
if addon_utils.error_duplicates:
|
||||||
|
self.draw_error(col,
|
||||||
|
"Multiple addons using the same name found!\n"
|
||||||
|
"likely a problem with the script search path.\n"
|
||||||
|
"(see console for details)",
|
||||||
|
)
|
||||||
|
|
||||||
filter = context.window_manager.addon_filter
|
filter = context.window_manager.addon_filter
|
||||||
search = context.window_manager.addon_search.lower()
|
search = context.window_manager.addon_search.lower()
|
||||||
support = context.window_manager.addon_support
|
support = context.window_manager.addon_support
|
||||||
|
Loading…
Reference in New Issue
Block a user