query
On this page

locateDominatingFile

lib.filesystem.locateDominatingFile

Docs pulled from | This Revision | about 1 hour 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);