Fix #115192: Inconsistent behavior renaming data-blocks

This is due to `BLI_findstring` returning wrong id from passed name.
Two IDs can have same name before making them unique so it can return
wrong id. To fix this, pass id argument instead of id_name to
`BLI_libblock_ensure_unique_name` and skip the use of `BLI_findstring`

Pull Request: https://projects.blender.org/blender/blender/pulls/116246
This commit is contained in:
Pratik Borhade
2024-01-15 12:45:45 +01:00
committed by Pratik Borhade
parent 4da32e9334
commit 195bb4f8f5
6 changed files with 11 additions and 14 deletions

View File

@@ -207,7 +207,7 @@ void BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) AT
* Use after setting the ID's name
* When name exists: call 'new_id'
*/
void BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL();
void BLI_libblock_ensure_unique_name(struct Main *bmain, ID *id) ATTR_NONNULL();
struct ID *BKE_libblock_find_name(struct Main *bmain,
short type,

View File

@@ -1633,6 +1633,7 @@ bool BKE_id_new_name_validate(
}
result = BKE_main_namemap_get_name(bmain, id, name, false);
result |= !STREQ(id->name + 2, name);
BLI_strncpy(id->name + 2, name, sizeof(id->name) - 2);
id_sort_by_name(lb, id, nullptr);
@@ -2005,21 +2006,17 @@ void BKE_library_make_local(Main *bmain,
#endif
}
void BLI_libblock_ensure_unique_name(Main *bmain, const char *name)
void BLI_libblock_ensure_unique_name(Main *bmain, ID *id)
{
ListBase *lb;
ID *idtest;
lb = which_libbase(bmain, GS(name));
lb = which_libbase(bmain, GS(id->name));
if (lb == nullptr) {
return;
}
/* search for id */
idtest = static_cast<ID *>(BLI_findstring(lb, name + 2, offsetof(ID, name) + 2));
if (idtest != nullptr && !ID_IS_LINKED(idtest)) {
/* BKE_id_new_name_validate also takes care of sorting. */
BKE_id_new_name_validate(bmain, lb, idtest, nullptr, false);
if (!ID_IS_LINKED(id) && BKE_id_new_name_validate(bmain, lb, id, nullptr, false)) {
bmain->is_memfile_undo_written = false;
}
}

View File

@@ -104,7 +104,7 @@ ID *do_versions_rename_id(Main *bmain,
BKE_main_namemap_remove_name(bmain, id, id->name + 2);
BLI_strncpy(id->name + 2, name_dst, sizeof(id->name) - 2);
/* We know it's unique, this just sorts. */
BLI_libblock_ensure_unique_name(bmain, id->name);
BLI_libblock_ensure_unique_name(bmain, id);
}
return id;
}

View File

@@ -531,7 +531,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
if (!STREQ(screen->id.name + 2, workspace->id.name + 2)) {
BKE_main_namemap_remove_name(bmain, &screen->id, screen->id.name + 2);
BLI_strncpy(screen->id.name + 2, workspace->id.name + 2, sizeof(screen->id.name) - 2);
BLI_libblock_ensure_unique_name(bmain, screen->id.name);
BLI_libblock_ensure_unique_name(bmain, &screen->id);
}
}

View File

@@ -686,7 +686,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
if (tselem->type == TSE_SOME_ID) {
BKE_main_namemap_remove_name(bmain, tselem->id, oldname);
BLI_libblock_ensure_unique_name(bmain, tselem->id->name);
BLI_libblock_ensure_unique_name(bmain, tselem->id);
WM_msg_publish_rna_prop(mbus, tselem->id, tselem->id, ID, name);
@@ -754,7 +754,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
case TSE_NLA_ACTION: {
bAction *act = (bAction *)tselem->id;
BKE_main_namemap_remove_name(bmain, &act->id, oldname);
BLI_libblock_ensure_unique_name(bmain, act->id.name);
BLI_libblock_ensure_unique_name(bmain, &act->id);
WM_msg_publish_rna_prop(mbus, &act->id, &act->id, ID, name);
DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE);
break;
@@ -876,7 +876,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
/* The ID is a #Collection, not a #LayerCollection */
Collection *collection = (Collection *)tselem->id;
BKE_main_namemap_remove_name(bmain, &collection->id, oldname);
BLI_libblock_ensure_unique_name(bmain, collection->id.name);
BLI_libblock_ensure_unique_name(bmain, &collection->id);
WM_msg_publish_rna_prop(mbus, &collection->id, &collection->id, ID, name);
WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr);
DEG_id_tag_update(tselem->id, ID_RECALC_COPY_ON_WRITE);

View File

@@ -286,7 +286,7 @@ void rna_ID_name_set(PointerRNA *ptr, const char *value)
BKE_main_namemap_remove_name(G_MAIN, id, id->name + 2);
BLI_strncpy_utf8(id->name + 2, value, sizeof(id->name) - 2);
BLI_assert(BKE_id_is_in_global_main(id));
BLI_libblock_ensure_unique_name(G_MAIN, id->name);
BLI_libblock_ensure_unique_name(G_MAIN, id);
if (GS(id->name) == ID_OB) {
Object *ob = (Object *)id;