summaryrefslogtreecommitdiff
path: root/meta/lib
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-08-06 10:57:32 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-08-12 14:41:31 +0100
commit19be6b407c6595f1d975d249bee3bf4271f0946f (patch)
tree6984ba9b9d64ad684409d972abc274031ee9b232 /meta/lib
parenta5884df90d628b2dc13ac83c9d8045afa6b2a120 (diff)
downloadopenembedded-core-19be6b407c6595f1d975d249bee3bf4271f0946f.tar.gz
openembedded-core-19be6b407c6595f1d975d249bee3bf4271f0946f.tar.bz2
openembedded-core-19be6b407c6595f1d975d249bee3bf4271f0946f.zip
lib/oe/path.py: Add copytree function that works
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'meta/lib')
-rw-r--r--meta/lib/oe/path.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py
index 183f205757..d671ce9216 100644
--- a/meta/lib/oe/path.py
+++ b/meta/lib/oe/path.py
@@ -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