From 18da8ffaeed3cf2bd3c5225a8f451db7e2883d73 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Mon, 28 Sep 2009 22:39:00 +0200 Subject: [PATCH] Copy Python's shutil.copytree into wscript. It's broken in Python 2.4.4. One gets this message when trying to run configure: [...] Checking for SYS_clock_gettime : ok Checking for library rt : ok Checking for function clock_gettime : ok Checking for function nanosleep : ok Checking for function ceil : ok ---- deps/udns ---- Traceback (most recent call last): File "/path/to/node/tools/waf", line 148, in ? Scripting.prepare(t, cwd, VERSION, wafdir) File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py", line 102, in prepare prepare_impl(t,cwd,ver,wafdir) File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py", line 95, in prepare_impl main() File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py", line 130, in main fun(ctx) File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py", line 168, in configure conf.sub_config(['']) File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Configure.py", line 100, in sub_config self.recurse(k,name='configure') File "/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Utils.py", line 391, in recurse f(self) File "", line 82, in configure File "", line 48, in conf_subproject File "/usr/lib/python2.4/shutil.py", line 111, in copytree os.mkdir(dst) OSError: [Errno 2] No such file or directory: '/sites/rabidlabs.net/sandboxes/m/public_html/projects/0909.node/node/build/default/deps/udns' The problem is probably this: http://mail.python.org/pipermail/python-bugs-list/2005-January/027118.html As a solution I am copying 2.6's version of the function in. --- wscript | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/wscript b/wscript index 4740b225d5..63a155bfe9 100644 --- a/wscript +++ b/wscript @@ -37,6 +37,49 @@ def mkdir_p(dir): if not os.path.exists (dir): os.makedirs (dir) +# Copied from Python 2.6 because 2.4.4 at least is broken by not using +# mkdirs +# http://mail.python.org/pipermail/python-bugs-list/2005-January/027118.html +def copytree(src, dst, symlinks=False, ignore=None): + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if symlinks and os.path.islink(srcname): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore) + else: + shutil.copy2(srcname, dstname) + # XXX What about devices, sockets etc.? + except (IOError, os.error), why: + errors.append((srcname, dstname, str(why))) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error, err: + errors.extend(err.args[0]) + try: + shutil.copystat(src, dst) + except OSError, why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error, errors + def conf_subproject (conf, subdir, command=None): print("---- %s ----" % subdir) src = join(conf.srcdir, subdir) @@ -45,7 +88,7 @@ def conf_subproject (conf, subdir, command=None): default_tgt = join(conf.blddir, "default", subdir) if not os.path.exists(default_tgt): - shutil.copytree(src, default_tgt) + copytree(src, default_tgt, True) if command: if os.system("cd %s && %s" % (default_tgt, command)) != 0: @@ -54,7 +97,7 @@ def conf_subproject (conf, subdir, command=None): debug_tgt = join(conf.blddir, "debug", subdir) if not os.path.exists(debug_tgt): - shutil.copytree(default_tgt, debug_tgt) + copytree(default_tgt, debug_tgt, True) def configure(conf): conf.check_tool('compiler_cxx')