summaryrefslogtreecommitdiffstats
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)
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 000000000000..b1cbbfc216dc
--- /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