From 19be6b407c6595f1d975d249bee3bf4271f0946f Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 6 Aug 2010 10:57:32 +0100 Subject: lib/oe/path.py: Add copytree function that works Signed-off-by: Richard Purdie --- meta/lib/oe/path.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'meta/lib') 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 -- cgit v1.2.3-54-g00ecf