[Bf-blender-cvs] [95847f6] master: Fix T43159: Copying of linked datablocks using relpath leads to invalid paths in new copies.

Bastien Montagne noreply at git.blender.org
Fri Jan 9 09:54:36 CET 2015


Commit: 95847f6ac7ce074501d0f7f2b874ef4036601dc4
Author: Bastien Montagne
Date:   Fri Jan 9 09:52:51 2015 +0100
Branches: master
https://developer.blender.org/rB95847f6ac7ce074501d0f7f2b874ef4036601dc4

Fix T43159: Copying of linked datablocks using relpath leads to invalid paths in new copies.

Propper fix reverting most of rB60e70c0c6014e5, which was only partial specific fix.
This code uses generic `BKE_id_lib_local_paths()` func to handle all possible paths.

Reviewers: sergey, campbellbarton

Differential Revision: https://developer.blender.org/D977

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

M	source/blender/blenkernel/intern/action.c
M	source/blender/blenkernel/intern/armature.c
M	source/blender/blenkernel/intern/brush.c
M	source/blender/blenkernel/intern/camera.c
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/group.c
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/key.c
M	source/blender/blenkernel/intern/lamp.c
M	source/blender/blenkernel/intern/lattice.c
M	source/blender/blenkernel/intern/linestyle.c
M	source/blender/blenkernel/intern/mask.c
M	source/blender/blenkernel/intern/material.c
M	source/blender/blenkernel/intern/mball.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/speaker.c
M	source/blender/blenkernel/intern/text.c
M	source/blender/blenkernel/intern/texture.c
M	source/blender/blenkernel/intern/world.c

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

diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index b066d53..f94f1e7 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -215,6 +215,10 @@ bAction *BKE_action_copy(bAction *src)
 		}
 	}
 	
+	if (src->id.lib) {
+		BKE_id_lib_local_paths(G.main, src->id.lib, &dst->id);
+	}
+
 	return dst;
 }
 
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index f4a5d33..df57db2 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -222,6 +222,10 @@ bArmature *BKE_armature_copy(bArmature *arm)
 	newArm->act_edbone = NULL;
 	newArm->sketch = NULL;
 
+	if (arm->id.lib) {
+		BKE_id_lib_local_paths(G.main, arm->id.lib, &newArm->id);
+	}
+
 	return newArm;
 }
 
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 7c1915e..55d347a 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -178,6 +178,10 @@ Brush *BKE_brush_copy(Brush *brush)
 		brushn->id.us++;
 	}
 	
+	if (brush->id.lib) {
+		BKE_id_lib_local_paths(G.main, brush->id.lib, &brushn->id);
+	}
+
 	return brushn;
 }
 
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index d0470ba..e424823 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -78,6 +78,10 @@ Camera *BKE_camera_copy(Camera *cam)
 
 	id_lib_extern((ID *)camn->dof_ob);
 
+	if (cam->id.lib) {
+		BKE_id_lib_local_paths(G.main, cam->id.lib, &camn->id);
+	}
+
 	return camn;
 }
 
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 937ceff..3abe3c5 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -237,6 +237,10 @@ Curve *BKE_curve_copy(Curve *cu)
 	id_us_plus((ID *)cun->vfonti);
 	id_us_plus((ID *)cun->vfontbi);
 
+	if (cu->id.lib) {
+		BKE_id_lib_local_paths(G.main, cu->id.lib, &cun->id);
+	}
+
 	return cun;
 }
 
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 6ea6baf..1f9cf2e 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -149,6 +149,10 @@ Group *BKE_group_copy(Group *group)
 	groupn = BKE_libblock_copy(&group->id);
 	BLI_duplicatelist(&groupn->gobject, &group->gobject);
 
+	if (group->id.lib) {
+		BKE_id_lib_local_paths(G.main, group->id.lib, &groupn->id);
+	}
+
 	return groupn;
 }
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 3d55340..870c077 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -365,11 +365,6 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
 	Image *nima = image_alloc(bmain, ima->id.name + 2, ima->source, ima->type);
 
 	BLI_strncpy(nima->name, ima->name, sizeof(ima->name));
-	if (ima->id.lib && BLI_path_is_rel(ima->name)) {
-		/* If path is relative, and source is a lib, path is relative to lib file, not main one! */
-		BLI_path_abs(nima->name, ima->id.lib->filepath);
-		BLI_path_rel(nima->name, bmain->name);
-	}
 
 	nima->flag = ima->flag;
 	nima->tpageflag = ima->tpageflag;
@@ -389,6 +384,10 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
 	if (ima->packedfile)
 		nima->packedfile = dupPackedFile(ima->packedfile);
 
+	if (ima->id.lib) {
+		BKE_id_lib_local_paths(bmain, ima->id.lib, &nima->id);
+	}
+
 	return nima;
 }
 
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 32e95e7..560a3c0 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -167,7 +167,11 @@ Key *BKE_key_copy(Key *key)
 		kbn = kbn->next;
 		kb = kb->next;
 	}
-	
+
+	if (key->id.lib) {
+		BKE_id_lib_local_paths(G.main, key->id.lib, &keyn->id);
+	}
+
 	return keyn;
 }
 
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index e738b16..93b9c22 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -126,6 +126,10 @@ Lamp *BKE_lamp_copy(Lamp *la)
 	if (la->preview)
 		lan->preview = BKE_previewimg_copy(la->preview);
 	
