summary refs log tree commit diff
path: root/pkgs/development/interpreters/ruby/ruby-version.nix
diff options
context:
space:
mode:
authorzimbatm <zimbatm@zimbatm.com>2016-09-20 17:41:16 +0100
committerzimbatm <zimbatm@zimbatm.com>2016-10-02 22:07:22 +0100
commitb8bcbec5fd5011aa19f45217a3f212a2ba4701b0 (patch)
tree61539124fe89fcd4aff0b20e5df6a84686eaa068 /pkgs/development/interpreters/ruby/ruby-version.nix
parent854e00943b65396d2dadaa9d0e73bec5e34817d8 (diff)
downloadnixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar.gz
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar.bz2
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar.lz
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar.xz
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.tar.zst
nixpkgs-b8bcbec5fd5011aa19f45217a3f212a2ba4701b0.zip
ruby: fixes rubygems user installs
* Manage patches in git
* Fixes the hook invocation to be more safe. Thanks @Mic92
* Install gems as user by default
* Install gem binaries with the /usr/bin/env shebang
* Fixes a bug where the passthru.libPath and passthru.gemPath would
  point to the wrong directory
* Overhaul ruby version heuristics
Diffstat (limited to 'pkgs/development/interpreters/ruby/ruby-version.nix')
-rw-r--r--pkgs/development/interpreters/ruby/ruby-version.nix63
1 files changed, 63 insertions, 0 deletions
diff --git a/pkgs/development/interpreters/ruby/ruby-version.nix b/pkgs/development/interpreters/ruby/ruby-version.nix
new file mode 100644
index 00000000000..b1cbbfc216d
--- /dev/null
+++ b/pkgs/development/interpreters/ruby/ruby-version.nix
@@ -0,0 +1,63 @@
+# Contains the ruby version heuristics
+{ lib }:
+with lib;
+let
+  # The returned set should be immutable
+  rubyVersion = major: minor: tiny: tail:
+    rec {
+      inherit major minor tiny tail;
+
+      # Contains the patch number "223" if tail is "p223" or null
+      patchLevel =
+        let
+          p = removePrefix "p" tail;
+          isPosInt = num:
+            0 == stringLength
+              (replaceStrings
+              ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"]
+              [""  ""  ""  ""  ""  ""  ""  ""  ""  "" ]
+              num);
+        in
+          if hasPrefix "p" tail && isPosInt p then p
+          else null;
+
+      # Shortcuts
+      majMin = "${major}.${minor}";
+      majMinTiny = "${major}.${minor}.${tiny}";
+
+      # Ruby separates lib and gem folders by ABI version which isn't very
+      # consistent.
+      libDir =
+        if versionAtLeast majMinTiny "2.1.0" then
+          "${majMin}.0"
+        else if versionAtLeast majMinTiny "2.0.0" then
+          "2.0.0"
+        else if versionAtLeast majMinTiny "1.9.1" then
+          "1.9.1"
+        else
+          throw "version ${majMinTiny} is not supported";
+
+      # How ruby releases are tagged on github.com/ruby/ruby
+      gitTag =
+        let
+          base = "v${major}_${minor}_${tiny}";
+        in
+          if patchLevel != null then
+            "${base}_${patchLevel}"
+          else
+            if tail != "" then
+              "${base}_${tail}"
+            else
+              base;
+
+      # Implements the builtins.toString interface.
+      __toString = self:
+        self.majMinTiny + (
+          if self.patchLevel != null then
+            "-p${self.patchLevel}"
+          else if self.tail != "" then
+            "-${self.tail}"
+          else "");
+    };
+in
+  rubyVersion