[Bf-blender-cvs] [58dcd209987] master: ID namemap: Fix more issues when changing libs.

Bastien Montagne noreply at git.blender.org
Wed Jul 27 15:33:35 CEST 2022


Commit: 58dcd2099876d679f7bc51901c82b2f04e9ce659
Author: Bastien Montagne
Date:   Wed Jul 27 12:09:32 2022 +0200
Branches: master
https://developer.blender.org/rB58dcd2099876d679f7bc51901c82b2f04e9ce659

ID namemap: Fix more issues when changing libs.

Fix tests, and some issue when making an ID local.

There are probably a few more issues still though.

===================================================================

M	source/blender/blenkernel/intern/lib_id.c
M	source/blender/blenkernel/intern/lib_id_test.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index affa1e72ad0..3778e308db6 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -179,6 +179,10 @@ void BKE_lib_id_clear_library_data(Main *bmain, ID *id, const int flags)
   const bool id_in_mainlist = (id->tag & LIB_TAG_NO_MAIN) == 0 &&
                               (id->flag & LIB_EMBEDDED_DATA) == 0;
 
+  if (id_in_mainlist) {
+    BKE_main_namemap_remove_name(bmain, id, id->name + 2);
+  }
+
   lib_id_library_local_paths(bmain, id->lib, id);
 
   id_fake_user_clear(id);
@@ -1080,6 +1084,9 @@ void *BKE_libblock_alloc(Main *bmain, short type, const char *name, const int fl
       /* alphabetic insertion: is in new_id */
       BKE_main_unlock(bmain);
 
+      /* This assert avoids having to keep name_map consistency when changing the library of an ID,
+       * if this check is not true anymore it will have to be done here too. */
+      BLI_assert(bmain->curlib == NULL || bmain->curlib->runtime.name_map == NULL);
       /* This is important in 'readfile doversion after liblink' context mainly, but is a good
        * consistency change in general: ID created for a Main should get that main's current
        * library pointer. */
diff --git a/source/blender/blenkernel/intern/lib_id_test.cc b/source/blender/blenkernel/intern/lib_id_test.cc
index 62066204227..d12e0c52870 100644
--- a/source/blender/blenkernel/intern/lib_id_test.cc
+++ b/source/blender/blenkernel/intern/lib_id_test.cc
@@ -65,6 +65,7 @@ static void change_lib(Main *bmain, ID *id, Library *lib)
   }
   BKE_main_namemap_remove_name(bmain, id, id->name + 2);
   id->lib = lib;
+  BKE_main_namemap_get_name(bmain, id, id->name + 2);
 }
 
 static void change_name(Main *bmain, ID *id, const char *name)
@@ -85,25 +86,27 @@ TEST(lib_id_main_sort, linked_ids_1)
   ID *id_a = static_cast<ID *>(BKE_id_new(ctx.bmain, ID_OB, "OB_A"));
   ID *id_b = static_cast<ID *>(BKE_id_new(ctx.bmain, ID_OB, "OB_B"));
 
-  id_a->lib = lib_a;
+  change_lib(ctx.bmain, id_a, lib_a);
   id_sort_by_name(&ctx.bmain->objects, id_a, nullptr);
-  id_b->lib = lib_a;
+  change_lib(ctx.bmain, id_b, lib_a);
   id_sort_by_name(&ctx.bmain->objects, id_b, nullptr);
   EXPECT_TRUE(ctx.bmain->objects.first == id_c);
   EXPECT_TRUE(ctx.bmain->objects.last == id_b);
   test_lib_id_main_sort_check_order({id_c, id_a, id_b});
 
-  id_a->lib = lib_b;
+  change_lib(ctx.bmain, id_a, lib_b);
   id_sort_by_name(&ctx.bmain->objects, id_a, nullptr);
   EXPECT_TRUE(ctx.bmain->objects.first == id_c);
   EXPECT_TRUE(ctx.bmain->objects.last == id_a);
   test_lib_id_main_sort_check_order({id_c, id_b, id_a});
 
-  id_b->lib = lib_b;
+  change_lib(ctx.bmain, id_b, lib_b);
   id_sort_by_name(&ctx.bmain->objects, id_b, nullptr);
   EXPECT_TRUE(ctx.bmain->objects.first == id_c);
   EXPECT_TRUE(ctx.bmain->objects.last == id_b);
   test_lib_id_main_sort_check_order({id_c, id_a, id_b});
+
+  EXPECT_TRUE(BKE_main_namemap_validate(ctx.bmain));
 }
 
 TEST(lib_id_main_unique_name, local_ids_1)
@@ -184,9 +187,7 @@ TEST(lib_id_main_unique_name, ids_sorted_by_default)
 static ID *add_id_in_library(Main *bmain, const char *name, Library *lib)
 {
   ID *id = static_cast<ID *>(BKE_id_new(bmain, ID_OB, name));
-  BKE_main_namemap_remove_name(bmain, id, id->name + 2);
-  id->lib = lib;
-  BKE_main_namemap_get_name(bmain, id, id->name + 2);
+  change_lib(bmain, id, lib);
   id_sort_by_name(&bmain->objects, id, nullptr);
   return id;
 }



More information about the Bf-blender-cvs mailing list