[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21705] branches/blender2.5/blender: - Support for importing python packages.

Campbell Barton ideasman42 at gmail.com
Sun Jul 19 19:45:14 CEST 2009


Revision: 21705
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21705
Author:   campbellbarton
Date:     2009-07-19 19:45:14 +0200 (Sun, 19 Jul 2009)

Log Message:
-----------
- Support for importing python packages. (directories of python scripts containing an __init__.py)
- BLI_add_slash returns the new string length.
- BLI_where_am_i() would often have /./ in the path (not incorrect but annoying, got into python exceptions)
- release/ui/space_image.py, py error referencing invalid keyword args.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/space_image.py
    branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
    branches/blender2.5/blender/source/blender/blenlib/BLI_fileops.h
    branches/blender2.5/blender/source/blender/blenlib/intern/fileops.c
    branches/blender2.5/blender/source/blender/blenlib/intern/util.c
    branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c

Modified: branches/blender2.5/blender/release/ui/space_image.py
===================================================================
--- branches/blender2.5/blender/release/ui/space_image.py	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/release/ui/space_image.py	2009-07-19 17:45:14 UTC (rev 21705)
@@ -223,7 +223,7 @@
 			if show_uvedit:
 				row.itemM("IMAGE_MT_uvs")
 
-		layout.template_ID(sima, "image", new="image.new", open="image.open")
+		layout.template_ID(sima, "image", new="image.new") # open="image.open"
 
 		"""
 		/* image select */

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c	2009-07-19 17:45:14 UTC (rev 21705)
@@ -196,15 +196,14 @@
 		
 		snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */
 		BLI_convertstringcode(filename, blendfilename);
-		BLI_add_slash(filename);
-		return strlen(filename);
+		return BLI_add_slash(filename); /* new strlen() */
 	}
 	
 	/* use the temp path. this is weak but better then not using point cache at all */
 	/* btempdir is assumed to exist and ALWAYS has a trailing slash */
 	snprintf(filename, MAX_PTCACHE_PATH, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid()));
-	BLI_add_slash(filename);
-	return strlen(filename);
+	
+	return BLI_add_slash(filename); /* new strlen() */
 }
 
 static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, short do_path, short do_ext)

Modified: branches/blender2.5/blender/source/blender/blenlib/BLI_fileops.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/BLI_fileops.h	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/blenlib/BLI_fileops.h	2009-07-19 17:45:14 UTC (rev 21705)
@@ -53,7 +53,7 @@
 int   BLI_move(char *file, char *to);
 int   BLI_touch(const char *file);
 char *BLI_last_slash(const char *string);
-void  BLI_add_slash(char *string);
+int	  BLI_add_slash(char *string);
 void  BLI_del_slash(char *string);
 char *first_slash(char *string);
 

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/fileops.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/fileops.c	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/fileops.c	2009-07-19 17:45:14 UTC (rev 21705)
@@ -83,19 +83,22 @@
 }
 
 /* adds a slash if there isnt one there alredy */
-void BLI_add_slash(char *string) {
+int BLI_add_slash(char *string) {
 	int len = strlen(string);
 #ifdef WIN32
 	if (len==0 || string[len-1]!='\\') {
 		string[len] = '\\';
 		string[len+1] = '\0';
+		return len+1;
 	}
 #else
 	if (len==0 || string[len-1]!='/') {
 		string[len] = '/';
 		string[len+1] = '\0';
+		return len+1;
 	}
 #endif
+	return len;
 }
 
 /* removes a slash if there is one */

Modified: branches/blender2.5/blender/source/blender/blenlib/intern/util.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenlib/intern/util.c	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/blenlib/intern/util.c	2009-07-19 17:45:14 UTC (rev 21705)
@@ -499,9 +499,8 @@
 	int len;
 	int slashes = 0;
 	BLI_clean(path);
-	BLI_add_slash(path);
+	len = BLI_add_slash(path) - 1;
 
-	len = strlen(path)-1;
 	while (len>=0) {
 		if ((path[len] == '\\') || (path[len] == '/'))
 			slashes++;
@@ -1276,23 +1275,13 @@
 /* simple appending of filename to dir, does not check for valid path! */
 void BLI_join_dirfile(char *string, const char *dir, const char *file)
 {
-	int sl_dir = strlen(dir);
-	BLI_strncpy(string, dir, FILE_MAX);
-	if (sl_dir > FILE_MAX-1) sl_dir = FILE_MAX-1;
+	int sl_dir;
 	
-	/* only add seperator if needed */
-#ifdef WIN32
-	if (string[sl_dir-1] != '\\') {
-		string[sl_dir] = '\\';
-		sl_dir++;
-	}
-#else
-	if (string[sl_dir-1] != '/') {
-		string[sl_dir] = '/';
-		sl_dir++;
-	}
-#endif
+	if(string != dir) /* compare pointers */
+		BLI_strncpy(string, dir, FILE_MAX);
 	
+	sl_dir= BLI_add_slash(string);
+	
 	if (sl_dir <FILE_MAX) {
 		BLI_strncpy(string + sl_dir, file, FILE_MAX-sl_dir);
 	}
@@ -1343,13 +1332,13 @@
 {
 	char filename[FILE_MAXDIR+FILE_MAXFILE];
 	char *path = NULL, *temp;
-	int len;
+	
 #ifdef _WIN32
 	char *seperator = ";";
-	char *slash = "\\";
+	char slash = '\\';
 #else
 	char *seperator = ":";
-	char *slash = "/";
+	char slash = '/';
 #endif
 
 	
@@ -1369,11 +1358,13 @@
 		if (name[0] == '.') {
 			// relative path, prepend cwd
 			BLI_getwdN(fullname);
-			len = strlen(fullname);
-			if (len && fullname[len -1] != slash[0]) {
-				strcat(fullname, slash);
-			}
-			strcat(fullname, name);
+			
+			// not needed but avoids annoying /./ in name
+			if(name && name[0]=='.' && name[1]==slash)
+				BLI_join_dirfile(fullname, fullname, name+2);
+			else
+				BLI_join_dirfile(fullname, fullname, name);
+			
 			add_win32_extension(fullname);
 		} else if (BLI_last_slash(name)) {
 			// full path
@@ -1392,11 +1383,7 @@
 					} else {
 						strncpy(filename, path, sizeof(filename));
 					}
-					len = strlen(filename);
-					if (len && filename[len - 1] != slash[0]) {
-						strcat(filename, slash);
-					}
-					strcat(filename, name);
+					BLI_join_dirfile(fullname, fullname, name);
 					if (add_win32_extension(filename)) {
 						strcpy(fullname, filename);
 						break;

Modified: branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/editors/space_file/file_ops.c	2009-07-19 17:45:14 UTC (rev 21705)
@@ -716,7 +716,6 @@
 				while ( (*d == '\\') || (*d == '/') )
 					d++;
 				BLI_strncpy(homestr,  BLI_gethome(), FILE_MAX);
-				BLI_add_slash(homestr);
 				BLI_join_dirfile(tmpstr, homestr, d);
 				BLI_strncpy(sfile->params->dir, tmpstr, sizeof(sfile->params->dir));
 			}

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c	2009-07-19 17:44:44 UTC (rev 21704)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c	2009-07-19 17:45:14 UTC (rev 21705)
@@ -28,6 +28,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_util.h"
+#include "BLI_fileops.h"
 #include "BLI_string.h"
 
 #include "BKE_context.h"
@@ -441,6 +442,26 @@
 #include "PIL_time.h"
 #endif
 
+/* for use by BPY_run_ui_scripts only */
+static int bpy_import_module(char *modname, int reload)
+{
+	PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
+	if (mod) {
+		if (reload) {
+			PyObject *mod_orig= mod;
+			mod= PyImport_ReloadModule(mod);
+			Py_DECREF(mod_orig);
+		}
+	}
+
+	if(mod) {
+		Py_DECREF(mod); /* could be NULL from reloading */
+		return 0;
+	} else {
+		return -1;
+	}
+}
+
 /* XXX this is temporary, need a proper script registration system for 2.5 */
 void BPY_run_ui_scripts(bContext *C, int reload)
 {
@@ -453,10 +474,9 @@
 	char *dirname;
 	char path[FILE_MAX];
 	char *dirs[] = {"ui", "io", NULL};
-	int a;
+	int a, err;
 	
 	PyGILState_STATE gilstate;
-	PyObject *mod;
 	PyObject *sys_path;
 
 	gilstate = PyGILState_Ensure();
@@ -486,27 +506,32 @@
 		while((de = readdir(dir)) != NULL) {
 			/* We could stat the file but easier just to let python
 			 * import it and complain if theres a problem */
+			err = 0;
 
-			file_extension = strstr(de->d_name, ".py");
-			
-			if(file_extension && file_extension[3] == '\0') {
-				BLI_strncpy(path, de->d_name, (file_extension - de->d_name) + 1); /* cut off the .py on copy */
-				mod= PyImport_ImportModuleLevel(path, NULL, NULL, NULL, 0);
-				if (mod) {
-					if (reload) {
-						PyObject *mod_orig= mod;
-						mod= PyImport_ReloadModule(mod);
-						Py_DECREF(mod_orig);
-					}
+			if (de->d_name[0] == '.') {
+				/* do nothing, probably .svn */
+			}
+			else if(de->d_type==DT_DIR) {
+				/* support packages */
+				BLI_join_dirfile(path, dirname, de->d_name);
+				BLI_join_dirfile(path, path, "__init__.py");
+
+				if(BLI_exists(path)) {
+					bpy_import_module(de->d_name, reload);
 				}
+			} else {
+				/* normal py files */
+				file_extension = strstr(de->d_name, ".py");
 				
-				if(mod) {
-					Py_DECREF(mod); /* could be NULL from reloading */
-				} else {
-					BPy_errors_to_report(NULL);
-					fprintf(stderr, "unable to import \"%s\"  %s/%s\n", path, dirname, de->d_name);
+				if(file_extension && file_extension[3] == '\0') {
+					de->d_name[(file_extension - de->d_name) + 1] = '\0';
+					bpy_import_module(de->d_name, reload);
 				}
+			}
 
+			if(err==-1) {
+				BPy_errors_to_report(NULL);
+				fprintf(stderr, "unable to import %s/%s\n", dirname, de->d_name);
 			}
 		}
 





More information about the Bf-blender-cvs mailing list