In a few places we have checks to see path A is under path B, by adding
/ to the end of the path B and then seeing if path A starts with the
suffixed path B. Unfortunately there are two potential flaws: (1) path A
needs to be suffixed with / as well or the directory itself won't match
(semantics perhaps, but in a lot of scenarios returning True is
correct); (2) you need to run os.path.abspath() on both paths first or
you will wrongly return False for some relative paths where you should
return True. Let's solve this once and for all by writing a function
that takes care of these and put it in oe.path.

Signed-off-by: Paul Eggleton <paul.eggle...@linux.intel.com>
---
 meta/lib/oe/path.py | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py
index 1ea03d5d568..346b48f3641 100644
--- a/meta/lib/oe/path.py
+++ b/meta/lib/oe/path.py
@@ -237,3 +237,27 @@ def realpath(file, root, use_physdir = True, loop_cnt = 
100, assume_dir = False)
         raise
 
     return file
+
+def is_path_under(path1, possible_parent):
+    """
+    Return True if a path is underneath another, False otherwise.
+    Multiple paths to test can be specified (as a list or tuple) in
+    which case all specified test paths must be under the parent to
+    return True.
+    """
+    def abs_path_trailing(pth):
+        pth_abs = os.path.abspath(pth)
+        if not pth_abs.endswith(os.sep):
+            pth_abs += os.sep
+        return pth_abs
+
+    possible_parent_abs = abs_path_trailing(possible_parent)
+    if isinstance(path1, str):
+        testpaths = [path1]
+    else:
+        testpaths = path1
+    for path in testpaths:
+        path_abs = abs_path_trailing(path)
+        if not path_abs.startswith(possible_parent_abs):
+            return False
+    return True
-- 
2.14.3

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to