]> code.ossystems Code Review - openembedded-core.git/commitdiff
lib/oe/path: Add replace_absolute_symlinks function
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 8 Feb 2017 15:08:54 +0000 (15:08 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 9 Feb 2017 10:50:54 +0000 (10:50 +0000)
We need a function to walk a directory and replace absolute symlinks with
relative ones. Add such a function to the path module of lib/oe.

It does this relative to the directory being walked for files.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/lib/oe/path.py

index d4685403c5070a70b40fede6de78bf2e4fdaf783..a2a50c5b396ea3fa45d9a07e4cdc746c93be0e80 100644 (file)
@@ -50,6 +50,27 @@ def make_relative_symlink(path):
     os.remove(path)
     os.symlink(base, path)
 
+def replace_absolute_symlinks(basedir, d):
+    """
+    Walk basedir looking for absolute symlinks and replacing them with relative ones.
+    The absolute links are assumed to be relative to basedir
+    (compared to make_relative_symlink above which tries to compute common ancestors
+    using pattern matching instead)
+    """
+    for walkroot, dirs, files in os.walk(basedir):
+        for file in files + dirs:
+            path = os.path.join(walkroot, file)
+            if not os.path.islink(path):
+                continue
+            link = os.readlink(path)
+            if not os.path.isabs(link):
+                continue
+            walkdir = os.path.dirname(path.rpartition(basedir)[2])
+            base = os.path.relpath(link, walkdir)
+            bb.debug(2, "Replacing absolute path %s with relative path %s" % (link, base))
+            os.remove(path)
+            os.symlink(base, path)
+
 def format_display(path, metadata):
     """ Prepare a path for display to the user. """
     rel = relative(metadata.getVar("TOPDIR"), path)