]> code.ossystems Code Review - openembedded-core.git/commitdiff
lib/oe/path.py: Add copytree function that works
authorRichard Purdie <rpurdie@linux.intel.com>
Fri, 6 Aug 2010 09:57:32 +0000 (10:57 +0100)
committerRichard Purdie <rpurdie@linux.intel.com>
Thu, 12 Aug 2010 13:41:31 +0000 (14:41 +0100)
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
meta/lib/oe/path.py

index 183f205757f310fd0a7fd34e86155f4cd42495fe..d671ce9216550c2b47cbc3199c063971fa4400ed 100644 (file)
@@ -1,3 +1,5 @@
+import shutil
+
 def join(*paths):
     """Like os.path.join but doesn't treat absolute RHS specially"""
     import os.path
@@ -43,6 +45,45 @@ def format_display(path, metadata):
     else:
         return rel
 
+
+class Error(EnvironmentError):
+    pass
+
+# Based on shutil.copytree but with features removed and 
+# No fatal error is dst already exists
+# Handle symlinks that already exist
+def copytree(src, dst):
+    names = os.listdir(src)
+
+    bb.mkdirhier(dst)
+
+    errors = []
+    for name in names:
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        try:
+            if os.path.islink(srcname):
+                linkto = os.readlink(srcname)
+                if os.path.lexists(dstname):
+                    os.unlink(dstname)
+                os.symlink(linkto, dstname)
+            elif os.path.isdir(srcname):
+                copytree(srcname, dstname)
+            else:
+                shutil.copy2(srcname, dstname)
+        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:
+        errors.extend((src, dst, str(why)))
+    if errors:
+        raise Error, errors
+
 def remove(path):
     """Equivalent to rm -f or rm -rf"""
     import os, errno, shutil, glob