about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--utils/builder.nix11
-rw-r--r--utils/default.nix22
-rw-r--r--utils/fs.nix41
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);
+  };
+}