add 'which' implementation
authorKali Kaneko <kali@leap.se>
Thu, 14 Mar 2013 16:15:21 +0000 (01:15 +0900)
committerKali Kaneko <kali@leap.se>
Thu, 14 Mar 2013 16:15:21 +0000 (01:15 +0900)
src/leap/common/files.py

index 7c878e1..9b80236 100644 (file)
@@ -83,3 +83,45 @@ def mkdir_p(path):
             pass
         else:
             raise
+
+
+# Twisted implementation of which
+def which(name, flags=os.X_OK, path_extension="/usr/sbin:/sbin"):
+    """
+    Search PATH for executable files with the given name.
+
+    On newer versions of MS-Windows, the PATHEXT environment variable will be
+    set to the list of file extensions for files considered executable. This
+    will normally include things like ".EXE". This fuction will also find files
+    with the given name ending with any of these extensions.
+
+    On MS-Windows the only flag that has any meaning is os.F_OK. Any other
+    flags will be ignored.
+
+    @type name: C{str}
+    @param name: The name for which to search.
+
+    @type flags: C{int}
+    @param flags: Arguments to L{os.access}.
+
+    @rtype: C{list}
+    @param: A list of the full paths to files found, in the
+    order in which they were found.
+    """
+
+    result = []
+    exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep))
+    path = os.environ.get('PATH', None)
+    path += ":" + path_extension
+    if path is None:
+        return []
+    parts = path.split(os.pathsep)
+    for p in parts:
+        p = os.path.join(p, name)
+        if os.access(p, flags):
+            result.append(p)
+        for e in exts:
+            pext = p + e
+            if os.access(pext, flags):
+                result.append(pext)
+    return result