[oe-commits] [openembedded-core] 17/84: oe/copy_buildsystem.py: dereference symlink

git at git.openembedded.org git at git.openembedded.org
Sun Nov 6 10:28:34 UTC 2016


rpurdie pushed a commit to branch master-next
in repository openembedded-core.

commit 1bab054b6e1fc831f6be0aa6f5c6bccaf19d8a76
Author: Robert Yang <liezhi.yang at windriver.com>
AuthorDate: Mon Oct 31 08:48:58 2016 -0700

    oe/copy_buildsystem.py: dereference symlink
    
    When there is a relative symlink in the layer, for example:
    symA -> ../out/of/layer/file
    
    symA will be invalid fater copied, it would be invalid from build time
    if it points to a relative path, and would be invalid after extracted
    the sdk if it points to a absolute py. Dereference symlink when copy
    will fix the problem.
    
    Use tar rather than shutil.copytree() to copy is because:
    1) shutil.copytree(symlinks=Fasle) has bugs when dereference symlinks:
       https://bugs.python.org/issue21697
       And Ubunutu 1404 doesn't upgrade python3 to fix the problem.
    
    2) shutil.copytree(symlinks=False) raises errors when there is a invalid
       symlink, and tar just prints a warning, tar is preferred here since
       the real world is unpredicatable
    
    3) tar is faster than shutil.copytree() as said by oe.path.copytree()
    
    So use tar to copy.
    
    Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
    Signed-off-by: Ross Burton <ross.burton at intel.com>
---
 meta/lib/oe/copy_buildsystem.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oe/copy_buildsystem.py b/meta/lib/oe/copy_buildsystem.py
index afaff68..29ac6d4 100644
--- a/meta/lib/oe/copy_buildsystem.py
+++ b/meta/lib/oe/copy_buildsystem.py
@@ -4,11 +4,15 @@ import stat
 import shutil
 
 def _smart_copy(src, dest):
+    import subprocess
     # smart_copy will choose the correct function depending on whether the
     # source is a file or a directory.
     mode = os.stat(src).st_mode
     if stat.S_ISDIR(mode):
-        shutil.copytree(src, dest, symlinks=True, ignore=shutil.ignore_patterns('.git'))
+        bb.utils.mkdirhier(dest)
+        cmd = "tar --exclude='.git' --xattrs --xattrs-include='*' -chf - -C %s -p . \
+        | tar --xattrs --xattrs-include='*' -xf - -C %s" % (src, dest)
+        subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
     else:
         shutil.copyfile(src, dest)
         shutil.copymode(src, dest)

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list