diff --git a/README.md b/README.md index c0a3f16cdd..7581776e5c 100644 --- a/README.md +++ b/README.md @@ -42,11 +42,13 @@ PREFIX=/usr/local ./ruby-build-*/install.sh # As a standalone program $ ruby-build --list # lists latest stable releases for each Ruby $ ruby-build --definitions # lists all definitions, including outdated ones -$ ruby-build 3.2.2 ~/.rubies/ruby-3.2.2 # installs Ruby 3.2.2 -$ ruby-build -d ruby-3.2.2 ~/.rubies # alternate form for the previous example +$ ruby-build 3.4.9 ~/.rubies/ruby-3.4.9 # installs Ruby 3.4.9 +$ ruby-build -d ruby-3.4.9 ~/.rubies # alternate form for the previous example +$ ruby-build -d ruby-3.4 ~/.rubies # installs latest Ruby 3.4.x # As an rbenv plugin -$ rbenv install 3.2.2 # installs Ruby 3.2.2 to ~/.rbenv/versions/3.2.2 +$ rbenv install 3.4.9 # installs Ruby 3.4.9 to ~/.rbenv/versions/3.4.9 +$ rbenv install 3 # installs latest Ruby 3.x ``` > [!WARNING] @@ -61,6 +63,28 @@ Basically, what ruby-build does when installing a Ruby version is this: Depending on the context, ruby-build does a little bit more than the above: for example, it will try to link Ruby to the appropriate OpenSSL version, even if that means downloading and compiling OpenSSL itself; it will discover and link to Homebrew-installed instances of some libraries like libyaml and readline, etc. +### Ruby versions + +When listing "latest" Ruby versions, such as in `ruby-build --list` output, ruby-build only knows of Ruby versions that are bundled with this project. That means that when a new Ruby version comes out, ruby-build will not know about it immediately— you will have to upgrade ruby-build before you can use it to install the new Ruby version. This is because ruby-build bundles [definition files](#custom-build-definitions) for each individual Ruby version. + +If it's important to you that your installer tool always consults remote resources to download the list of latest Ruby versions (without having to upgrade the tool itself), check out [ruby-install][] as an alternative to ruby-build. + +### Ruby implementations + +ruby-build ships with definitions for the following Ruby implementations, denoted by version prefixes in the `ruby-build --list` output: + +- [CRuby][]: listed in ruby-build as unprefixed version numbers in the `X.Y.Z` format. This is the main Ruby implementation that most people use and is also historically known as "MRI". ruby-build allows adding the `ruby-` prefix to CRuby version numbers for compatibility with other version managers. + +- `jruby`: [JRuby][] is a high-performance Ruby implementation with real threading built on top of the Java virtual machine (JVM). + +- `mruby`: [mruby][] is a lightweight, embeddable Ruby implementation for microcontrollers. + +- `picoruby`: [PicoRuby][] is an alternative mruby implementation for one-chip microcontrollers. + +- `truffleruby`: The Native standalone distribution of [TruffleRuby][], an implementation of Ruby on top of GraalVM's Truffle framework. + +- `truffleruby+graalvm`: The JVM standalone distribution of TruffleRuby. + ### Advanced Usage #### Custom Build Definitions @@ -197,3 +221,9 @@ Be sure to include the full build log for build failures. [wiki]: https://github.com/rbenv/ruby-build/wiki [build-env]: https://github.com/rbenv/ruby-build/wiki#suggested-build-environment [issue tracker]: https://github.com/rbenv/ruby-build/issues + [cruby]: https://www.ruby-lang.org/ + [truffleruby]: https://truffleruby.dev/ + [picoruby]: https://github.com/picoruby/picoruby#readme + [mruby]: https://mruby.org/ + [jruby]: https://www.jruby.org/ + [ruby-install]: https://github.com/postmodern/ruby-install#readme diff --git a/bin/rbenv-install b/bin/rbenv-install index b5f47800c2..017daaa442 100755 --- a/bin/rbenv-install +++ b/bin/rbenv-install @@ -134,8 +134,6 @@ done [ "${#ARGUMENTS[@]}" -le 1 ] || usage 1 >&2 -unset VERSION_NAME - # The first argument contains the definition to install. If the # argument is missing, try to install whatever local app-specific # version is specified by rbenv. Show usage instructions if a local @@ -144,6 +142,12 @@ DEFINITION="${ARGUMENTS[0]}" [ -n "$DEFINITION" ] || DEFINITION="$(rbenv-local 2>/dev/null || true)" [ -n "$DEFINITION" ] || usage 1 >&2 +if VERSION_NAME="$(ruby-build --resolve "$DEFINITION")"; then + DEFINITION="$VERSION_NAME" +else + unset VERSION_NAME +fi + # Define `before_install` and `after_install` functions that allow # plugin hooks to register a string of code for execution before or # after the installation process. diff --git a/bin/ruby-build b/bin/ruby-build index 68a46af551..b1e937eb5f 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -2,10 +2,12 @@ # # Usage: ruby-build [-dvpk] [-- ] # ruby-build {--list|--definitions} +# ruby-build --resolve # ruby-build --version # # -l, --list List latest stable releases for each Ruby # --definitions List all local definitions, including outdated ones +# --resolve Print the latest stable definition name matching a version prefix # --version Show version of ruby-build # # -d, --dir Install the Ruby in / instead of @@ -1411,6 +1413,36 @@ list_maintained_versions() { } | extract_latest_versions | sort_versions | uniq } +# resolve a version prefix to the exact version name for which exists a +# definition file. Example: "ruby-3" => "3.4.9" +resolve_version() { + local version="${1#ruby-}" + + # Look for an exact match first. + for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do + if [ -f "${DEFINITION_DIR}/${version}" ]; then + echo "$version" + return 0 + fi + done + + local grep_pattern="${version%.}" + if [ "$grep_pattern" = "ruby" ]; then + # Special case to select the latest CRuby. + grep_pattern="[0-9]" + else + grep_pattern="$(tr 'A-Z' 'a-z' <<<"${grep_pattern//./\\.}")" + fi + + version=$(list_definitions | \ + grep -e "^${grep_pattern}[-.]" | \ + grep -v -e '-rc[0-9]*$' -e '-preview[0-9]*$' -e '-dev$' | \ + tail -n 1) + + [ -n "$version" ] || return 1 + echo "$version" +} + extract_latest_versions() { # sort in this function looks redundunt but it is necessary # rbx-3.99 appears latest unless the sort @@ -1453,6 +1485,14 @@ for option in "${OPTIONS[@]}"; do "l" | "list") EARLY_EXIT=list_maintained_versions ;; + "resolve") + if [ "${#ARGUMENTS[*]}" -eq 1 ]; then + EARLY_EXIT=resolve_version + else + echo "ruby-build: '--resolve' needs an argument" >&2 + EARLY_EXIT=usage_error + fi + ;; "d" | "dir") APPEND_DEFINITION_TO_PREFIX=true ;; @@ -1503,12 +1543,9 @@ if [ "${#EXTRA_ARGUMENTS[@]}" -gt 0 ]; then RUBY_CONFIGURE_OPTS_ARRAY=("${EXTRA_ARGUMENTS[@]}") fi -if [ "$APPEND_DEFINITION_TO_PREFIX" = "true" ]; then - if [ -p "$DEFINITION_PATH" ]; then - echo "ruby-build: using named pipes in combination with \`--dir' is not possible" >&2 - EARLY_EXIT=usage_error - fi - PREFIX_PATH="$PREFIX_PATH/$(basename "$DEFINITION_PATH")" +if [[ "$APPEND_DEFINITION_TO_PREFIX" = "true" && -p "$DEFINITION_PATH" ]]; then + echo "ruby-build: using named pipes in combination with \`--dir' is not possible" >&2 + EARLY_EXIT=usage_error fi case "$EARLY_EXIT" in @@ -1521,6 +1558,10 @@ version | list_definitions | list_maintained_versions ) "$EARLY_EXIT" exit 0 ;; +resolve_version ) + resolve_version "${ARGUMENTS[0]}" || exit 1 + exit 0 + ;; usage_error ) echo >&2 usage 1 >&2 @@ -1533,30 +1574,29 @@ usage_error ) ;; esac +VERSION_NAME_PREFIX="" + # expand the argument to full path of the definition file if [[ ! -f "$DEFINITION_PATH" && ! -p "$DEFINITION_PATH" ]]; then + if ! VERSION_NAME="$(resolve_version "$DEFINITION_PATH")"; then + echo "ruby-build: definition not found: ${DEFINITION_PATH}" >&2 + exit 2 + fi + + if [[ $DEFINITION_PATH == ruby-* && $VERSION_NAME != ruby-* ]]; then + VERSION_NAME_PREFIX="ruby-" + fi + for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do - if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then - DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" + if [ -f "${DEFINITION_DIR}/${VERSION_NAME}" ]; then + DEFINITION_PATH="${DEFINITION_DIR}/${VERSION_NAME}" break fi done +fi - # If the given definition is like ruby-X.Y.Z, search again with X.Y.Z - if [[ "$DEFINITION_PATH" =~ ^ruby-[0-9] ]]; then - DEFINITION_PATH="${DEFINITION_PATH#ruby-}" - for DEFINITION_DIR in "${RUBY_BUILD_DEFINITIONS[@]}"; do - if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then - DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" - break - fi - done - fi - - if [ ! -f "$DEFINITION_PATH" ]; then - echo "ruby-build: definition not found: ${DEFINITION_PATH}" >&2 - exit 2 - fi +if [ "$APPEND_DEFINITION_TO_PREFIX" = "true" ]; then + PREFIX_PATH="$PREFIX_PATH/${VERSION_NAME_PREFIX}$(basename "$DEFINITION_PATH")" fi # normalize the argument diff --git a/share/man/man1/ruby-build.1 b/share/man/man1/ruby-build.1 index 3c1bb8f13f..14d965ec84 100644 --- a/share/man/man1/ruby-build.1 +++ b/share/man/man1/ruby-build.1 @@ -2,12 +2,12 @@ .\" Title: ruby-build .\" Author: Mislav Marohnić .\" Generator: Asciidoctor 2.0.26 -.\" Date: 2024-09-23 +.\" Date: 2026-05-01 .\" Manual: ruby-build Manual .\" Source: ruby-build 20260426 .\" Language: English .\" -.TH "RUBY\-BUILD" "1" "2024-09-23" "ruby\-build 20260426" "ruby\-build Manual" +.TH "RUBY\-BUILD" "1" "2026-05-01" "ruby\-build 20260426" "ruby\-build Manual" .ie \n(.g .ds Aq \(aq .el .ds Aq ' .ss \n[.ss] 0 @@ -35,15 +35,14 @@ ruby\-build [\-dvpk] \fI\fP \fI\fP [\-\- \fI\fP +.br ruby\-build \-\-version .SH "DESCRIPTION" .sp ruby\-build downloads, compiles, and installs a Ruby version named by the \fIdefinition\fP argument into the location specified by \fIprefix\fP. .sp -The \fIdefinition\fP argument can optionally start with "ruby\-", in which case -it resolves to a CRuby that matches the version number that follows. -.sp The \fIdefinition\fP argument can be a path to a file on disk, in which case it is sourced into ruby\-build as a bash script. .sp @@ -53,6 +52,91 @@ will get forwarded to the \f(CR./configure\fP invocation. By default, all compile output is redirected to a log file at \f(CR$TMPDIR/ruby\-build.*.log\fP. Activate the verbose mode to skip the log file and print everything to standard streams. +.SH "RUBY VERSIONS" +.sp +When listing "latest" Ruby versions, such as in \f(CR\-\-list\fP output, +ruby\-build only knows of Ruby versions that are bundled with this project. +That means that when a new Ruby version comes out, ruby\-build will not +know about it immediately; you will have to upgrade ruby\-build before you +can use it to install the new Ruby version. +.SH "RUBY IMPLEMENTATIONS" +.sp +ruby\-build ships with definitions for the following Ruby implementations: +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +CRuby, also known as "MRI": denoted by version numbers in form of "X.Y.Z". +This is the main Ruby implementation that most people use. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"jruby": High\-performance Ruby implementation with real threading built +on top of the Java virtual machine (JVM). +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"mruby": Lightweight Ruby for microcontrollers. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"picoruby": Alternative mruby implementation for one\-chip microcontrollers. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"truffleruby": The Native standalone distribution of TruffleRuby, an +implementation of Ruby on top of GraalVM\(cqs Truffle framework. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +. sp -1 +. IP \(bu 2.3 +.\} +"truffleruby+graalvm": The JVM standalone distribution of TruffleRuby. +.RE +.sp +The \fIdefinition\fP argument may optionally start with "ruby\-", in which case +it resolves to a CRuby that matches the version number that follows. The +\fIdefinition\fP argument may also be a name of one of the alternative Ruby +implementations, in which case the latest version of that implementation +will be installed. .SH "OPTIONS" .sp \fB\-l, \-\-list\fP @@ -65,6 +149,11 @@ List latest stable releases for each Ruby List all local definitions, including outdated ones .RE .sp +\fB\-\-resolve\fP +.RS 4 +Print the definition name of the latest stable Ruby version matching the \fIversion\fP argument +.RE +.sp \fB\-\-version\fP .RS 4 Show version of ruby\-build @@ -106,27 +195,37 @@ Install a Ruby version while tweaking some configuration options: .if n .RS 4 .nf .fam C -$ ruby\-build 3.2.2 /path/to/destination \-\- \-\-disable\-install\-doc \-\-with\-openssl\-dir=/opt/openssl +$ ruby\-build 3.4.9 /path/to/destination \-\- \-\-disable\-install\-doc \-\-with\-openssl\-dir=/opt/openssl +.fam +.fi +.if n .RE +.sp +Install a Ruby version to \f(CR~/.rubies/ruby\-3.4.9\fP: +.sp +.if n .RS 4 +.nf +.fam C +$ ruby\-build \-\-dir ruby\-3.4.9 ~/.rubies .fam .fi .if n .RE .sp -Install a Ruby version to \f(CR~/.rubies/ruby\-3.2.2\fP: +Install the latest Ruby 3.x version to \f(CR~/.rubies/ruby\-3.x.y\fP: .sp .if n .RS 4 .nf .fam C -$ ruby\-build \-\-dir ruby\-3.2.2 ~/.rubies +$ ruby\-build \-\-dir ruby\-3 ~/.rubies .fam .fi .if n .RE .sp -Install a Ruby version to \f(CR~/.rbenv/versions/3.3.5\fP: +Install a Ruby version to \f(CR~/.rbenv/versions/3.3.11\fP: .sp .if n .RS 4 .nf .fam C -$ ruby\-build \-\-dir 3.3.5 ~/.rbenv/versions +$ ruby\-build \-\-dir 3.3.11 ~/.rbenv/versions .fam .fi .if n .RE @@ -136,7 +235,7 @@ Usage as rbenv plugin, accomplishes the same as the previous example: .if n .RS 4 .nf .fam C -$ rbenv install 3.3.5 +$ rbenv install 3.3.11 .fam .fi .if n .RE diff --git a/share/man/man1/ruby-build.1.adoc b/share/man/man1/ruby-build.1.adoc index b579296e88..3ee361a0cf 100644 --- a/share/man/man1/ruby-build.1.adoc +++ b/share/man/man1/ruby-build.1.adoc @@ -13,6 +13,7 @@ ruby-build - Download, compile, and install a version of Ruby ruby-build [-dvpk] __ __ [-- __...] + ruby-build {--list|--definitions} + +ruby-build --resolve __ + ruby-build --version == Description @@ -20,9 +21,6 @@ ruby-build --version ruby-build downloads, compiles, and installs a Ruby version named by the _definition_ argument into the location specified by _prefix_. -The _definition_ argument can optionally start with "ruby-", in which case -it resolves to a CRuby that matches the version number that follows. - The _definition_ argument can be a path to a file on disk, in which case it is sourced into ruby-build as a bash script. @@ -33,6 +31,39 @@ By default, all compile output is redirected to a log file at `$TMPDIR/ruby-build.*.log`. Activate the verbose mode to skip the log file and print everything to standard streams. +== Ruby versions + +When listing "latest" Ruby versions, such as in `--list` output, +ruby-build only knows of Ruby versions that are bundled with this project. +That means that when a new Ruby version comes out, ruby-build will not +know about it immediately; you will have to upgrade ruby-build before you +can use it to install the new Ruby version. + +== Ruby implementations + +ruby-build ships with definitions for the following Ruby implementations: + +- CRuby, also known as "MRI": denoted by version numbers in form of "X.Y.Z". + This is the main Ruby implementation that most people use. + +- "jruby": High-performance Ruby implementation with real threading built + on top of the Java virtual machine (JVM). + +- "mruby": Lightweight Ruby for microcontrollers. + +- "picoruby": Alternative mruby implementation for one-chip microcontrollers. + +- "truffleruby": The Native standalone distribution of TruffleRuby, an + implementation of Ruby on top of GraalVM's Truffle framework. + +- "truffleruby+graalvm": The JVM standalone distribution of TruffleRuby. + +The _definition_ argument may optionally start with "ruby-", in which case +it resolves to a CRuby that matches the version number that follows. The +_definition_ argument may also be a name of one of the alternative Ruby +implementations, in which case the latest version of that implementation +will be installed. + == Options *-l, --list*:: @@ -41,6 +72,9 @@ and print everything to standard streams. *--definitions*:: List all local definitions, including outdated ones +*--resolve*:: + Print the definition name of the latest stable Ruby version matching the _version_ argument + *--version*:: Show version of ruby-build @@ -66,22 +100,27 @@ and print everything to standard streams. Install a Ruby version while tweaking some configuration options: ---- -$ ruby-build 3.2.2 /path/to/destination -- --disable-install-doc --with-openssl-dir=/opt/openssl +$ ruby-build 3.4.9 /path/to/destination -- --disable-install-doc --with-openssl-dir=/opt/openssl +---- + +Install a Ruby version to `~/.rubies/ruby-3.4.9`: +---- +$ ruby-build --dir ruby-3.4.9 ~/.rubies ---- -Install a Ruby version to `~/.rubies/ruby-3.2.2`: +Install the latest Ruby 3.x version to `~/.rubies/ruby-3.x.y`: ---- -$ ruby-build --dir ruby-3.2.2 ~/.rubies +$ ruby-build --dir ruby-3 ~/.rubies ---- -Install a Ruby version to `~/.rbenv/versions/3.3.5`: +Install a Ruby version to `~/.rbenv/versions/3.3.11`: ---- -$ ruby-build --dir 3.3.5 ~/.rbenv/versions +$ ruby-build --dir 3.3.11 ~/.rbenv/versions ---- Usage as rbenv plugin, accomplishes the same as the previous example: ---- -$ rbenv install 3.3.5 +$ rbenv install 3.3.11 ---- == Environment Variables diff --git a/test/build.bats b/test/build.bats index 87a253d729..4a86784509 100755 --- a/test/build.bats +++ b/test/build.bats @@ -787,6 +787,30 @@ make install OUT } +@test "nested install destination with ruby prefix and version prefix" { + cached_tarball "ruby-3.2.45" configure + + stub_repeated brew false + stub_make_install + + mkdir -p "$TMP"/definitions + cat > "$TMP"/definitions/3.2.45 < "${TMP}/definitions/1.8.6" + echo false > "${TMP}/definitions/1.9.3" + echo true > "${TMP}/definitions/1.9.10" + echo false > "${TMP}/definitions/1.90.0" + echo false > "${TMP}/definitions/2.0.0" + + run bin/ruby-build "1.9" "${TMP}/install" + assert_success "" +} + +@test "resolve failure" { + run bin/ruby-build --resolve "doesntexist" + assert_failure "" +} + +@test "resolve definition by version prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/1.8.6" + touch "${TMP}/definitions/1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "1.9" + assert_success "1.9.10" +} + +@test "resolve definition by exact match" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/3.2.1" + + run bin/ruby-build --resolve "3.2.1" + assert_success "3.2.1" +} + +@test "resolve definition by exact match and ruby prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/3.2.1" + + run bin/ruby-build --resolve "ruby-3.2.1" + assert_success "3.2.1" +} + +@test "resolve definition with ruby prefix" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/1.8.6" + touch "${TMP}/definitions/1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "ruby-1.9" + assert_success "1.9.10" +} + +@test "resolve definition by implementation name" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/fooruby-1.8.6" + touch "${TMP}/definitions/fooruby-1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "FooRuby" + assert_success "fooruby-1.9.3" +} + +@test "resolve definition by implementation name and version" { + export RUBY_BUILD_DEFINITIONS="${TMP}/definitions" + mkdir -p "${TMP}/definitions" + + touch "${TMP}/definitions/foo-1.8.6" + touch "${TMP}/definitions/foo-1.9.3" + touch "${TMP}/definitions/1.9.10" + touch "${TMP}/definitions/1.90.0" + touch "${TMP}/definitions/2.0.0" + + run bin/ruby-build --resolve "foo-1.8" + assert_success "foo-1.8.6" +} + @test "installing nonexistent definition" { run ruby-build "nonexistent" "${TMP}/install" assert [ "$status" -eq 2 ] diff --git a/test/rbenv.bats b/test/rbenv.bats index 2f52961a31..e5bea4c899 100644 --- a/test/rbenv.bats +++ b/test/rbenv.bats @@ -16,7 +16,7 @@ stub_ruby_build() { } @test "install proper" { - stub_ruby_build 'echo ruby-build "$@"' + stub_ruby_build 'echo 2.1.2' 'echo ruby-build "$@"' run rbenv-install 2.1.2 assert_success "ruby-build 2.1.2 ${RBENV_ROOT}/versions/2.1.2" @@ -27,7 +27,7 @@ stub_ruby_build() { } @test "install with flags" { - stub_ruby_build 'echo "ruby-build $(inspect_args "$@")"' + stub_ruby_build 'echo 2.1.2' 'echo "ruby-build $(inspect_args "$@")"' run rbenv-install -kpv 2.1.2 -- --with-configure-opt="hello world" assert_success "ruby-build --keep --verbose --patch 2.1.2 ${RBENV_ROOT}/versions/2.1.2 -- \"--with-configure-opt=hello world\"" @@ -39,7 +39,7 @@ stub_ruby_build() { @test "suggest running rbenv global after install" { rm -rf "$RBENV_ROOT/version" - stub_ruby_build 'echo ruby-build "$@"' + stub_ruby_build 'echo 2.1.2' 'echo ruby-build "$@"' run rbenv-install 2.1.2 assert_success <&2 && exit 2' \ + stub_ruby_build 'exit 1' \ + 'echo ERROR >&2 && exit 2' \ "--definitions : echo 1.8.7 1.9.3-p0 1.9.3-p194 2.1.2 | tr ' ' $'\\n'" run rbenv-install 1.9.3 @@ -127,10 +128,11 @@ OUT @test "Homebrew upgrade instructions" { stub brew "--prefix : echo '${BATS_TEST_DIRNAME%/*}'" - stub_ruby_build 'echo ERROR >&2 && exit 2' \ + stub_ruby_build 'exit 1' \ + 'echo ERROR >&2 && exit 2' \ "--definitions : true" - run rbenv-install 1.9.3 + run rbenv-install 1.9.10 assert_failure assert_output <