From b8bcbec5fd5011aa19f45217a3f212a2ba4701b0 Mon Sep 17 00:00:00 2001 From: zimbatm Date: Tue, 20 Sep 2016 17:41:16 +0100 Subject: 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 --- .../development/interpreters/ruby/ruby-version.nix | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pkgs/development/interpreters/ruby/ruby-version.nix (limited to 'pkgs/development/interpreters/ruby/ruby-version.nix') 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 -- cgit 1.4.1