diff options
-rw-r--r-- | utils/builder.nix | 11 | ||||
-rw-r--r-- | utils/default.nix | 22 | ||||
-rw-r--r-- | utils/fs.nix | 41 |
3 files changed, 63 insertions, 11 deletions
diff --git a/utils/builder.nix b/utils/builder.nix new file mode 100644 index 000000000000..45e783cf0ba8 --- /dev/null +++ b/utils/builder.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: + +let + inherit (pkgs) writeShellScriptBin; +in { + # Create a derivation that creates an executable shell script named `as` that + # calls the program located at `path`, forwarding all of the arguments. + wrapNonNixProgram = { path, as }: writeShellScriptBin as '' + exec ${path} "$@" + ''; +} diff --git a/utils/default.nix b/utils/default.nix index df9673daec70..db01702a1fec 100644 --- a/utils/default.nix +++ b/utils/default.nix @@ -1,14 +1,14 @@ -{ pkgs, ... }: +args@{ pkgs, ... }: -# Using this as a library to define some common utility functions that I often -# reach for. -{ - # A unary function that returns its argument. - identity = x: x; +# This top-level module exposes all of my utility functions for Nix. It should +# be used like: +# ```nix +# inherit (briefcase.utils) fs; +# ``` - # Create a derivation that creates an executable shell script named `as` that - # calls the program located at `path`, forwarding all of the arguments. - wrapNonNixProgram = { path, as }: pkgs.writeShellScriptBin as '' - exec ${path} "$@" - ''; +let + builder = import ./builder.nix args; + fs = import ./fs.nix args; +in { + inherit builder fs; } diff --git a/utils/fs.nix b/utils/fs.nix new file mode 100644 index 000000000000..6305e705b141 --- /dev/null +++ b/utils/fs.nix @@ -0,0 +1,41 @@ +{ pkgs, ... }: + +# `fs` contains utility functions for working with the filesystem. + +let + inherit (builtins) attrNames hasAttr map readDir; + inherit (pkgs.lib) filterAttrs; +in { + # Returns a list of all of the regular files in `dir`. + files = dir: + map (name: dir + "/${name}") + (attrNames + (filterAttrs (_: type: type == "regular") (readDir dir))); + + # Returns a list of all of the directories in `dir`. + dirs = dir: + map (name: dir + "/${name}") + (attrNames + (filterAttrs (_: type: type == "directory") (readDir dir))); + + # Returns a list of paths to all of the `name` files starting at `dir`. + find = name: dir: + if hasAttr name (readDir dir) then + [ (dir + name) ] ++ concatMap findAllDefaultNix (dirs dir) + else + concatMap findAllDefaultNix (dirs dir); + + # Looks for `name` in `dir`; if it cannot find it, it checks the parent + # directory. + resolve = name: dir: + if hasAttr name (readDir dir) then + dir + "/${name}" + else + # This prevents the function from infinitely recursing and eventually + # stack overflowing. + if (dirOf dir) == dir then + null + else + resolve name (dirOf dir); + }; +} |