diff options
author | Richard Purdie <rpurdie@linux.intel.com> | 2010-08-06 10:57:32 +0100 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-08-12 14:41:31 +0100 |
commit | 19be6b407c6595f1d975d249bee3bf4271f0946f (patch) | |
tree | 6984ba9b9d64ad684409d972abc274031ee9b232 /meta/lib | |
parent | a5884df90d628b2dc13ac83c9d8045afa6b2a120 (diff) | |
download | openembedded-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.py | 41 |
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 |