Skip to content

Commit

Permalink
Simplified wrapper command, closes #4180
Browse files Browse the repository at this point in the history
  • Loading branch information
mpapis committed Sep 22, 2017
1 parent 7178d7a commit c999d48
Show file tree
Hide file tree
Showing 14 changed files with 55 additions and 218 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -6,6 +6,7 @@
#### New features:
* Railsexpress patches for 2.2.8, 2.3.5 and 2.4.2 [\#4167](https://github.com/rvm/rvm/pull/4167)
* Improved CPU count detection [\#4171](https://github.com/rvm/rvm/pull/4171)
* Simplified wrapper subcommand [\#4180](https://github.com/rvm/rvm/issues/4180)

#### Bug fixes:
* ZSH Bad pattern for Gemfile ruby declaration [\#4154](https://github.com/rvm/rvm/issues/4154) [\#4156](https://github.com/rvm/rvm/issues/4156)
Expand Down
2 changes: 1 addition & 1 deletion config/db
Expand Up @@ -13,7 +13,7 @@ rvm_remote_server_url=https://rvm_io.global.ssl.fastly.net/binaries
# RubyGems
#
gem_gem-empty_version=>=1.1.2
gem_gem-wrappers_version=>=1.3.2
gem_gem-wrappers_version=>=1.4.0
gem_rdoc_version=>=4.1.1
gem_rvm_version=>=1.11.3.9
rubygems_repo_url=https://github.com/rubygems/rubygems.git
Expand Down
2 changes: 2 additions & 0 deletions docs/upgrade-notes.md
Expand Up @@ -68,3 +68,5 @@
rvm wrapper default --no-prefix

* RVM 1.25.11 'rvm remove' will by default remove gems, to remove only ruby use 'rvm uninstall'

* RVM 1.30 simplifies behavior of 'rvm wrapper' subcommand
Binary file removed gem-cache/gem-wrappers-1.3.2.gem
Binary file not shown.
Binary file added gem-cache/gem-wrappers-1.4.0.gem
Binary file not shown.
55 changes: 9 additions & 46 deletions help/wrapper.md
@@ -1,53 +1,16 @@
# Wrapper

Show path to wrapper / to all wrappers and
generate links to wrappers to `$rvm_path/bin` for easier use.
Show/regenrate wrappers.

Wrappers itself are generated always using <https://github.com/rvm/gem-wrappers>.
NOTE: This command delegates to 'gem wrapper' => <https://github.com/rvm/gem-wrappers>

## Usage

rvm wrapper ruby_string show [binary]
rvm wrapper ruby_string [wrapper_prefix|--no-prefix] [binary[ binary[ ...]]]
rvm wrapper show [ruby-version]
rvm wrapper regenrate [ruby-version]
rvm wrapper path executable_name [ruby-version]
rvm wrapper [help]

where `ruby_string` is the ruby version and gemset combination to provide wrapper links for
(it can also refer to a valid project path or alias), wrapper_prefix is what to prepend to the name
of the generated wrapper, and binary and binaries are the names of the binaries for which you wish
to provide a wrapper (e.g. gem).

## Default binaries

When no binaries are provided, rvm will (by default) generate wrapper links for

ruby, gem, rake, irb, rdoc, ri, testrb

## Example

If you wish to provide an environment-specific wrapper links for rspec with a rails3 gemset,
you could do:

$ rvm --create ree@rails3
$ rvm wrapper ree@rails3 r3 spec

Which would add r3_spec with the specified environment to the bin
directory where you installed rvm.

Alternatively, if you do:

$ rvm wrapper ruby-1.9.2-head --no-prefix

It will create links named ruby, gem, rake, irb, rdoc, ri and tesrb
in the rvm bin directory.

Finally, to show another real and common use, you can use wrapper
to generate ruby executables and gems for passenger to use. Namely:

$ rvm use ree@rails3 --passenger

is equivelant to:

$ rvm use ree@rails3
$ rvm wrapper ree@rails3 passenger

Which creates passenger_* binaries in the rvm bin directory using
ree and the rails3 gemset.
Where:
- `ruby-version` is the ruby version and gemset, it can also refer to a valid project path or alias,
- `executable_name` is something like `ruby` or `rake`.
2 changes: 1 addition & 1 deletion scripts/alias
@@ -1,6 +1,6 @@
#!/usr/bin/env bash

unset rvm_default_flag rvm_wrapper_name
unset rvm_default_flag

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/alias"
Expand Down
28 changes: 4 additions & 24 deletions scripts/cli
Expand Up @@ -299,10 +299,7 @@ __rvm_parse_args()

wrapper)
rvm_action="wrapper"
rvm_ruby_string="$next_token" ;
rvm_wrapper_name="$1"
(( $# == 0 )) || shift
rvm_ruby_args=("$@") # list of binaries, or empty
rvm_ruby_args=( "$next_token" "$@")
rvm_parse_break=1
;;

Expand Down Expand Up @@ -560,19 +557,8 @@ __rvm_parse_args()
(( $# == 0 )) || shift
;;

--passenger)
rvm_log "NOTE: If you are using Passenger 3 you no longer need the passenger_ruby,\nuse the wrapper script for your ruby instead (see 'rvm wrapper')"
rvm_wrapper_name="${rvm_token/--/}"
;;

--editor)
rvm_wrapper_name="${rvm_token/--/}"
;;

--symlink)
rvm_warn "--symlink has been removed, please see 'rvm wrapper'."
next_token="${1:-}"
(( $# == 0 )) || shift
--passenger|--editor)
rvm_warn "NOTE: ${rvm_token} flag is deprecated, RVM now automatically generates wrappers" # 2017-09-21
;;

-h|--help)
Expand Down Expand Up @@ -926,7 +912,7 @@ rvm()
"$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
;;

cleanup|tools|snapshot|disk-usage|repair|alias|docs|rubygems|migrate|cron|group)
cleanup|tools|snapshot|disk-usage|repair|alias|docs|rubygems|migrate|cron|group|wrapper)
"$rvm_scripts_path/${rvm_action}" "${rvm_ruby_args[@]}"
;;

Expand All @@ -941,12 +927,6 @@ rvm()
__rvm_run_wrapper "$rvm_action" "$rvm_action" "${rvm_ruby_args[@]}"
;;

wrapper)
"$rvm_scripts_path/wrapper" "$rvm_ruby_string" "$rvm_wrapper_name" "${rvm_ruby_args[@]}"
result=$?
unset rvm_wrapper_name
;;

do)
old_rvm_ruby_string=${rvm_ruby_string:-}
unset rvm_ruby_string
Expand Down
15 changes: 8 additions & 7 deletions scripts/functions/gemset
Expand Up @@ -132,7 +132,7 @@ is_gem_installed()
else
version_check="*([[:digit:]\.])"
fi
ls -ld "${rvm_ruby_gem_home}/gems"/${gem_name}-${version_check} >/dev/null 2>&1 ||
ls -ld "${rvm_ruby_gem_home:-$GEM_HOME}/gems"/${gem_name}-${version_check} >/dev/null 2>&1 ||
"${rvm_ruby_binary}" -rrubygems -e "$gem_spec" 2>/dev/null ||
return $?
}
Expand Down Expand Up @@ -325,14 +325,14 @@ gemset_initial()
done
__rvm_log_command "gemset.wrappers.$1" \
"$rvm_ruby_string - #generating ${1} wrappers" \
run_gem_wrappers_regenerate 2>/dev/null || true
run_gem_wrappers regenerate 2>/dev/null || true
}

