Report when register_class overrides classes with the same bl_idname

The unregistering of already registered classes is expected behavior,
however this was done silently and can be unsafe as two Addons may have
the same names for operators and in case of name collision the addon
registered first will break silently / start behave unexpectedly.
So reporting the unregister step seems reasonable.

During Addon development, this might seem noisy when classes are
frequently updated, however catching the problematic cases instead of
being silent might be beneficial.

Part of #116370

Pull Request: https://projects.blender.org/blender/blender/pulls/116374
This commit is contained in:
Philipp Oeser
2024-01-16 14:43:39 +01:00
committed by Philipp Oeser
parent 0e68898a37
commit c5e2ec8a1a
8 changed files with 103 additions and 0 deletions

View File

@@ -325,6 +325,13 @@ static StructRNA *rna_KeyingSetInfo_register(Main *bmain,
/* check if we have registered this info before, and remove it */
ksi = ANIM_keyingset_info_find_name(dummy_ksi.idname);
if (ksi) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_ksi.idname);
StructRNA *srna = ksi->rna_ext.srna;
if (!(srna && rna_KeyingSetInfo_unregister(bmain, srna))) {
BKE_reportf(reports,

View File

@@ -991,6 +991,13 @@ static StructRNA *rna_NodeTree_register(Main *bmain,
/* check if we have registered this tree type before, and remove it */
nt = ntreeTypeFind(dummy_nt.idname);
if (nt) {
BKE_reportf(reports,
RPT_INFO,
"Registering node tree class: '%s', bl_idname '%s' has been registered before, "
"unregistering previous",
identifier,
dummy_nt.idname);
/* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */
if (!rna_NodeTree_unregister(bmain, nt->rna_ext.srna)) {
BKE_reportf(reports,
@@ -1663,6 +1670,13 @@ static bNodeType *rna_Node_register_base(Main *bmain,
return nullptr;
}
BKE_reportf(reports,
RPT_INFO,
"Registering node class: '%s', bl_idname '%s' has been registered before, "
"unregistering previous",
identifier,
dummy_nt.idname);
/* NOTE: unlike most types `nt->rna_ext.srna` doesn't need to be checked for nullptr. */
if (!rna_Node_unregister(bmain, nt->rna_ext.srna)) {
BKE_reportf(reports,

View File

@@ -348,6 +348,13 @@ static StructRNA *rna_RenderEngine_register(Main *bmain,
et = static_cast<RenderEngineType *>(
BLI_findstring(&R_engines, dummy_et.idname, offsetof(RenderEngineType, idname)));
if (et) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_et.idname);
StructRNA *srna = et->rna_ext.srna;
if (!(srna && rna_RenderEngine_unregister(bmain, srna))) {
BKE_reportf(reports,

View File

@@ -315,6 +315,12 @@ static StructRNA *rna_Panel_register(Main *bmain,
PanelType *pt_next = pt->next;
StructRNA *srna = pt->rna_ext.srna;
if (srna) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_pt.idname);
if (!rna_Panel_unregister(bmain, srna)) {
BKE_reportf(reports,
RPT_ERROR,
@@ -721,6 +727,13 @@ static StructRNA *rna_UIList_register(Main *bmain,
/* Check if we have registered this UI-list type before, and remove it. */
ult = WM_uilisttype_find(dummy_ult.idname, true);
if (ult) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_ult.idname);
StructRNA *srna = ult->rna_ext.srna;
if (!(srna && rna_UIList_unregister(bmain, srna))) {
BKE_reportf(reports,
@@ -852,6 +865,13 @@ static StructRNA *rna_Header_register(Main *bmain,
ht = static_cast<HeaderType *>(
BLI_findstring(&art->headertypes, dummy_ht.idname, offsetof(HeaderType, idname)));
if (ht) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_ht.idname);
StructRNA *srna = ht->rna_ext.srna;
if (!(srna && rna_Header_unregister(bmain, srna))) {
BKE_reportf(reports,
@@ -1002,6 +1022,13 @@ static StructRNA *rna_Menu_register(Main *bmain,
/* check if we have registered this menu type before, and remove it */
mt = WM_menutype_find(dummy_mt.idname, true);
if (mt) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_mt.idname);
StructRNA *srna = mt->rna_ext.srna;
if (!(srna && rna_Menu_unregister(bmain, srna))) {
BKE_reportf(reports,
@@ -1207,6 +1234,12 @@ static StructRNA *rna_AssetShelf_register(Main *bmain,
LISTBASE_FOREACH (AssetShelfType *, iter_shelf_type, &space_type->asset_shelf_types) {
if (STREQ(iter_shelf_type->idname, dummy_shelf_type.idname)) {
if (iter_shelf_type->rna_ext.srna) {
BKE_reportf(reports,
RPT_INFO,
"Registering asset shelf class: '%s' has been registered before, "
"unregistering previous",
dummy_shelf_type.idname);
rna_AssetShelf_unregister(bmain, iter_shelf_type->rna_ext.srna);
}
break;

View File

@@ -82,6 +82,13 @@ static StructRNA *rna_USDHook_register(Main *bmain,
/* check if we have registered this hook before, and remove it */
hook = USD_find_hook_name(dummy_hook.idname);
if (hook) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_hook.idname);
StructRNA *srna = hook->rna_ext.srna;
if (!rna_USDHook_unregister(bmain, srna)) {
BKE_reportf(reports,

View File

@@ -1059,6 +1059,13 @@ static StructRNA *rna_AddonPref_register(Main *bmain,
/* Check if we have registered this add-on preference type before, and remove it. */
apt = BKE_addon_pref_type_find(dummy_addon.module, true);
if (apt) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_apt.idname);
StructRNA *srna = apt->rna_ext.srna;
if (!(srna && rna_AddonPref_unregister(bmain, srna))) {
BKE_reportf(reports,

View File

@@ -1185,6 +1185,13 @@ static StructRNA *rna_wmKeyConfigPref_register(Main *bmain,
/* check if we have registered this keyconf-prefs type before, and remove it */
kpt_rt = BKE_keyconfig_pref_type_find(dummy_kpt.idname, true);
if (kpt_rt) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_kpt.idname);
StructRNA *srna = kpt_rt->rna_ext.srna;
if (!(srna && rna_wmKeyConfigPref_unregister(bmain, srna))) {
BKE_reportf(reports,
@@ -1530,6 +1537,13 @@ static StructRNA *rna_Operator_register(Main *bmain,
{
wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
if (ot) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_ot.idname);
StructRNA *srna = ot->rna_ext.srna;
if (!(srna && rna_Operator_unregister(bmain, srna))) {
BKE_reportf(reports,
@@ -1700,6 +1714,13 @@ static StructRNA *rna_MacroOperator_register(Main *bmain,
{
wmOperatorType *ot = WM_operatortype_find(dummy_ot.idname, true);
if (ot) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_ot.idname);
StructRNA *srna = ot->rna_ext.srna;
if (!(srna && rna_Operator_unregister(bmain, srna))) {
BKE_reportf(reports,

View File

@@ -460,6 +460,13 @@ static StructRNA *rna_Gizmo_register(Main *bmain,
{
const wmGizmoType *gzt = WM_gizmotype_find(dummy_gt.idname, true);
if (gzt) {
BKE_reportf(reports,
RPT_INFO,
"%s '%s', bl_idname '%s' has been registered before, unregistering previous",
error_prefix,
identifier,
dummy_gt.idname);
StructRNA *srna = gzt->rna_ext.srna;
if (!(srna && rna_Gizmo_unregister(bmain, srna))) {
BKE_reportf(reports,