Patchwork [1/3] path.py: add make_relative_symlink method

login
register
mail settings
Submitter Scott Garman
Date March 13, 2012, 2:08 a.m.
Message ID <bf65cecf177efa0cb06508aa95e63e4d3a65dcb1.1331604310.git.scott.a.garman@intel.com>
Download mbox | patch
Permalink /patch/23097/
State Accepted
Commit 71062c1e0fb45a4b4e58ea5d217706aa2b402d88
Headers show

Comments

Scott Garman - March 13, 2012, 2:08 a.m.
This method allows you to convert an absolute symlink into a
relative one.

Signed-off-by: Scott Garman <scott.a.garman@intel.com>
---
 meta/lib/oe/path.py |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

Patch

diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py
index 683b097..1fdfa87 100644
--- a/meta/lib/oe/path.py
+++ b/meta/lib/oe/path.py
@@ -40,6 +40,33 @@  def relative(src, dest):
 
         return os.path.sep.join(relpath)
 
+def make_relative_symlink(path):
+    """ Convert an absolute symlink to a relative one """
+    if not os.path.islink(path):
+        return
+    link = os.readlink(path)
+    if not os.path.isabs(link):
+        return
+
+    # find the common ancestor directory
+    ancestor = path
+    depth = 0
+    while ancestor and not link.startswith(ancestor):
+        ancestor = ancestor.rpartition('/')[0]
+        depth += 1
+
+    if not ancestor:
+        print "make_relative_symlink() Error: unable to find the common ancestor of %s and its target" % path
+        return
+
+    base = link.partition(ancestor)[2].strip('/')
+    while depth > 1:
+        base = "../" + base
+        depth -= 1
+
+    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", True), path)