run_gem_wrappers_regenerate()
run_gem_wrappers()
{
gem_install gem-wrappers &&
gem wrappers regenerate ||
return $?
gem_install gem-wrappers >/dev/null &&
gem wrappers "$@" ||
return $?
}

__rvm_rubygems_create_link()
Expand Down Expand Up @@ -428,7 +428,8 @@ gemset_reset_env()
export rvm_use_flag=0
__rvm_use "${1:-}"
__rvm_ensure_has_environment_files &&
run_gem_wrappers_regenerate
run_gem_wrappers regenerate ||
return $?
)

# Transform the list of gems one version per line
Expand Down
2 changes: 1 addition & 1 deletion scripts/functions/manage/rubinius
Expand Up @@ -63,7 +63,7 @@ rubinius_install_ensure_wrappers()
{
[[ -x "$rvm_wrappers_path/$ruby/ruby" && -x "$rvm_wrappers_path/$ruby/gem" ]] ||
__rvm_log_command "gemset.wrappers.rubinius" "$ruby - #generating wrappers" \
run_gem_wrappers_regenerate ||
run_gem_wrappers regenerate ||
return $?
rubinius_install_ensure_gem rake || return $?
rubinius_install_ensure_gem bundle bundler || return $?
Expand Down
2 changes: 1 addition & 1 deletion scripts/functions/selector
Expand Up @@ -8,7 +8,7 @@ source "${rvm_scripts_path}/functions/selector_interpreters"
__rvm_select_set_variable_defaults()
{
export GEM_HOME GEM_PATH MY_RUBY_HOME RUBY_VERSION IRBRC
export rvm_env_string rvm_action rvm_alias_expanded rvm_archive_extension rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_type rvm_dump_environment_flag rvm_error_message rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gemset_name rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_hook rvm_install_on_use_flag rvm_llvm_flag rvm_loaded_flag rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_sdk rvm_silent_flag rvm_sticky_flag rvm_system_flag rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_verbose_flag rvm_wrapper_name
export rvm_env_string rvm_action rvm_alias_expanded rvm_archive_extension rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_type rvm_dump_environment_flag rvm_error_message rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gemset_name rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_hook rvm_install_on_use_flag rvm_llvm_flag rvm_loaded_flag rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_sdk rvm_silent_flag rvm_sticky_flag rvm_system_flag rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_verbose_flag
}

__rvm_select_detect_ruby_string()
Expand Down
2 changes: 1 addition & 1 deletion scripts/initialize
Expand Up @@ -141,6 +141,6 @@ Error:
rvm_debug_flag:${rvm_debug_flag:=0} \
rvm_gems_cache_path:${rvm_gems_cache_path:=${rvm_gems_path:-"$rvm_path/gems"}/cache}

export rvm_action rvm_alias_expanded rvm_archive_extension rvm_archives_path rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_path rvm_docs_type rvm_dump_environment_flag rvm_environments_path rvm_error_message rvm_examples_path rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gems_cache_path rvm_gems_path rvm_gemset_name rvm_gemset_separator rvm_gemsets_path rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_help_path rvm_docs_path rvm_hook rvm_hooks_path rvm_install_on_use_flag rvm_lib_path rvm_llvm_flag rvm_loaded_flag rvm_log_path rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_patches_path rvm_path rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_repos_path rvm_rubies_path rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_scripts_path rvm_sdk rvm_user_install_flag rvm_silent_flag rvm_src_path rvm_sticky_flag rvm_system_flag rvm_tmp_path rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_user_path rvm_usr_path rvm_verbose_flag rvm_wrapper_name rvm_wrappers_path rvm_ruby_repo_branch rvm_man_path rvm_remote_flag
export rvm_action rvm_alias_expanded rvm_archive_extension rvm_archives_path rvm_bin_flag rvm_bin_path rvm_debug_flag rvm_default_flag rvm_delete_flag rvm_docs_path rvm_docs_type rvm_dump_environment_flag rvm_environments_path rvm_error_message rvm_examples_path rvm_expanding_aliases rvm_file_name rvm_gemdir_flag rvm_gems_cache_path rvm_gems_path rvm_gemset_name rvm_gemset_separator rvm_gemsets_path rvm_gemstone_package_file rvm_gemstone_url rvm_head_flag rvm_help_path rvm_docs_path rvm_hook rvm_hooks_path rvm_install_on_use_flag rvm_lib_path rvm_llvm_flag rvm_loaded_flag rvm_log_path rvm_niceness rvm_nightly_flag rvm_only_path_flag rvm_parse_break rvm_patch_original_pwd rvm_patches_path rvm_path rvm_pretty_print_flag rvm_proxy rvm_quiet_flag rvm_reload_flag rvm_remove_flag rvm_repos_path rvm_rubies_path rvm_ruby_alias rvm_ruby_args rvm_ruby_binary rvm_ruby_bits rvm_ruby_configure rvm_ruby_file rvm_ruby_gem_home rvm_ruby_gem_path rvm_ruby_global_gems_path rvm_ruby_home rvm_ruby_interpreter rvm_ruby_irbrc rvm_ruby_major_version rvm_ruby_make rvm_ruby_make_install rvm_ruby_minor_version rvm_ruby_mode rvm_ruby_name rvm_ruby_package_file rvm_ruby_package_name rvm_ruby_patch rvm_ruby_patch_level rvm_ruby_release_version rvm_ruby_repo_url rvm_ruby_revision rvm_ruby_selected_flag rvm_ruby_sha rvm_ruby_string rvm_ruby_strings rvm_ruby_tag rvm_ruby_url rvm_ruby_user_tag rvm_ruby_version rvm_script_name rvm_scripts_path rvm_sdk rvm_user_install_flag rvm_silent_flag rvm_src_path rvm_sticky_flag rvm_system_flag rvm_tmp_path rvm_token rvm_trace_flag rvm_use_flag rvm_user_flag rvm_user_path rvm_usr_path rvm_verbose_flag rvm_wrappers_path rvm_ruby_repo_branch rvm_man_path rvm_remote_flag

fi # if [[ -z "${rvm_tmp_path:-}" ]] || (( __rvm_env_loaded == 1 ))
2 changes: 1 addition & 1 deletion scripts/repair
Expand Up @@ -54,7 +54,7 @@ repair_wrappers()
__rvm_log_command \
"wrappers.regenerate.$ruby_name" \
"Regenerating wrappers for $ruby_name" \
__rvm_with $ruby_name run_gem_wrappers_regenerate ||
__rvm_with $ruby_name run_gem_wrappers regenerate ||
failed_wrappers+=( "$wrapper_ruby_name" )
done

Expand Down
160 changes: 25 additions & 135 deletions scripts/wrapper
@@ -1,146 +1,36 @@
#!/usr/bin/env bash

default_flag="$rvm_default_flag"

# Prevent recursion
unset rvm_default_flag rvm_wrapper_name prefix
unset rvm_default_flag

source "$rvm_scripts_path/base"

# Empty ruby string: show usage and exit.
[[ -n "${1:-}" ]] ||
__use_ruby_if_needed()
{
rvm_help wrapper "$@"
exit 1
}

ruby_string="$1"
shift
prefix="${1:-}"
(( $# == 0 )) || shift

case "${prefix:-}" in
(--no-links)
rvm_error "Used '--no-links' this no operation as wrappers only creates links now."
exit 1
;;
esac

if (( $# ))
then binaries=("$@")
else binaries=(ruby gem irb ri rdoc rake erb testrb)
fi

override_check=0
(( ${rvm_default_flag:-0} == 0 )) || prefix="default"

# Use the correct ruby.
__rvm_become "$ruby_string" || {
rvm_error "Could not load ruby $ruby_string."
exit 3
[[ -z "$1" ]] || __rvm_become "$1" || {
rvm_error "Could not load ruby $1"
exit 2
}
}

# strip trailing / so we can use ${...%/*} to get parent
rvm_bin_path="${rvm_bin_path%/}"
rvm_wrappers_path="${rvm_wrappers_path%/}"
if
[[ -d "$rvm_bin_path" && ! -w "$rvm_bin_path" ]] ||
[[ ! -d "$rvm_bin_path" && ! -w "${rvm_bin_path%/*}" ]]
then
# can not write currently set location, try to switch relatively to wrappers path
rvm_error "No bin path suitable for linking wrapper. Try setting 'rvm_bin_path'."
exit 4
fi
[[ -d "$rvm_bin_path" ]] || mkdir -p "$rvm_bin_path"

environment_identifier="$(__rvm_env_string)"

case "${prefix:-}" in
case "${1:-}" in
(show)
ls "${rvm_wrappers_path}/${environment_identifier}/"${1:-*}
exit $?
__use_ruby_if_needed "${2:-}"
run_gem_wrappers show
;;
(regenerate)
__use_ruby_if_needed "${2:-}"
run_gem_wrappers regenerate
;;
(path)
__use_ruby_if_needed "${3:-}"
run_gem_wrappers show $2
;;
(help)
shift
rvm_help wrapper "$@"
;;
("")
rvm_help wrapper "$@"
exit 1
;;
esac

__rvm_log_command "gemset.wrappers.$ruby_string" \
"Regenerating $environment_identifier wrappers" \
run_gem_wrappers_regenerate 2>/dev/null || true

__rvm_ensure_has_environment_files
if [[ -d "$rvm_rubies_path/$ruby_string" ]]
then environment_source="$ruby_string"
else environment_source="$environment_identifier"
fi

find_all_wrappers()
{
\typeset -a search_paths
\typeset _path
search_paths=()
for _path in \
"$rvm_gems_path/${environment_identifier}"/bin/ \
"$rvm_gems_path/${environment_identifier%%@*}@global"/bin/ \
"$rvm_rubies_path/${environment_identifier%%@*}"/bin/
do
if [[ -d "${_path}" ]]
then search_paths+=( "${_path}" )
fi
done
(( ${#search_paths[@]} )) || return 0
__rvm_find "${search_paths[@]}" -type f -perm -u=x | __rvm_awk -F/ '{print $NF}'
}

if
[[ " ${binaries[*]} " == *" --all "* ]]
then
old_binaries=( "${binaries[@]}" )
__rvm_read_lines binaries <(
for binary_name in "${old_binaries[@]}"
do
if
[[ "$binary_name" == "--all" ]]
then
find_all_wrappers "${environment_identifier}"
else
echo "${binary_name}"
fi
done | sort -u
)
fi

# For each binary, we want to generate the wrapper / symlink
# it to the existing wrapper if needed.
for binary_name in "${binaries[@]}"
do
file_name="$rvm_wrappers_path/${environment_source}/${binary_name##*\/}"
file_name=${file_name// /_}
if
[[ -f "$file_name" || -f "$binary_name" ]] ||
__rvm_which "$binary_name"
then
if [[ ! -f "$file_name" && -f "$binary_name" ]]
then gem wrappers "$binary_name"
fi
case "${prefix:-}" in
(--no-prefix) destination="$rvm_bin_path/${binary_name##*\/}" ;;
("") destination="$rvm_bin_path/${binary_name##*\/}-${environment_identifier}" ;;
(*) destination="$rvm_bin_path/${prefix}_${binary_name##*\/}" ;;
esac
else
rvm_warn "Could not find file '$binary_name' nor '$file_name'."
destination=""
fi
if
[[ -n "$destination" ]]
then
destination="${destination// /_}"
destination="${destination//ruby-ruby-/ruby-}"
if
[[ -s "$destination" ]]
then
\command \rm -f "$destination"
fi
ln -sf "$file_name" "$destination"
rvm_verbose_log "Saved wrapper: $destination"
fi
done

0 comments on commit c999d48

Please sign in to comment.