Bug 1385743 - Use copy_tree() to copy directory recursively instead. r?ehsan draft
authorTing-Yu Chou <janus926@gmail.com>
Thu, 17 Aug 2017 10:36:15 +0800
changeset 648618 9ddaaafa82776ee5e06e8eb4d842e369ca4d69c4
parent 647460 6ebc251bd288c268b020815025b05854ccde5c08
child 726879 a129ab312ff579e4ff9f0238e73b01587748e4fb
push id74816
push userbmo:janus926@gmail.com
push dateFri, 18 Aug 2017 02:03:30 +0000
reviewersehsan
bugs1385743
milestone57.0a1
Bug 1385743 - Use copy_tree() to copy directory recursively instead. r?ehsan shutil.copy2() will fail if the destination directory doesn't exist. Switch to copy_tree() instead so we don't need to worry about the error cases of copy2() and copytree(). MozReview-Commit-ID: 3kHfgL57KfX
build/build-clang/build-clang.py
--- a/build/build-clang/build-clang.py
+++ b/build/build-clang/build-clang.py
@@ -12,26 +12,27 @@ import json
 import argparse
 import tempfile
 import glob
 import errno
 import re
 from contextlib import contextmanager
 import sys
 import which
+from distutils.dir_util import copy_tree
 
 
 def symlink(source, link_name):
     os_symlink = getattr(os, "symlink", None)
     if callable(os_symlink):
         os_symlink(source, link_name)
     else:
         if os.path.isdir(source):
             # Fall back to copying the directory :(
-            copy_dir_contents(source, link_name)
+            copy_tree(source, link_name)
 
 
 def check_run(args):
     print >> sys.stderr, ' '.join(args)
     r = subprocess.call(args)
     assert r == 0
 
 
@@ -87,37 +88,16 @@ def build_tar_package(tar, name, base, d
         name = re.sub(r'^([A-Za-z]):', f, name)
     run_in(base, [tar,
                   "-c",
                   "-%s" % ("J" if ".xz" in name else "j"),
                   "-f",
                   name, directory])
 
 
-def copy_dir_contents(src, dest):
-    for f in glob.glob("%s/*" % src):
-        try:
-            destname = "%s/%s" % (dest, os.path.basename(f))
-            if os.path.isdir(f):
-                shutil.copytree(f, destname)
-            else:
-                shutil.copy2(f, destname)
-        except OSError as e:
-            if e.errno == errno.ENOTDIR:
-                shutil.copy2(f, destname)
-            elif e.errno == errno.EEXIST:
-                if os.path.isdir(f):
-                    copy_dir_contents(f, destname)
-                else:
-                    os.remove(destname)
-                    shutil.copy2(f, destname)
-            else:
-                raise Exception('Directory not copied. Error: %s' % e)
-
-
 def mkdir_p(path):
     try:
         os.makedirs(path)
     except OSError as e:
         if e.errno != errno.EEXIST or not os.path.isdir(path):
             raise
 
 
@@ -135,23 +115,23 @@ def install_libgcc(gcc_dir, clang_dir):
     out = subprocess.check_output([os.path.join(gcc_dir, "bin", "gcc"),
                                    '-print-libgcc-file-name'])
 
     libgcc_dir = os.path.dirname(out.rstrip())
     clang_lib_dir = os.path.join(clang_dir, "lib", "gcc",
                                  "x86_64-unknown-linux-gnu",
                                  os.path.basename(libgcc_dir))
     mkdir_p(clang_lib_dir)
-    copy_dir_contents(libgcc_dir, clang_lib_dir)
+    copy_tree(libgcc_dir, clang_lib_dir)
     libgcc_dir = os.path.join(gcc_dir, "lib64")
     clang_lib_dir = os.path.join(clang_dir, "lib")
-    copy_dir_contents(libgcc_dir, clang_lib_dir)
+    copy_tree(libgcc_dir, clang_lib_dir)
     include_dir = os.path.join(gcc_dir, "include")
     clang_include_dir = os.path.join(clang_dir, "include")
-    copy_dir_contents(include_dir, clang_include_dir)
+    copy_tree(include_dir, clang_include_dir)
 
 
 def install_import_library(build_dir, clang_dir):
     shutil.copy2(os.path.join(build_dir, "lib", "clang.lib"),
                  os.path.join(clang_dir, "lib"))
 
 
 def svn_co(source_dir, url, directory, revision):