123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684 |
- #!/usr/bin/env bash
- source "$rvm_scripts_path/base"
- source "$rvm_scripts_path/functions/build" # For gems with C extensions.
- gemset_list_all()
- {
- for rvm_ruby_string in $( __rvm_list_strings )
- do
- (__rvm_use ; gemset_list)
- done
- unset rvm_ruby_string
- }
- gemset_list_strings()
- {
- \typeset gem_string
- for rvm_ruby_string in $( __rvm_list_strings )
- do
- for gem_string in "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}" "${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}"*
- do
- printf "%b" "${gem_string##*/}\n"
- done
- done
- unset rvm_ruby_string
- }
- gemset_update()
- {
- if
- [[ -z "$rvm_ruby_strings" ]]
- then
- rvm_log "Running gem update for all rubies and gemsets."
- else
- rvm_log "Running gem update for the specified rubies."
- fi
- export rvm_ruby_strings="${rvm_ruby_strings:-all-gemsets}"
- export rvm_verbose_flag=1
- "$rvm_scripts_path/set" do gem update
- return $?
- }
- gemset_globalcache()
- {
- \typeset gc_status globalcache_enabled directories directory_name \
- full_directory_path directory_name
- if [[ "$1" == "enabled" ]]
- then
- if __rvm_using_gemset_globalcache
- then
- gc_status="Enabled"
- globalcache_enabled=0
- else
- gc_status="Disabled"
- globalcache_enabled=1
- fi
- rvm_log "Gemset global cache is currently: $gc_status"
- return $globalcache_enabled
- elif [[ "$1" == "disable" ]]
- then
- rvm_log "Removing the global cache (note: this will empty the caches)"
- __rvm_read_lines directories <(
- __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
- __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
- )
- for directory_name in "${directories[@]//.\/}"
- do
- current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
- if [[ -L "$current_cache_path" \
- && "$(__rvm_readlink "$current_cache_path")" == "$rvm_gems_cache_path" ]]
- then
- rvm_log "Reverting the gem cache for $directory_name to an empty directory."
- \command \rm -f "$current_cache_path" 2>/dev/null
- mkdir -p "$current_cache_path" 2>/dev/null
- fi
- done
- __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "delete"
- elif [[ "$1" == "enable" ]]
- then
- rvm_log "Enabling global cache for gems."
- mkdir -p "$rvm_gems_cache_path"
- __rvm_read_lines directories <(
- __rvm_cd "${rvm_gems_path:-"$rvm_path/gems"}" ;
- __rvm_find . -maxdepth 1 -mindepth 1 -type d -print | cut -c 3-
- )
- for directory_name in "${directories[@]//.\/}"
- do
- current_cache_path="${rvm_gems_path:-"$rvm_path/gems"}/$directory_name/cache"
- if [[ -d "$current_cache_path" && ! -L "$current_cache_path" ]]
- then
- rvm_log "Moving the gem cache for $directory_name to the global cache."
- \command \mv "$current_cache_path/"*.gem "$rvm_gems_cache_path/" 2>/dev/null
- case "${current_cache_path%\/}" in
- *cache)
- __rvm_rm_rf "$current_cache_path"
- ln -fs "$rvm_gems_cache_path" "$current_cache_path"
- ;;
- esac
- fi
- done
- __rvm_db_ "$rvm_user_path/db" "use_gemset_globalcache" "true"
- else
- printf "%b" "
- Usage:
- rvm gemset globalcache {enable,disable,enabled}
- Enable / Disable / Status the use of a global gem cachedir.
- "
- return 1
- fi
- }
- gemset_name()
- {
- echo "${rvm_ruby_gem_home##*${rvm_gemset_separator:-"@"}}"
- return $?
- }
- gemset_dir()
- {
- echo "$rvm_ruby_gem_home"
- return $?
- }
- __gemset_list_single()
- {
- \typeset gemset current_gemset ruby_name default_name
- gemset="$1"
- current_gemset="$2"
- gemset="${gemset##*/}"
- ruby_name="${gemset%%${rvm_gemset_separator:-@}*}"
- gemset="${gemset#${ruby_name}}"
- gemset="${gemset#${rvm_gemset_separator:-@}}"
- if [[ "${_second_param}" == "strings" ]]
- then default_name="default"
- else default_name="(default)"
- fi
- [[ -n "${gemset}" ]] || gemset="$default_name"
- [[ -n "${current_gemset}" ]] || current_gemset="$default_name"
- if
- [[ "${gemset}" == "${current_gemset}" ]]
- then
- if [[ "${_second_param}" == "strings" ]]
- then echo "${gemset} #current"
- else echo "=> ${gemset}"
- fi
- else
- if [[ "${_second_param}" == "strings" ]]
- then echo "${gemset}"
- else echo " ${gemset}"
- fi
- fi
- }
- gemset_list()
- {
- [[ -d "${rvm_gems_path:-"$rvm_path/gems"}" ]] || {
- rvm_error "${rvm_gems_path:-"$rvm_path/gems"} does not exist!"
- return 1
- }
- [[ -n "${rvm_ruby_string:-""}" ]] || {
- rvm_error "\$rvm_ruby_string is not set!"
- return 1
- }
- \typeset current_gemset IFS
- current_gemset=$(__rvm_current_gemset)
- IFS=""
- [[ "${_second_param}" == "strings" ]] ||
- rvm_log "\ngemsets for $rvm_ruby_string (found in ${rvm_gems_path:-"$rvm_path/gems"}/$rvm_ruby_string)"
- for gemset in ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string} ${rvm_gems_path:-${rvm_path}/gems}/${rvm_ruby_string}${rvm_gemset_separator:-@}*
- do
- __gemset_list_single "${gemset}" "${current_gemset}"
- done
- [[ "${_second_param}" == "strings" ]] || printf "%b" "\n"
- }
- gemset_delete_task()
- {
- \typeset rvm_gemset_name ruby_at_gemset gemdir
- rvm_gemset_name=$1
- ruby_at_gemset=$2
- gemdir=$3
- case ${_system_type} in
- (BSD)
- # will not find broken links
- __rvm_find "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
- __rvm_find -L "${rvm_bin_path:=$rvm_path/bin}" -name \*${ruby_at_gemset} -exec rm -rf '{}' \;
- ;;
- (*)
- __rvm_find "${rvm_bin_path:=$rvm_path/bin}" \( -name \*${ruby_at_gemset} -or -lname \*${ruby_at_gemset}/\* \) -delete
- ;;
- esac
- for item in $( $rvm_scripts_path/alias search_by_target ${ruby_at_gemset} )
- do
- $rvm_scripts_path/alias delete ${item}
- done
- __rvm_rm_rf "$gemdir" &&
- __rvm_rm_rf "${rvm_wrappers_path:="$rvm_path/wrappers"}/${ruby_at_gemset}" &&
- __rvm_rm_rf "${rvm_environments_path:="$rvm_path/environments"}/${ruby_at_gemset}"
- }
- gemset_delete()
- {
- [[ -n "${GEM_HOME:-}" ]] ||
- {
- rvm_error "A ruby must be selected in order to delete a gemset."
- return 1
- }
- if (( ${rvm_ruby_selected_flag:-0} == 0))
- then __rvm_ruby_string
- fi
- [[ -n "$rvm_gemset_name" ]] ||
- {
- rvm_error "A gemset name must be specified in order to delete a gemset."
- return 1
- }
- ruby_at_gemset="$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name"
- gemdir="${rvm_gems_path:-$rvm_path/gems}/${ruby_at_gemset}"
- [[ -e "$gemdir" ]] ||
- {
- rvm_warn "$gemdir did not previously exist. Ignoring."
- return 0
- }
- (( ${rvm_force_flag:-0} )) ||
- __rvm_ask_for "Are you SURE you wish to remove the entire gemset directory '$rvm_gemset_name' ($gemdir)?" yes ||
- {
- rvm_log "Not doing anything, phew... close call that one eh?"
- return 2
- }
- __rvm_log_command "gemset.delete" "Removing gemset $rvm_gemset_name" \
- gemset_delete_task "$rvm_gemset_name" "$ruby_at_gemset" "$gemdir"
- }
- gemset_empty()
- {
- \typeset gemdir entry
- if
- [[ -n "${GEM_HOME}" ]]
- then
- if
- [[ ${rvm_force_flag:-0} -gt 0 ]] ||
- __rvm_ask_for "Are you SURE you wish to remove the installed gems for ${GEM_HOME}?" yes
- then
- gem_install gem-empty &&
- \command \gem empty &&
- rvm_log "Removed successfully." ||
- return $?
- else
- rvm_log "Not doing anything, phew... close call that one eh?"
- return 2
- fi
- fi
- }
- # Migrate gemsets from ruby X to ruby Y
- gemset_copy()
- {
- \typeset source_ruby destination_ruby source_path destination_path
- # Clear the current environment so that it does not influence this operation.
- unset rvm_gemset_name rvm_ruby_gem_home GEM_HOME GEM_PATH
- source_ruby="${1:-}"
- destination_ruby="${2:-}"
- shift 2
- if
- [[ -z "$destination_ruby" || -z "$source_ruby" ]]
- then
- rvm_help gemset copy
- return 1
- fi
- # Verify the destination gemset exists before attempting to use it.
- (
- rvm_ruby_string="$destination_ruby"
- export rvm_create_flag=1
- { __rvm_ruby_string && __rvm_gemset_select; } 2> /dev/null
- ) ||
- {
- rvm_error "Destination gemset '$destination_ruby' does not yet exist."
- return 1
- }
- # TODO: Account for more possibilities:
- # rvm gemset copy 1.9.2 @gemsetb # From 1.9.2 default to current ruby, 1.9.2 exists.
- # rvm gemset copy @gemseta @gemsetb # Current ruby, gemseta exists.
- # rvm gemset copy gemseta gemsetb # Currently Ruby, gemseta exists.
- # rvm gemset copy gemseta 1.8.7@gemsetb # Currently Ruby@gemseta, current ruby@gemseta exists.
- source_path=$(
- __rvm_select "$source_ruby" > /dev/null 2>&1
- echo $rvm_ruby_gem_home
- )
- destination_path=$(
- __rvm_select "$destination_ruby" > /dev/null 2>&1
- echo $rvm_ruby_gem_home${rvm_expected_gemset_name:+@}${rvm_expected_gemset_name:-}
- )
- if
- [[ -z "$source_path" || ! -d "$source_path" ]]
- then
- rvm_error "Unable to expand '$source_ruby' or directory does not exist."
- return 1
- elif
- [[ -z "$destination_path" ]]
- then
- rvm_error "Unable to expand '$destination_ruby'."
- return 1
- fi
- if
- [[ -d "$source_path" ]]
- then
- rvm_log "Copying gemset from $source_ruby to $destination_ruby"
- for dir in "$source_path"/*
- do
- if
- [[ -d "$dir" ]]
- then
- __rvm_cp -Rf "$dir" "$destination_path/"
- elif
- [[ -L "$dir" ]]
- then
- __rvm_cp "$dir" "$destination_path/${dir##*/}"
- else
- rvm_debug "$dir not a file or link, not copying"
- fi
- done
- __rvm_log_command "gemset.wrappers" "Generating gemset wrappers ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
- __rvm_gemset_pristine "$destination_ruby"
- else
- rvm_error "Gems directory does not exist for $source_path ($source_path)"
- return 1
- fi
- }
- # Migrate gemsets from ruby X to ruby Y
- gemset_rename_()
- {
- \command \mv "$source_path" "$destination_path" &&
- \command \rm "${rvm_wrappers_path:="$rvm_path/wrappers"}/${source_path##*/}" &&
- \command \rm "${rvm_environments_path:="$rvm_path/environments"}/${source_path##*/}"
- }
- # Migrate gemsets from ruby X to ruby Y
- gemset_rename()
- {
- \typeset source_name destination_name source_path destination_path
- source_name="${1:-}"
- destination_name="${2:-""}"
- shift 2
- if
- [[ -z "$destination_name" || -z "$source_name" ]]
- then
- rvm_error "Source and destination gemsets must be specified: 'rvm gemset rename X Y'"
- return 1
- fi
- source_path="$(
- rvm_use_flag=0 rvm_silence_logging=1 rvm_gemset_name=${source_name} __rvm_use "${rvm_ruby_string}@${source_name}" 1>&2 ;
- gem env gemdir
- )"
- if
- [[ -z "$source_path" || ! -d "$source_path" ]]
- then
- rvm_error "gemset '$source_name' does not exist."
- return 2
- fi
- destination_path=${source_path/%$source_name/$destination_name}
- if
- [[ -d "$source_path" ]]
- then
- if
- [[ ! -d "$destination_path" ]]
- then
- __rvm_log_command "gemset.rename" "Renaming gemset ${source_path##*/} => ${destination_path##*/}" gemset_rename_ &&
- __rvm_log_command "gemset.reset" "Reseting gemset ${destination_path##*/}" gemset_reset_env "${destination_path##*/}" &&
- __rvm_gemset_pristine "${destination_path##*/}"
- else
- rvm_error "Gemset $destination_name already exists!"
- return 1
- fi
- else
- rvm_error "Gems directory does not exist for $source_path ($source_path)"
- return 1
- fi
- }
- gemset_unpack()
- {
- \typeset gems name directory version _platforms
- directory="${1:-vendor/gems}"
- if
- [[ -n "$rvm_ruby_gem_home" ]]
- then
- export GEM_HOME="$rvm_ruby_gem_home"
- export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
- fi
- rvm_log "Unpacking current environments gemset to ${directory}\n"
- unset -f gem
- while read gem_name version _platforms
- do
- ( command gem unpack "$gem_name" -v"$version" --target "$directory" )&
- done <<<"$(
- GEM_PATH="$GEM_HOME" __rvm_list_gems
- )"
- wait
- rvm_log "Unpacking into ${directory} complete\n"
- return 0
- }
- gemset_export()
- {
- \typeset rvm_file_name gem_name version versions _platforms
- rvm_file_name="${1:-}"
- if
- [[ -n "$rvm_ruby_gem_home" ]]
- then
- export GEM_HOME="$rvm_ruby_gem_home"
- export GEM_PATH="$rvm_ruby_gem_home:$rvm_ruby_global_gems_path"
- fi
- if
- [[ -n "$rvm_file_name" ]]
- then
- [[ "${rvm_file_name}" == *Gemfile ]] || rvm_file_name="${rvm_file_name%.gems}.gems"
- else
- if [[ -n "$rvm_gemset_name" ]]
- then rvm_file_name="$rvm_gemset_name.gems"
- else rvm_file_name="default.gems"
- fi
- fi
- rvm_log "Exporting current environments gemset to $rvm_file_name"
- if [[ -f "$rvm_file_name" ]]
- then \command \rm -f "$rvm_file_name"
- fi
- if
- [[ "${rvm_file_name}" == *Gemfile ]]
- then
- printf "%b" "source 'https://rubygems.org'
- #ruby=${GEM_HOME##*/}
- "
- else
- printf "%b" "# $rvm_file_name generated gem export file. \
- Note that any env variable settings will be missing. \
- Append these after using a ';' field separator
- "
- fi > "$rvm_file_name"
- if
- (( ${rvm_latest_flag:-0} == 0 ))
- then
- while read gem_name version _platforms
- do
- if [[ "${rvm_file_name}" == *Gemfile ]]
- then echo "gem '$gem_name', '$version'"
- else echo "$gem_name -v$version"
- fi
- done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"
- else
- while read gem_name versions
- do
- if [[ "${rvm_file_name}" == *Gemfile ]]
- then echo "gem '$gem_name'"
- else echo "$gem_name"
- fi
- done <<<"$( GEM_PATH="$GEM_HOME" gem list )"
- fi >> "$rvm_file_name"
- }
- # Output the user's current gem directory.
- gemset_info()
- {
- if
- (( ${rvm_user_flag:-0} == 1 ))
- then
- (__rvm_use system ; gem env | __rvm_grep "\- $HOME" | __rvm_awk '{print $NF}')
- elif
- [[ ${rvm_system_flag:-0} == 1 ]]
- then
- (__rvm_use system ; gem env $action system)
- elif
- [[ -n "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}" ]]
- then
- #TODO: why on ubuntu oneiric 32bit it's not enough to use gem env? why need to use again???
- (
- __rvm_use "${rvm_ruby_string:-""}${rvm_gemset_name:+${rvm_gemset_separator:-"@"}}${rvm_gemset_name:-}"
- gem env $action
- )
- else
- gem env $action
- fi
- return $?
- }
- gemset_prune()
- {
- \typeset temporary_cache_path live_cache_path gemset_name version versions cached_gem_name cached_file_path
- temporary_cache_path="$GEM_HOME/temporary-cache"
- live_cache_path="$GEM_HOME/cache"
- mkdir -p "$temporary_cache_path"
- rvm_log "Moving active gems into temporary cache..."
- while
- read gem_name version _platforms
- do
- cached_gem_name="${gem_name}-${version}.gem"
- cached_file_path="${live_cache_path}/${cached_gem_name}"
- if
- [[ -f "$cached_file_path" ]]
- then
- \command \mv "$cached_file_path" "${temporary_cache_path}/${cached_gem_name}"
- fi
- done <<<"$( GEM_PATH="$GEM_HOME" __rvm_list_gems )"
- rvm_log "Removing live cache and restoring temporary cache..."
- # Switch the cache back.
- __rvm_rm_rf "$live_cache_path"
- \command \mv "$temporary_cache_path" "$live_cache_path"
- return 0
- }
- gem_search()
- {
- \typeset gemspec gemspecs gem_name option environment_id ruby_string name gem_version
- gem_name="${1:-}"
- option="${2:-}"
- if [[ -z "${gem_name}" ]]
- then
- return 0
- fi
- true "${rvm_gems_path:="$rvm_path/gems"}"
- __rvm_read_lines gemspecs <(
- __rvm_find "${rvm_gems_path}" -mindepth 3 -iname "${gem_name}*.gemspec" -type f
- )
- if [[ "${option}" != "strings" ]]
- then
- printf "%-40s %-20s %-20s\n" "environment_id" "name" "version"
- printf "%b" "================================================================================\n"
- fi
- for gemspec in "${gemspecs[@]}"
- do
- environment_id="${gemspec//${rvm_gems_path}\/}"
- environment_id="${environment_id//\/*}"
- ruby_string="${environment_id//@*}"
- gemset_name="${environment_id//${ruby_string}}"
- name=${gemspec//*\/}
- name=${name/%.gemspec}
- gem_version=${name}
- name=${name%%-+([0-9\.])}
- gem_version=${gem_version#${name}-}
- if [[ "$name" == "$gem_version" ]]
- then gem_version=""
- fi
- if [[ "${option}" != "strings" ]]
- then
- printf "%-40s %-20s %-20s\n" "${environment_id}" "${name}" "${gem_version}"
- else
- printf "%b" "${environment_id}\n"
- fi
- done
- }
- action="$1"
- (( $# == 0 )) || shift
- export _second_param="${1:-}"
- export rvm_gemset_name="${1:-}"
- rvm_sticky_flag=1
- gemset_actions_with_gem=(
- gemdir gempath gemhome home path version export dump import
- load pristine copy install initial prune rename update unpack
- )
- if
- [[ " ${gemset_actions_with_gem[*]} " == *" $action "* ]] &&
- ! builtin command -v gem > /dev/null
- then
- rvm_error "'gem' was not found, cannot perform gem actions (Do you have an RVM ruby selected?)"
- exit 1
- fi
- if [[ " $* " == *" --force "* ]]
- then export rvm_force_flag=1
- fi
- if
- [[ -z "$rvm_ruby_string" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
- then
- rvm_ruby_string="${GEM_HOME##*/}"
- rvm_ruby_string="${rvm_ruby_string%%@*}"
- fi
- if
- [[ -z "$rvm_gemset_name" && "${GEM_HOME:-""}" == "${rvm_path}"* ]]
- then
- rvm_gemset_name="${GEM_HOME##*/}"
- rvm_gemset_name="${rvm_gemset_name#${rvm_gemset_name%%@*}}"
- rvm_gemset_name="${rvm_gemset_name#@}"
- fi
- rvm_ruby_gem_home="${rvm_ruby_gem_home:-$GEM_HOME}"
- if
- [[ ! -d "$rvm_ruby_gem_home" ]] &&
- builtin command -v gem > /dev/null 2>&1
- then
- rvm_ruby_gem_home="$(gem env home)"
- fi
- case "$action" in
- import|load)
- if
- [[ -z "${rvm_ruby_strings:-""}" ]]
- then
- gemset_import "Installing gems" "$1"
- else
- rubies=()
- __rvm_custom_separated_array rubies , "$rvm_ruby_strings"
- for rvm_ruby_string in "${rubies[@]}"
- do
- __rvm_with "$rvm_ruby_string" gemset_import "Installing gems" "$1"
- done
- fi
- ;;
- export|dump)
- gemset_export "$@"
- ;;
- empty)
- __rvm_use "${1:+@}${1:-${GEM_HOME##*/}}"
- gemset_$action "$@"
- ;;
- create|initial|list)
- __rvm_select
- rvm_gemset_name="${rvm_gemset_name:-${rvm_expected_gemset_name:-}}"
- gemset_$action "$@"
- ;;
- copy|delete|dir|globalcache|list_all|list_strings|pristine|prune|rename|update|unpack|reset_env)
- gemset_$action "$@"
- ;;
- name|string)
- gemset_name "$@"
- ;;
- strings)
- gemset_list "$@"
- ;;
- gemdir|gempath|gemhome|home|path|version)
- gemset_info "$@"
- ;;
- install|search)
- gem_$action "$@"
- ;;
- clear)
- rvm_error "'rvm gemset clear' has been deprecated. Please use 'rvm use @default' instead."
- ;;
- help)
- rvm_help gemset
- ;;
- *)
- rvm_error_help "Unknown subcommand '$action'" gemset
- exit 1
- ;;
- esac
|