From 6b9f9771a51450e48d47a816833d100b6ec178bd Mon Sep 17 00:00:00 2001
From: Martin Poirier <theeth@yahoo.com>
Date: Sat, 25 Feb 2012 15:38:28 +0000
Subject: [PATCH] [#30235] Net Render Master/Slave Not Working in OSX (Blender
 v2.62 32 Bit)

Reported by Ron Proctor

netrender didn't recursively create missing directory for user specified temporary paths.

Also added environment variables and user expansion to properly support env vars and user (~ and ~user) in paths.
---
 netrender/client.py |  4 +---
 netrender/master.py |  6 ++----
 netrender/slave.py  |  6 ++----
 netrender/utils.py  | 24 +++++++++++++++++++-----
 4 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/netrender/client.py b/netrender/client.py
index 069d5bdb8..f246dcd8c 100644
--- a/netrender/client.py
+++ b/netrender/client.py
@@ -443,9 +443,7 @@ class NetworkRenderEngine(bpy.types.RenderEngine):
             result_path = os.path.join(bpy.path.abspath(netsettings.path), "output.exr")
             
             folder = os.path.split(result_path)[0]
-            
-            if not os.path.exists(folder):
-                os.mkdir(folder)
+            verifyCreateDir(folder)
 
             f = open(result_path, "wb")
 
diff --git a/netrender/master.py b/netrender/master.py
index d5989f8c3..69a185b1d 100644
--- a/netrender/master.py
+++ b/netrender/master.py
@@ -979,8 +979,7 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
         else:
             self.path = path
 
-        if not os.path.exists(self.path):
-            os.mkdir(self.path)
+        verifyCreateDir(self.path)
 
         self.slave_timeout = 5 # 5 mins: need a parameter for that
 
@@ -1105,8 +1104,7 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
 
         # create job directory
         job.save_path = os.path.join(self.path, "job_" + job.id)
-        if not os.path.exists(job.save_path):
-            os.mkdir(job.save_path)
+        verifyCreateDir(job.save_path)
 
         job.save()
 
diff --git a/netrender/slave.py b/netrender/slave.py
index fe3979a72..d8d82e8dd 100644
--- a/netrender/slave.py
+++ b/netrender/slave.py
@@ -144,8 +144,7 @@ def render_slave(engine, netsettings, threads):
         slave_id = response.getheader("slave-id")
 
         NODE_PREFIX = os.path.join(slave_path, "slave_" + slave_id)
-        if not os.path.exists(NODE_PREFIX):
-            os.mkdir(NODE_PREFIX)
+        verifyCreateDir(NODE_PREFIX)
 
         engine.update_stats("", "Network render connected to master, waiting for jobs")
 
@@ -161,8 +160,7 @@ def render_slave(engine, netsettings, threads):
                 engine.update_stats("", "Network render processing job from master")
 
                 JOB_PREFIX = os.path.join(NODE_PREFIX, "job_" + job.id)
-                if not os.path.exists(JOB_PREFIX):
-                    os.mkdir(JOB_PREFIX)
+                verifyCreateDir(JOB_PREFIX)
 
                 # set tempdir for fsaa temp files
                 # have to set environ var because render is done in a subprocess and that's the easiest way to propagate the setting
diff --git a/netrender/utils.py b/netrender/utils.py
index c173e02db..7a2abb6be 100644
--- a/netrender/utils.py
+++ b/netrender/utils.py
@@ -269,6 +269,23 @@ def hashData(data):
     m.update(data)
     return m.hexdigest()
 
+def verifyCreateDir(directory_path):
+    original_path = directory_path
+    directory_path = os.path.expanduser(directory_path)
+    directory_path = os.path.expandvars(directory_path)
+    if not os.path.exists(directory_path):
+        try:
+            os.makedirs(directory_path)
+            print("Created directory:", directory_path)
+            if original_path != directory_path:
+                print("Expanded from the following path:", original_path)
+        except:
+            print("Couldn't create directory:", directory_path)
+            if original_path != directory_path:
+                print("Expanded from the following path:", original_path)
+            raise
+    
+
 def cacheName(ob, point_cache):
     name = point_cache.name
     if name == "":
@@ -332,9 +349,7 @@ def createLocalPath(rfile, prefixdirectory, prefixpath, forcelocal):
                     suffix = os.path.join(last, suffix)
 
                 directory = os.path.join(prefixdirectory, suffix)
-                
-                if not os.path.exists(directory):
-                    os.mkdir(directory)
+                verifyCreateDir(directory)
 
                 finalpath = os.path.join(directory, name)
             else:
@@ -350,8 +365,7 @@ def createLocalPath(rfile, prefixdirectory, prefixpath, forcelocal):
         directory = directory.replace("../")
         directory = os.path.join(prefixdirectory, directory)
 
-        if not os.path.exists(directory):
-            os.mkdir(directory)
+        verifyCreateDir(directory)
 
         finalpath = os.path.join(directory, name)
 
-- 
GitLab