From 7037202c55546f48b4b02b5b7257999b67d349cc Mon Sep 17 00:00:00 2001 From: Shannon Skipper Date: Mon, 21 Jul 2014 18:01:23 -0700 Subject: [PATCH 1/5] Natural sort RUBIES by version. - Uses the find command for building the RUBIES array. - Uses a variant of mpapis's sed/sort code for natural version sorting. --- share/chruby/chruby.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index 1736c79a..2f72eafb 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -1,10 +1,8 @@ CHRUBY_VERSION="0.3.8" -RUBIES=() - -for dir in "$PREFIX/opt/rubies" "$HOME/.rubies"; do - [[ -d "$dir" && -n "$(ls -A "$dir")" ]] && RUBIES+=("$dir"/*) -done -unset dir +RUBIES=($(find "$PREFIX/opt/rubies" "$HOME/.rubies" -mindepth 1 -maxdepth 1 -type "d" 2>/dev/null | + sed -e "h" -e "s/.*\///" -e "s/-/./g" -e "G" -e "s/\n/ /" | + sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | + cut -d " " -f 2)) function chruby_reset() { From f92524ff28f020a376f178118a831d5838143755 Mon Sep 17 00:00:00 2001 From: Shannon Skipper Date: Fri, 8 Aug 2014 20:34:31 -0700 Subject: [PATCH 2/5] Extract finding RUBIES to a function. --- share/chruby/chruby.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index 2f72eafb..b7908433 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -1,8 +1,13 @@ CHRUBY_VERSION="0.3.8" -RUBIES=($(find "$PREFIX/opt/rubies" "$HOME/.rubies" -mindepth 1 -maxdepth 1 -type "d" 2>/dev/null | + +function chruby_rubies() +{ + find "$@" -mindepth 1 -maxdepth 1 -type "d" 2>/dev/null | sed -e "h" -e "s/.*\///" -e "s/-/./g" -e "G" -e "s/\n/ /" | - sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | - cut -d " " -f 2)) + sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | cut -d " " -f 2 +} + +RUBIES=($(chruby_rubies "$PREFIX/opt/rubies" "$HOME/.rubies")) function chruby_reset() { From 80a7dd47a8c7773813a5ba7a4387517d62052734 Mon Sep 17 00:00:00 2001 From: Shannon Skipper Date: Fri, 8 Aug 2014 20:35:23 -0700 Subject: [PATCH 3/5] Test RUBIES sort order and spaces in the path. --- .travis.yml | 2 +- share/chruby/chruby.sh | 4 ++-- test/chruby_test.sh | 19 +++++++++++++++---- test/helper.sh | 4 +++- test/setup | 6 ++++++ 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index f0fa7b6e..77b20bfe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ install: - sudo apt-get install shunit2 zsh ruby before_script: - - echo yes | rvm implode + - sudo rm -rf $HOME/.rvm $HOME/.rvmrc /etc/rvmrc /etc/profile.d/rvm.sh /usr/local/rvm /usr/local/bin/rvm - __rvm_unload script: make test diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index b7908433..404a1070 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -3,8 +3,8 @@ CHRUBY_VERSION="0.3.8" function chruby_rubies() { find "$@" -mindepth 1 -maxdepth 1 -type "d" 2>/dev/null | - sed -e "h" -e "s/.*\///" -e "s/-/./g" -e "G" -e "s/\n/ /" | - sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | cut -d " " -f 2 + sed -e "h" -e 's/.*\///' -e 's/-/./g' -e "G" -e 's/\n/ /' | + sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | sed 's/[^ ]* //' } RUBIES=($(chruby_rubies "$PREFIX/opt/rubies" "$HOME/.rubies")) diff --git a/test/chruby_test.sh b/test/chruby_test.sh index 15b3d7c6..8557b898 100755 --- a/test/chruby_test.sh +++ b/test/chruby_test.sh @@ -12,11 +12,22 @@ function tearDown() RUBIES=(${original_rubies[@]}) } -function test_chruby_default_RUBIES() +function test_chruby_rubies_sort_order() { - assertEquals "did not correctly populate RUBIES" \ - "$test_ruby_root" \ - "${RUBIES[*]}" + actual_order="" + for ruby in "${RUBIES[@]}"; do + actual_order="$actual_order ${ruby##*/}" + done + actual_order="${actual_order##?}" + + assertEquals "did not natural version sort" "$test_rubies_order" "$actual_order" +} + +function test_chruby_rubies_spaces() +{ + detected_ruby=$(chruby_rubies "${test_ruby_dir%/*}/r u b i e s") + + assertEquals "did not work with spaces in RUBIES path" "ruby-2.1.2" "${detected_ruby##*/}" } function test_chruby_2_0() diff --git a/test/helper.sh b/test/helper.sh index b12499c3..ea72566a 100644 --- a/test/helper.sh +++ b/test/helper.sh @@ -12,7 +12,9 @@ test_ruby_engine="ruby" test_ruby_version="2.0.0" test_ruby_patchlevel="353" test_ruby_api="2.0.0" -test_ruby_root="$PWD/test/opt/rubies/$test_ruby_engine-$test_ruby_version-p$test_ruby_patchlevel" +test_ruby_dir="$PWD/test/opt/rubies" +test_ruby_root="$test_ruby_dir/$test_ruby_engine-$test_ruby_version-p$test_ruby_patchlevel" +test_rubies_order="jruby-1.7.9 jruby-1.7.14 rbx-2.2.9 rbx-2.2.10 rbx-10.0.0 ruby-1.9.3-p547 ruby-1.9.3-preview1 ruby-1.9.3-rc1 ruby-2.0.0-p0 ruby-2.0.0-p195 ruby-2.0.0-p247 ruby-2.0.0-p353" test_path="$PATH" test_gem_home="$HOME/.gem/$test_ruby_engine/$test_ruby_version" diff --git a/test/setup b/test/setup index 64ffd39a..be928dcb 100755 --- a/test/setup +++ b/test/setup @@ -173,6 +173,12 @@ test_ruby_root="$test_ruby_engine-$test_ruby_version-p$test_ruby_patchlevel" mkdir -p "$PREFIX/opt/rubies" cd "$PREFIX/opt/rubies" +mkdir -p "jruby-1.7.9" "jruby-1.7.14" "rbx-2.2.9" "rbx-2.2.10" "rbx-10.0.0" \ + "ruby-1.9.3-p547" "ruby-1.9.3-preview1" "ruby-1.9.3-rc1" "ruby-2.0.0-p0" \ + "ruby-2.0.0-p195" "ruby-2.0.0-p247" "ruby-2.0.0-p353" + +mkdir -p "$PREFIX/opt/r u b i e s/ruby-2.1.2" + log "Downloading $test_ruby_url ..." download "$test_ruby_url" "$test_ruby_archive" || fail "Download failed" From 9e7f0e44c1aae4de47cd1ceea15ff24dcbfe1737 Mon Sep 17 00:00:00 2001 From: Shannon Skipper Date: Sat, 13 Sep 2014 12:56:35 -0700 Subject: [PATCH 4/5] Use shell instead of sed. --- share/chruby/chruby.sh | 12 +++++++++--- test/helper.sh | 2 +- test/setup | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index 404a1070..ffd27ffa 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -2,9 +2,15 @@ CHRUBY_VERSION="0.3.8" function chruby_rubies() { - find "$@" -mindepth 1 -maxdepth 1 -type "d" 2>/dev/null | - sed -e "h" -e 's/.*\///' -e 's/-/./g' -e "G" -e 's/\n/ /' | - sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | sed 's/[^ ]* //' + local rubies dir ruby version + rubies=() + for dir in "$@"; do + [[ -d "$dir" && -n $(ls -A "$dir") ]] && for ruby in "$dir"/*; do + version="${ruby##*/}" && rubies+=("${version/-/.}\t$ruby") + done + done + + printf "%b\n" "${rubies[@]}" | sort -t "." -k "1,1" -k "2,2n" -k "3,3n" -k "4,4n" | cut -f 2 } RUBIES=($(chruby_rubies "$PREFIX/opt/rubies" "$HOME/.rubies")) diff --git a/test/helper.sh b/test/helper.sh index ea72566a..5b3cb41b 100644 --- a/test/helper.sh +++ b/test/helper.sh @@ -14,7 +14,7 @@ test_ruby_patchlevel="353" test_ruby_api="2.0.0" test_ruby_dir="$PWD/test/opt/rubies" test_ruby_root="$test_ruby_dir/$test_ruby_engine-$test_ruby_version-p$test_ruby_patchlevel" -test_rubies_order="jruby-1.7.9 jruby-1.7.14 rbx-2.2.9 rbx-2.2.10 rbx-10.0.0 ruby-1.9.3-p547 ruby-1.9.3-preview1 ruby-1.9.3-rc1 ruby-2.0.0-p0 ruby-2.0.0-p195 ruby-2.0.0-p247 ruby-2.0.0-p353" +test_rubies_order="jruby-1.7.9 jruby-1.7.10 rbx-2.2.9 rbx-2.2.10 rbx-10.0.0 ruby-1.9.3-p547 ruby-2.0.0-p0 ruby-2.0.0-p195 ruby-2.0.0-p247 ruby-2.0.0-p353 ruby-2.1.0 ruby-2.1.1 ruby-2.1.2" test_path="$PATH" test_gem_home="$HOME/.gem/$test_ruby_engine/$test_ruby_version" diff --git a/test/setup b/test/setup index be928dcb..d77d33e7 100755 --- a/test/setup +++ b/test/setup @@ -173,9 +173,9 @@ test_ruby_root="$test_ruby_engine-$test_ruby_version-p$test_ruby_patchlevel" mkdir -p "$PREFIX/opt/rubies" cd "$PREFIX/opt/rubies" -mkdir -p "jruby-1.7.9" "jruby-1.7.14" "rbx-2.2.9" "rbx-2.2.10" "rbx-10.0.0" \ - "ruby-1.9.3-p547" "ruby-1.9.3-preview1" "ruby-1.9.3-rc1" "ruby-2.0.0-p0" \ - "ruby-2.0.0-p195" "ruby-2.0.0-p247" "ruby-2.0.0-p353" +mkdir -p "jruby-1.7.9" "jruby-1.7.10" "rbx-2.2.9" "rbx-2.2.10" "rbx-10.0.0" \ + "ruby-1.9.3-p547" "ruby-2.0.0-p0" "ruby-2.0.0-p195" "ruby-2.0.0-p247" \ + "ruby-2.0.0-p353" "ruby-2.1.0" "ruby-2.1.1" "ruby-2.1.2" mkdir -p "$PREFIX/opt/r u b i e s/ruby-2.1.2" From 267abb63fe689a130d4e8cbf740882edb7f200f4 Mon Sep 17 00:00:00 2001 From: Shannon Skipper Date: Sun, 5 Oct 2014 17:24:31 -0700 Subject: [PATCH 5/5] Gracefully handle trailing slashes after directories. --- share/chruby/chruby.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/chruby/chruby.sh b/share/chruby/chruby.sh index ffd27ffa..b078d665 100644 --- a/share/chruby/chruby.sh +++ b/share/chruby/chruby.sh @@ -5,8 +5,8 @@ function chruby_rubies() local rubies dir ruby version rubies=() for dir in "$@"; do - [[ -d "$dir" && -n $(ls -A "$dir") ]] && for ruby in "$dir"/*; do - version="${ruby##*/}" && rubies+=("${version/-/.}\t$ruby") + [[ -d "$dir" && -n "$(ls -A "$dir")" ]] && for ruby in "$dir"/*; do + rubies+=("$(basename "$ruby" | tr "-" ".")\t$ruby") done done