Friday 24 July 2015

"rvm install jruby-9.0.0.0" insists on installing pre1, rc1 or rc2

So... Yeah...

Been eagerly awaiting jruby-9000. And used rvm to install the pre1, rc1 and rc2 versions for testing against micro-services.

Then crashed right into a problem when the final release came out.

I tried to "rvm install jruby-9.0.0.0" and it said there was already a cached version "ruby-9.0.0.0-pre1".

Ok I thought, so I did "rvm list" and uninstalled all the previous jrubies.

Then removed any reference to jruby from "~/.rvm/archives".

Then "rvm get stable".

Then "rvm install jruby-9.0.0.0" again.

To my chagrin, it did this:

Searching for binary rubies, this might take some time.
Found remote file https://s3.amazonaws.com/jruby.org/downloads/9.0.0.0.pre1/jruby-bin-9.0.0.0.pre1.tar.gz
...compilation elided...

Guessing that there may actually be a release version on s3, I wget'd "https://s3.amazonaws.com/jruby.org/downloads/9.0.0.0/jruby-bin-9.0.0.0.tar.gz"

Luckily that worked and I copied the file to "~/.rvm/archives".

I uninstalled and removed the other "pre1" version and tried again.

But no.
Despite having jruby-bin-9.0.0.0.tar.gz in the archives folder, rvm insists on downloading the pre1 version.

Then the "Ahaha!"

After mucking about with rvm --debug and --trace commands I found this wonderful thing in the output (which was frickin ginormous):

+ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  12 > [[ -z jruby-9\.0\.0\.0.* ]]

#Ed: This looks interesting...
++ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  -221 > command cat /Users/kimberleyscott/.rvm/config/known_strings


++ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  -219 > __rvm_version_sort
++ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  -218 > __rvm_tail -n 1

#Ed: Notice the regex
++ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  -220 > __rvm_grep 'jruby-9\.0\.0\.0.*'

++ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  -463 > cat /Users/kimberleyscott/.rvm/config/known_strings
++ 1437712726.N /scripts/functions/support : __rvm_tail()  0 > tail -n 1
++ 1437712726.N /scripts/functions/utility : __rvm_version_sort()  1 > LC_ALL=C
++ 1437712726.N /scripts/functions/support : __rvm_grep()  0 > GREP_OPTIONS=
++ 1437712726.N /scripts/functions/utility : __rvm_version_sort()  1 > command sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n
++ 1437712726.N /scripts/functions/support : __rvm_grep()  0 > command grep 'jruby-9\.0\.0\.0.*'
++ 1437712726.N /scripts/functions/utility : __rvm_version_sort()  -167 > sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n
++ 1437712726.N /scripts/functions/support : __rvm_grep()  -260 > grep 'jruby-9\.0\.0\.0.*'

# Ed: and here is the result:
+ 1437712726.N /scripts/functions/selector_parse : __rvm_ruby_string_latest()  20 > new_ruby_string=jruby-9.0.0.0.pre1

Well... "~/.rvm/config/known_strings" looks like an interesting file doesn't it?

And lo and behold, I can now see how the rvm script decided on pre1.
so I changed this:

# this strings are matched only when partial version was provided
jruby-1.7.19
jruby-9.0.0.0.pre1

to this:

# this strings are matched only when partial version was provided
jruby-1.7.19
#jruby-9.0.0.0.pre1 - commented for safety
jruby-9.0.0.0

And did a fresh "rvm --debug install jruby-9.0.0.0".
Loads of green and purple output.
But wayhey! Installed.

rum now shows it installed:

rvm rubies

 * jruby-1.7.19 [ x86_64 ]
   jruby-1.7.20 [ x86_64 ]
   jruby-1.7.21 [ x86_64 ]
=> jruby-9.0.0.0 [ x86_64 ]
   ruby-2.2.0 [ x86_64 ]
   ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Hope this helps others!