<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -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(&quot;---- %s ----&quot; % subdir)
   src = join(conf.srcdir, subdir)
@@ -45,7 +88,7 @@ def conf_subproject (conf, subdir, command=None):
   default_tgt = join(conf.blddir, &quot;default&quot;, subdir)
 
   if not os.path.exists(default_tgt):
-    shutil.copytree(src, default_tgt)
+    copytree(src, default_tgt, True)
 
   if command:
     if os.system(&quot;cd %s &amp;&amp; %s&quot; % (default_tgt, command)) != 0:
@@ -54,7 +97,7 @@ def conf_subproject (conf, subdir, command=None):
   debug_tgt = join(conf.blddir, &quot;debug&quot;, 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')</diff>
      <filename>wscript</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4ba5b7e24b86cb533c61320656f94f0d72359d52</id>
    </parent>
  </parents>
  <author>
    <name>Ryan Dahl</name>
    <email>ry@tinyclouds.org</email>
  </author>
  <url>http://github.com/ujh/node/commit/18da8ffaeed3cf2bd3c5225a8f451db7e2883d73</url>
  <id>18da8ffaeed3cf2bd3c5225a8f451db7e2883d73</id>
  <committed-date>2009-09-28T13:39:00-07:00</committed-date>
  <authored-date>2009-09-28T13:39:00-07:00</authored-date>
  <message>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 &quot;/path/to/node/tools/waf&quot;, line 148, in ?
      Scripting.prepare(t, cwd, VERSION, wafdir)
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py&quot;, line 102, in prepare
      prepare_impl(t,cwd,ver,wafdir)
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py&quot;, line 95, in prepare_impl
      main()
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py&quot;, line 130, in main
      fun(ctx)
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Scripting.py&quot;, line 168, in configure
      conf.sub_config([''])
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Configure.py&quot;, line 100, in sub_config
      self.recurse(k,name='configure')
    File &quot;/path/to/node/tools/.waf-1.5.8-3e327cd9534c48e6762f56fdb1332663/wafadmin/Utils.py&quot;, line 391, in recurse
      f(self)
    File &quot;&lt;string&gt;&quot;, line 82, in configure
    File &quot;&lt;string&gt;&quot;, line 48, in conf_subproject
    File &quot;/usr/lib/python2.4/shutil.py&quot;, 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.</message>
  <tree>f5001fa371e6bb6637373058e49f17eafe5e179c</tree>
  <committer>
    <name>Ryan Dahl</name>
    <email>ry@tinyclouds.org</email>
  </committer>
</commit>
