From 4fbe4261514e5dd896cf6fa213c838a184d0bc9a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 12 Aug 2013 07:44:38 +0000 Subject: bpy.path.reduce_dirs() - new utility function to de-duplicate and remove nested paths before doing a recursive search. --- release/scripts/modules/bpy/path.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'release') diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py index cfc0f474215..33039fa8494 100644 --- a/release/scripts/modules/bpy/path.py +++ b/release/scripts/modules/bpy/path.py @@ -35,6 +35,7 @@ __all__ = ( "extensions_audio", "is_subdir", "module_names", + "reduce_dirs", "relpath", "resolve_ncase", ) @@ -304,3 +305,27 @@ def basename(path): Use for Windows compatibility. """ return _os.path.basename(path[2:] if path[:2] in {"//", b"//"} else path) + + +def reduce_dirs(dirs): + """ + Given a sequence of directories, remove duplicates and + any directories nested in one of the other paths. + (Useful for recursive path searching). + + :arg dirs: Sequence of directory paths. + :type dirs: sequence + :return: A unique list of paths. + :rtype: list + """ + dirs = list({_os.path.normpath(_os.path.abspath(d)) for d in dirs}) + dirs.sort(key=lambda d: len(d)) + for i in range(len(dirs) -1, -1, -1): + for j in range(i): + print(i, j) + if len(dirs[i]) == len(dirs[j]): + break + elif is_subdir(dirs[i], dirs[j]): + del dirs[i] + break + return dirs -- cgit v1.2.3