diff options
author | Christopher Larson <chris_larson@mentor.com> | 2018-06-22 02:08:19 +0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-07-02 22:06:06 +0100 |
commit | ca276fe139129eec383d77768ba91b808c462b04 (patch) | |
tree | 583be876871d9653786dd51e3dae3f3fec6891c7 /meta | |
parent | ae48ee6627e6c1c4f1fcc4ead40edc968e64f7fe (diff) | |
download | openembedded-core-ca276fe139129eec383d77768ba91b808c462b04.tar.gz openembedded-core-ca276fe139129eec383d77768ba91b808c462b04.tar.bz2 openembedded-core-ca276fe139129eec383d77768ba91b808c462b04.zip |
oe.path: add which_wild function
This is a function much like shutil.which or bb.utils.which, retaining
shutil.which-like function semantics, bb.utils.which's support for
returning available candidates for signatures, and most importantly,
supports wildcards, returning only the first occurrance of each found
pathname in the search path.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/lib/oe/path.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py index 76c58fa760..be02218c31 100644 --- a/meta/lib/oe/path.py +++ b/meta/lib/oe/path.py @@ -259,3 +259,37 @@ def is_path_parent(possible_parent, *paths): if not path_abs.startswith(possible_parent_abs): return False return True + +def which_wild(pathname, path=None, mode=os.F_OK, *, reverse=False, candidates=False): + """Search a search path for pathname, supporting wildcards. + + Return all paths in the specific search path matching the wildcard pattern + in pathname, returning only the first encountered for each file. If + candidates is True, information on all potential candidate paths are + included. + """ + paths = (path or os.environ.get('PATH', os.defpath)).split(':') + if reverse: + paths.reverse() + + seen, files = set(), [] + for index, element in enumerate(paths): + if not os.path.isabs(element): + element = os.path.abspath(element) + + candidate = os.path.join(element, pathname) + globbed = glob.glob(candidate) + if globbed: + for found_path in sorted(globbed): + if not os.access(found_path, mode): + continue + rel = os.path.relpath(found_path, element) + if rel not in seen: + seen.add(rel) + if candidates: + files.append((found_path, [os.path.join(p, rel) for p in paths[:index+1]])) + else: + files.append(found_path) + + return files + |