summary refs log tree commit diff
path: root/lib/fixed-points.nix
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2018-12-11 21:18:22 +0000
committerAlyssa Ross <hi@alyssa.is>2018-12-11 21:26:07 +0000
commit67b1265fb3d38ead5a57fee838405a2d997777c2 (patch)
tree0c127dd8432ca416db5c56f3460ec12e8cfaf746 /lib/fixed-points.nix
parentac19d5e34f384c66b71aecb921433acc5447bc51 (diff)
downloadnixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar.gz
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar.bz2
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar.lz
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar.xz
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.tar.zst
nixpkgs-67b1265fb3d38ead5a57fee838405a2d997777c2.zip
bundlerEnv: ensure dependencies always included
Suppose I have a Gemfile like this:

    source "https://rubygems.org"
    gem "actioncable"
    gem "websocket-driver", group: :test

The gemset.nix generated by Bundix 2.4.1 will set ActionCable's groups
to [ "default" ], and websocket-driver's to [ "test" ]. This means that
the generated bundlerEnv wouldn't include websocket-driver unless the
test group was included, even though it's required by the default group.

This is arguably a bug in Bundix (websocket-driver's groups should
probably be [ "default" "test" ] or just [ "default" ]), but there's no
reason bundlerEnv should omit dependencies even given such an input --
it won't necessarily come from Bundix, and it would be good for
bundlerEnv to do the right thing.

To fix this, filterGemset is now a recursive function, that adds
dependencies of gems in the group to the filtered gemset until it
stabilises on the gems that match the required groups, and all of their
recursive dependencies.
Diffstat (limited to 'lib/fixed-points.nix')
-rw-r--r--lib/fixed-points.nix10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/fixed-points.nix b/lib/fixed-points.nix
index 7169c46fcbb..2f818c88de5 100644
--- a/lib/fixed-points.nix
+++ b/lib/fixed-points.nix
@@ -24,6 +24,16 @@ rec {
   # for a concrete example.
   fix' = f: let x = f x // { __unfix__ = f; }; in x;
 
+  # Return the fixpoint that `f` converges to when called recursively, starting
+  # with the input `x`.
+  #
+  #     nix-repl> converge (x: x / 2) 16
+  #     0
+  converge = f: x:
+    if (f x) == x
+    then x
+    else converge f (f x);
+
   # Modify the contents of an explicitly recursive attribute set in a way that
   # honors `self`-references. This is accomplished with a function
   #