base.bbclass: Add base_path_relative.
authorChris Larson <clarson@mvista.com>
Fri, 13 Mar 2009 20:35:56 +0000 (13:35 -0700)
committerChris Larson <clarson@kergoth.com>
Sun, 22 Mar 2009 03:40:53 +0000 (20:40 -0700)
base_path_relative returns a relative path from src to dest.

Examples:

>>> base_path_relative("/usr/bin", "/tmp/foo/bar")
../../tmp/foo/bar

>>> base_path_relative("/usr/bin", "/usr/lib")
../lib

>>> base_path_relative("/tmp", "/tmp/foo/bar")
foo/bar

Signed-off-by: Chris Larson <clarson@mvista.com>
classes/base.bbclass

index 11f6554..9bcd2ab 100644 (file)
@@ -10,6 +10,35 @@ def base_path_join(a, *p):
             path += '/' + b
     return path
 
+def base_path_relative(src, dest):
+    """ Return a relative path from src to dest.
+
+    >>> base_path_relative("/usr/bin", "/tmp/foo/bar")
+    ../../tmp/foo/bar
+
+    >>> base_path_relative("/usr/bin", "/usr/lib")
+    ../lib
+
+    >>> base_path_relative("/tmp", "/tmp/foo/bar")
+    foo/bar
+    """
+    from os.path import sep, pardir, normpath, commonprefix
+
+    destlist = normpath(dest).split(sep)
+    srclist = normpath(src).split(sep)
+
+    # Find common section of the path
+    common = commonprefix([destlist, srclist])
+    commonlen = len(common)
+
+    # Climb back to the point where they differentiate
+    relpath = [ pardir ] * (len(srclist) - commonlen)
+    if commonlen < len(destlist):
+        # Add remaining portion
+        relpath += destlist[commonlen:]
+
+    return sep.join(relpath)
+
 # for MD5/SHA handling
 def base_chk_load_parser(config_path):
     import ConfigParser, os, bb