+	if (la->id.lib) {
+		BKE_id_lib_local_paths(G.main, la->id.lib, &lan->id);
+	}
+
 	return lan;
 }
 
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 7732d59..fa62308 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -284,6 +284,10 @@ Lattice *BKE_lattice_copy(Lattice *lt)
 
 	ltn->editlatt = NULL;
 
+	if (lt->id.lib) {
+		BKE_id_lib_local_paths(G.main, lt->id.lib, &ltn->id);
+	}
+
 	return ltn;
 }
 
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 5bee933..d244e9d 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -210,6 +210,10 @@ FreestyleLineStyle *BKE_linestyle_copy(FreestyleLineStyle *linestyle)
 	for (m = (LineStyleModifier *)linestyle->geometry_modifiers.first; m; m = m->next)
 		BKE_linestyle_geometry_modifier_copy(new_linestyle, m);
 
+	if (linestyle->id.lib) {
+		BKE_id_lib_local_paths(G.main, linestyle->id.lib, &new_linestyle->id);
+	}
+
 	return new_linestyle;
 }
 
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c
index b8c78ce..83ca6cd 100644
--- a/source/blender/blenkernel/intern/mask.c
+++ b/source/blender/blenkernel/intern/mask.c
@@ -50,6 +50,7 @@
 #include "DNA_sequence_types.h"
 
 #include "BKE_curve.h"
+#include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mask.h"
@@ -855,6 +856,10 @@ Mask *BKE_mask_copy(Mask *mask)
 		mask_new->id.us++;
 	}
 
+	if (mask->id.lib) {
+		BKE_id_lib_local_paths(G.main, mask->id.lib, &mask_new->id);
+	}
+
 	return mask_new;
 }
 
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 83800a3..981064b 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -252,6 +252,10 @@ Material *BKE_material_copy(Material *ma)
 
 	BLI_listbase_clear(&man->gpumaterial);
 	
+	if (ma->id.lib) {
+		BKE_id_lib_local_paths(G.main, ma->id.lib, &man->id);
+	}
+
 	return man;
 }
 
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 4c45269..34ab2a8 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -238,6 +238,10 @@ MetaBall *BKE_mball_copy(MetaBall *mb)
 	mbn->editelems = NULL;
 	mbn->lastelem = NULL;
 	
+	if (mb->id.lib) {
+		BKE_id_lib_local_paths(G.main, mb->id.lib, &mbn->id);
+	}
+
 	return mbn;
 }
 
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 2e80379..c47d294 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -562,6 +562,10 @@ Mesh *BKE_mesh_copy_ex(Main *bmain, Mesh *me)
 	men->key = BKE_key_copy(me->key);
 	if (men->key) men->key->from = (ID *)men;
 
+	if (me->id.lib) {
+		BKE_id_lib_local_paths(bmain, me->id.lib, &men->id);
+	}
+
 	return men;
 }
 
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index ce86e07..7414a85 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1202,6 +1202,10 @@ static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_
 	/* node tree will generate its own interface type */
 	newtree->interface_type = NULL;
 	
+	if (ntree->id.lib) {
+		BKE_id_lib_local_paths(bmain, ntree->id.lib, &newtree->id);
+	}
+
 	return newtree;
 }
 
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index d4a2c32..a9292ac 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1518,6 +1518,10 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
 	/* Copy runtime surve data. */
 	obn->curve_cache = NULL;
 
+	if (ob->id.lib) {
+		BKE_id_lib_local_paths(bmain, ob->id.lib, &obn->id);
+	}
+
 	return obn;
 }
 
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index dfc6285..4868fea 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -3701,6 +3701,10 @@ ParticleSettings *BKE_particlesettings_copy(ParticleSettings *part)
 
 	BLI_duplicatelist(&partn->dupliweights, &part->dupliweights);
 	
+	if (part->id.lib) {
+		BKE_id_lib_local_paths(G.main, part->id.lib, &partn->id);
+	}
+
 	return partn;
 }
 
diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c
index 08daa09..b11d0ae 100644
--- a/source/blender/blenkernel/intern/speaker.c
+++ b/source/blender/blenkernel/intern/speaker.c
@@ -67,6 +67,10 @@ Speaker *BKE_speaker_copy(Speaker *spk)
 	if (spkn->sound)
 		spkn->sound->id.us++;
 
+	if (spk->id.lib) {
+		BKE_id_lib_local_paths(G.main, spk->id.lib, &spkn->id);
+	}
+
 	return spkn;
 }
 
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 86c7f6f..3a311bf 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -455,17 +455,7 @@ Text *BKE_text_copy(Main *bmain, Text *ta)
 	
 	/* file name can be NULL */
 	if (ta->name) {
-		if (ta->id.lib && BLI_path_is_rel(ta->name)) {
-			char tname[FILE_MAXFILE];
-			/* If path is relative, and source is a lib, path is relative to lib file, not main one! */
-			BLI_strncpy(tname, ta->name, sizeof(tname));
-			BLI_path_abs(tname, ta->id.lib->filepath);
-			BLI_path_rel(tname, bmain->name);
-			tan->name = BLI_strdup(tname);
-		}
-		else {
-			tan->name = BLI_strdup(ta->name);
-		}
+		tan->name = BLI_strdup(ta->name);
 	}
 	else {
 		tan->name = NULL;
@@ -499,6 +489,10 @@ Te

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list