Skip to content

Commit

Permalink
Merge pull request #197905 from infinisil/lib-filesystem-docs
Browse files Browse the repository at this point in the history
lib: Automatically generate lib.filesytem docs
  • Loading branch information
infinisil authored Oct 26, 2022
2 parents 8ad3176 + 9bfc4bb commit c0c3c3f
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 18 deletions.
1 change: 1 addition & 0 deletions doc/doc-support/lib-function-docs.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ with pkgs; stdenv.mkDerivation {
docgen lists 'List manipulation functions'
docgen debug 'Debugging functions'
docgen options 'NixOS / nixpkgs option handling'
docgen filesystem 'Filesystem functions'
docgen sources 'Source filtering functions'
'';
}
2 changes: 2 additions & 0 deletions doc/functions/library.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,7 @@

<xi:include href="./library/generated/options.xml" />

<xi:include href="./library/generated/filesystem.xml" />

<xi:include href="./library/generated/sources.xml" />
</section>
58 changes: 40 additions & 18 deletions lib/filesystem.nix
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
# Functions for copying sources to the Nix store.
{ lib }:
{ # haskellPathsInDir : Path -> Map String Path
# A map of all haskell packages defined in the given path,
# identified by having a cabal file with the same name as the
# directory itself.
haskellPathsInDir = root:

let
inherit (lib.strings)
hasPrefix
;
in

{
/*
A map of all haskell packages defined in the given path,
identified by having a cabal file with the same name as the
directory itself.
Type: Path -> Map String Path
*/
haskellPathsInDir =
# The directory within to search
root:
let # Files in the root
root-files = builtins.attrNames (builtins.readDir root);
# Files with their full paths
Expand All @@ -17,15 +31,18 @@
builtins.pathExists (value + "/${name}.cabal")
) root-files-with-paths;
in builtins.listToAttrs cabal-subdirs;
# locateDominatingFile : RegExp
# -> Path
# -> Nullable { path : Path;
# matches : [ MatchResults ];
# }
# Find the first directory containing a file matching 'pattern'
# upward from a given 'file'.
# Returns 'null' if no directories contain a file matching 'pattern'.
locateDominatingFile = pattern: file:
/*
Find the first directory containing a file matching 'pattern'
upward from a given 'file'.
Returns 'null' if no directories contain a file matching 'pattern'.
Type: RegExp -> Path -> Nullable { path : Path; matches : [ MatchResults ]; }
*/
locateDominatingFile =
# The pattern to search for
pattern:
# The file to start searching upward from
file:
let go = path:
let files = builtins.attrNames (builtins.readDir path);
matches = builtins.filter (match: match != null)
Expand All @@ -44,10 +61,15 @@
in go (if isDir then file else parent);


# listFilesRecursive: Path -> [ Path ]
#
# Given a directory, return a flattened list of all files within it recursively.
listFilesRecursive = dir: lib.flatten (lib.mapAttrsToList (name: type:
/*
Given a directory, return a flattened list of all files within it recursively.
Type: Path -> [ Path ]
*/
listFilesRecursive =
# The path to recursively list
dir:
lib.flatten (lib.mapAttrsToList (name: type:
if type == "directory" then
lib.filesystem.listFilesRecursive (dir + "/${name}")
else
Expand Down

0 comments on commit c0c3c3f

Please sign in to comment.