query
On this page

locateDominatingFile

lib.filesystem.locateDominatingFile

Docs pulled from | This Revision | about 2 hours ago


Find the first directory containing a file matching 'pattern' upward from a given 'file'. Returns 'null' if no directories contain a file matching 'pattern'.

Inputs

pattern

The pattern to search for

file

The file to start searching upward from

Type

RegExp -> Path -> Nullable { path : Path; matches : [ MatchResults ]; }

Noogle detected

Implementation

The following is the current implementation of this function.

locateDominatingFile =
    pattern:
    file:
    let go = path:
          let files = builtins.attrNames (builtins.readDir path);
              matches = builtins.filter (match: match != null)
                          (map (builtins.match pattern) files);
          in
            if builtins.length matches != 0
              then { inherit path matches; }
              else if path == /.
                then null
                else go (dirOf path);
        parent = dirOf file;
        isDir =
          let base = baseNameOf file;
              type = (builtins.readDir parent).${base} or null;
          in file == /. || type == "directory";
    in go (if isDir then file else parent);