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.

(From OE-Core rev: ca276fe139129eec383d77768ba91b808c462b04)

Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Christopher Larson 2018-06-22 02:08:19 +05:00 committed by Richard Purdie
parent 7cb125d7ee
commit b0527c08d4

View File

@ -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