scripts/gemsets in rvm-1.0.6 vs scripts/gemsets in rvm-1.0.7

- old
+ new

@@ -1,8 +1,8 @@ #!/usr/bin/env bash -source "$rvm_scripts_path/base" +source "$rvm_path/scripts/base" rvm_ruby_gem_home="${rvm_ruby_gem_home:-$GEM_HOME}" if [[ ! -d "$rvm_ruby_gem_home" ]] && command -v gem > /dev/null 2>&1; then rvm_ruby_gem_home="$(gem env home)" ; fi @@ -23,60 +23,95 @@ " } gemset_update() { if [[ -z "$rvm_ruby_strings" ]]; then - "$rvm_scripts_path/log" "info" "Running gem update for all rubies and gemsets." + "$rvm_path/scripts/log" "info" "Running gem update for all rubies and gemsets." - rvm_ruby_strings="$(builtin cd "$rvm_gems_path" ; find * -type d -maxdepth 0 -print 2>/dev/null | grep -v '^\(doc\|cache\|@\|system\)' | \tr '\n' ',')" + rvm_ruby_strings="$(builtin cd "$rvm_gems_path" ; find . -maxdepth 1 -mindepth 1 -type d -print 2>/dev/null | grep -v '^\(doc\|cache\|@\|system\)' | \tr '\n' ',')" rvm_ruby_strings="${rvm_ruby_strings/%,}" + rvm_ruby_strings="${rvm_ruby_strings//.\/}" else - "$rvm_scripts_path/log" "info" "Running gem update for the specified rubies." + "$rvm_path/scripts/log" "info" "Running gem update for the specified rubies." fi export rvm_ruby_strings - "$rvm_scripts_path/set" "gem" "update" + "$rvm_path/scripts/set" "gem" "update" return $? } gemset_globalcache() { + local gc_status globalcache_enabled directories directory_name full_directory_path directory_name + if [[ "$1" == "enabled" ]]; then + __rvm_using_gemset_globalcache - local globalcache_enabled="$?" - local gc_status="Unknown" - if [[ "$globalcache_enabled" == "0" ]]; then + + globalcache_enabled=$? + gc_status="Unknown" + + if [[ $globalcache_enabled -eq 0 ]]; then gc_status="Enabled" else gc_status="Disabled" fi - "$rvm_scripts_path/log" "info" "Gemset global cache is currently: $gc_status" + + "$rvm_path/scripts/log" "info" "Gemset global cache is currently: $gc_status" + return "$globalcache_enabled" + elif [[ "$1" == "disable" ]]; then - "$rvm_scripts_path/log" "info" "Removing the global cache (note: this will empty the caches)" - for directory_name in $(builtin cd "$rvm_gems_path" ; find * -type d -maxdepth 0 -print); do + + "$rvm_path/scripts/log" "info" "Removing the global cache (note: this will empty the caches)" + + directories=($(builtin cd "$rvm_gems_path" ; find . -maxdepth 1 -mindepth 1 -type d -print)) + + for directory_name in "${directories[@]//.\/}"; do + current_cache_path="$rvm_gems_path/$directory_name/cache" + if [[ -L "$current_cache_path" && "$(readlink "$current_cache_path")" == "$rvm_gems_cache_path" ]]; then - "$rvm_scripts_path/log" "info" "Reverting the gem cache for $directory_name to an empty directory." + + "$rvm_path/scripts/log" "info" "Reverting the gem cache for $directory_name to an empty directory." + rm -f "$current_cache_path" 2>/dev/null + mkdir -p "$current_cache_path" 2>/dev/null fi - done; unset full_directory_path directory_name - "$rvm_scripts_path/db" "$rvm_config_path/user" "use_gemset_globalcache" "delete" + done + + "$rvm_path/scripts/db" "$rvm_config_path/user" "use_gemset_globalcache" "delete" + elif [[ "$1" == "enable" ]]; then - "$rvm_scripts_path/log" "info" "Enabling global cache for gems." + + "$rvm_path/scripts/log" "info" "Enabling global cache for gems." + mkdir -p "$rvm_gems_cache_path" - for directory_name in $(builtin cd "$rvm_gems_path" ; find * -type d -maxdepth 0 -print); do + + directories=($(builtin cd "$rvm_gems_path" ; find . -maxdepth 1 -mindepth 1 -type d -print)) + + for directory_name in "${directories[@]//.\/}" ; do + current_cache_path="$rvm_gems_path/$directory_name/cache" + if [[ -d "$current_cache_path" && ! -L "$current_cache_path" ]]; then - "$rvm_scripts_path/log" "info" "Moving the gem cache for $directory_name to the global cache." + + "$rvm_path/scripts/log" "info" "Moving the gem cache for $directory_name to the global cache." + mv "$current_cache_path/"*.gem "$rvm_gems_cache_path/" 2>/dev/null + rm -rf "$current_cache_path" + ln -nfs "$rvm_gems_cache_path" "$current_cache_path" fi - done; unset full_directory_path directory_name - "$rvm_scripts_path/db" "$rvm_config_path/user" "use_gemset_globalcache" "true" + + done + + "$rvm_path/scripts/db" "$rvm_config_path/user" "use_gemset_globalcache" "true" + else printf " + Usage: rvm gemset globalcache {enable,disable} Enable / Disable the use of a global gem cachedir. @@ -85,299 +120,405 @@ return 1 fi } gemset_name() { - gemset_dir | awk -F${rvm_gemset_separator} '{print $2}' + gemset_dir | awk -F${rvm_gemset_separator:-"@"} '{print $2}' return $? } gemset_dir() { echo "$rvm_ruby_gem_home" return $? } gemset_create() { - local gem_home="" - local gemset="" - local prefix=$(echo $rvm_ruby_gem_home | sed 's/'${rvm_gemset_separator}'.*$//') + local gem_home gemset gemsets prefix - for gemset in $(echo $gems_args) ; do + prefix=$(echo $rvm_ruby_gem_home | sed 's/'${rvm_gemset_separator:-"@"}'.*$//') - if [[ "$gemset" == *"${rvm_gemset_separator}"* ]]; then - "$rvm_scripts_path/log" "error" "Can't do that, it contains a \"${rvm_gemset_separator}\"." + gemsets=(${args[@]}) + + for gemset in "${gemsets[@]}" ; do + + if [[ "$gemset" == *"${rvm_gemset_separator:-"@"}"* ]]; then + "$rvm_path/scripts/log" "error" "Can't do that, it contains a \"${rvm_gemset_separator:-"@"}\"." continue fi - gem_home="${prefix}${rvm_gemset_separator}${gemset}" + gem_home="${prefix}${rvm_gemset_separator:-"@"}${gemset}" - [[ ! -d "$gem_home" ]] && mkdir -p "$gem_home" + if [[ ! -d "$gem_home" ]] ; then + mkdir -p "$gem_home" + fi # When the globalcache is enabled, we need to ensure we setup the cache directory correctly. if __rvm_using_gemset_globalcache ; then + if [[ -d "$gem_home/cache" && ! -L "$gem_home/cache" ]]; then + mv "$gem_home/cache"/*.gem "$rvm_gems_cache_path/" 2>/dev/null + rm -rf "$gem_home/cache" fi + ln -nfs "$rvm_gems_cache_path" "$gem_home/cache" fi - "$rvm_scripts_path/log" "info" "'$gemset' gemset created ($gem_home)." + "$rvm_path/scripts/log" "info" "'$gemset' gemset created ($gem_home)." done return 0 } gemset_list() { - rvm_gems_path="${rvm_gems_path:-""}" - rvm_ruby_string="${rvm_ruby_string:-""}" if [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] ; then __rvm_select ; fi - "$rvm_scripts_path/log" "info" "gemsets for $rvm_ruby_string (found in $rvm_gems_path/$rvm_ruby_string)\n" + "$rvm_path/scripts/log" "info" \ + "\ngemsets for $rvm_ruby_string (found in $rvm_gems_path/$rvm_ruby_string)" - if [[ -n "$rvm_gems_path" ]] ; then - if [[ -n "$rvm_ruby_string" ]] ; then - ls "${rvm_gems_path}/" | awk -F"${rvm_gemset_separator}" "/${rvm_ruby_string}${rvm_gemset_separator}/{print \$2}" 2>/dev/null + if [[ -n "${rvm_gems_path:-""}" ]] ; then + + if [[ -n "${rvm_ruby_string:-""}" ]] ; then + + ls "${rvm_gems_path}/" | awk -F"${rvm_gemset_separator:-"@"}" "/${rvm_ruby_string}${rvm_gemset_separator:-"@"}/{print \$2}" 2>/dev/null + else - "$rvm_scripts_path/log" "error" "\$rvm_ruby_string is not set!" + "$rvm_path/scripts/log" "error" \ + "\$rvm_ruby_string is not set!" return 1 fi + else - "$rvm_scripts_path/log" "error" "\$rvm_gems_path is not set!" + "$rvm_path/scripts/log" "error" \ + "\$rvm_gems_path is not set!" return 1 fi printf "\n" return 0 } gemset_delete() { + if [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] ; then __rvm_select ; fi if [[ -n "$rvm_gemset_name" ]] ; then - gemdir="$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator}$rvm_gemset_name" - if [[ -d "$gemdir" ]] && [[ "$gemdir" != '/' ]] && [[ ! -z "$rvm_force_flag" ]] ; then - rm -rf "$gemdir" + + gemdir="$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator:-"@"}$rvm_gemset_name" + + if [[ -d "$gemdir" && "$gemdir" != '/' && ${rvm_force_flag:-0} -gt 0 ]] ; then + + rm -rf "$gemdir" + elif [[ -d "$gemdir" ]] ; then - "$rvm_scripts_path/log" "warn" "Are you SURE you wish to remove the entire gemset directory '$rvm_gemset_name' ($gemdir)?" - echo -n "(anything other than 'yes' will cancel) > " + "$rvm_path/scripts/log" "warn" "Are you SURE you wish to remove the entire gemset directory '$rvm_gemset_name' ($gemdir)?" + + printf "(anything other than 'yes' will cancel) > " + read response if [[ "yes" = "$response" ]] ; then - rm -f $gemdir/cache 2>/dev/null - rm -rf $gemdir + + if [[ -L "$gemdir/cache" ]] ; then + rm -f "$gemdir/cache" + fi + + rm -rf "$gemdir" + else - "$rvm_scripts_path/log" "info" "Not doing anything, phew... close call that one eh?" + "$rvm_path/scripts/log" "info" \ + "Not doing anything, phew... close call that one eh?" fi + else - "$rvm_scripts_path/log" "info" "$gemdir already does not exist." + "$rvm_path/scripts/log" "info" \ + "$gemdir already does not exist." fi + else - "$rvm_scripts_path/log" "error" "A gemset name must be specified in order to delete a gems." + "$rvm_path/scripts/log" "error" \ + "A gemset name must be specified in order to delete a gems." return 1 fi + return 0 } gemset_empty() { - if [[ -z "$rvm_ruby_gem_home" ]] ; then __rvm_select ; fi + + local gemdir + + if [[ -z "${rvm_ruby_gem_home:-""}" ]] ; then __rvm_select ; fi + gemdir="$rvm_ruby_gem_home" - if [[ -d "$gemdir" ]] && [[ "$gemdir" != '/' ]] && [[ ! -z "$rvm_force_flag" ]] ; then + + if [[ -d "$gemdir" && "$gemdir" != '/' && ${rvm_force_flag:-0} -gt 0 ]] ; then + builtin cd "$gemdir" && rm -rf ./bin/* ./doc/* ./gems/* ./specifications/* + elif [[ -d "$gemdir" ]] ; then - "$rvm_scripts_path/log" "warn" "Are you SURE you wish to remove the installed gemset for gemset '$(basename "$gemdir")' ($gemdir)?" + + "$rvm_path/scripts/log" "warn" \ + "Are you SURE you wish to remove the installed gemset for gemset '$(basename "$gemdir")' ($gemdir)?" + echo -n "(anything other than 'yes' will cancel) > " + read response + if [[ "yes" = "$response" ]] ; then + builtin cd "$gemdir" && rm -rf ./bin/* ./doc/* ./gems/* ./specifications/* + else - "$rvm_scripts_path/log" "info" "Not doing anything, phew... close call that one eh?" + "$rvm_path/scripts/log" "info" \ + "Not doing anything, phew... close call that one eh?" fi + else - "$rvm_scripts_path/log" "info" "$gemdir already does not exist." - fi ; unset gemdir + "$rvm_path/scripts/log" "info" \ + "$gemdir already does not exist." + fi + + return 0 } # Migrate gemsets from ruby X to ruby Y gemset_copy() { - local source_ruby="${args[1]:-""}" - local destination_ruby="${args[2]:-""}" + local source_ruby destination_ruby source_path destination_path + source_ruby="${args[1]:-""}" + destination_ruby="${args[2]:-""}" + if [[ -z "$destination_ruby" || -z "$source_ruby" ]] ; then - "$rvm_scripts_path/log" "error" "Source and destination must be specified: 'rvm gemset copy X Y'" + "$rvm_path/scripts/log" "error" "Source and destination must be specified: 'rvm gemset copy X Y'" return 1 fi # 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 # Currenty Ruby, gemseta exists. # rvm gemset copy gemseta 1.8.7@gemsetb # Currenty Ruby@gemseta, current ruby@gemseta exists. - local source_path="$(rvm_silence_logging=1 rvm "$source_ruby" gem env gemdir)" - local destination_path="$(rvm_silence_logging=1 rvm "$destination_ruby" gem env gemdir)" + source_path="$(rvm_silence_logging=1 rvm "$source_ruby" gem env gemdir)" + destination_path="$(rvm_silence_logging=1 rvm "$destination_ruby" gem env gemdir)" + if [[ -z "$source_path" || ! -d "$source_path" ]]; then - "$rvm_scripts_path/log" "error" "Unable to expand '$source_ruby' or directory does not exist." + "$rvm_path/scripts/log" "error" "Unable to expand '$source_ruby' or directory does not exist." return 1 fi if [[ -z "$destination_path" ]]; then - "$rvm_scripts_path/log" "error" "Unable to expand '$destination_ruby'" + "$rvm_path/scripts/log" "error" "Unable to expand '$destination_ruby'" return 1 fi if [[ -d "$source_path" ]] ; then - "$rvm_scripts_path/log" "info" "Copying gemset from $source_ruby to $destination_ruby" + "$rvm_path/scripts/log" "info" "Copying gemset from $source_ruby to $destination_ruby" for dir in bin doc gems specifications cache ; do + mkdir -p "$destination_path/$dir" - cp -Rf "$source_path/$dir" "$destination_path/" + + if [[ -d "$source_ruby/$dir" ]] ; then + cp -Rf "$source_path/$dir" "$destination_path/" + + elif [[ -L "$source_path/$dir" ]] ; then + cp "$source_path/$dir" "$destination_path/$dir" + fi + done - "$rvm_scripts_path/log" "info" "Making gemset for $destination_ruby pristine." + "$rvm_path/scripts/log" "info" \ + "Making gemset for $destination_ruby pristine." __rvm_run_with_env "gemset.pristine" "$destination_ruby" "rvm gemset pristine" + else - "$rvm_scripts_path/log" "error" "Gems directory does not exist for $source_path ($source_path)" + "$rvm_path/scripts/log" "error" \ + "Gems directory does not exist for $source_path ($source_path)" return 1 fi } gemset_export() { + local gems name file_name version versions + rvm_file_name="${rvm_file_name:-${gems_args// }}" - if [[ ! -z "$rvm_ruby_gem_home" ]] ; then + if [[ -n "$rvm_ruby_gem_home" ]] ; then export GEM_HOME="$rvm_ruby_gem_home" - export GEM_PATH="$rvm_ruby_gem_home/bin:$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator}global/bin" + export GEM_PATH="$rvm_ruby_gem_home/bin:$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator:-"@"}global/bin" export BUNDLE_PATH="$rvm_ruby_gem_home" fi if [[ -z "$rvm_file_name" ]] ; then - if [[ ! -z "$rvm_gemset_name" ]] ; then + + if [[ -n "$rvm_gemset_name" ]] ; then rvm_file_name="$rvm_gemset_name.gems" + else rvm_file_name="default.gems" fi fi - "$rvm_scripts_path/log" "info" "Exporting current environments gemset to $rvm_file_name" + "$rvm_path/scripts/log" "info" \ + "Exporting current environments gemset to $rvm_file_name" touch "$rvm_file_name" + echo "# $rvm_file_name generated gem export file. Note that any env variable settings will be missing. Append these after using a ';' field separator" > "$rvm_file_name" - for gem in $(gem list | sed 's#[\(|\)]##g' | sed 's#, #,#g' | tr ' ' ';') ; do + + gems=($(gem list | sed 's#[\(|\)]##g' | sed 's#, #,#g' | tr ' ' ';')) + + for gem in "${gems[@]}" ; do + name="${gem/;*/}" - if [[ -z "$rvm_latest_flag" ]] ; then + + if [[ ${rvm_latest_flag:-0} -eq 0 ]] ; then + versions="${gem/*;/}" ; versions="${versions//,/ }" + for version in $versions ; do echo "$name -v$version" >> $rvm_file_name done ; unset version versions + else echo "$name" >> $rvm_file_name - fi ; unset name - done ; unset file_name + fi + done + + return 0 } gemset_import() { - if [[ ! -z "$rvm_ruby_gem_home" ]] ; then + + if [[ -n "${rvm_ruby_gem_home:-""}" ]] ; then export GEM_HOME="$rvm_ruby_gem_home" - export GEM_PATH="$rvm_ruby_gem_home/bin:$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator}global/bin" + export GEM_PATH="$rvm_ruby_gem_home/bin:$rvm_gems_path/$rvm_ruby_string${rvm_gemset_separator:-"@"}global/bin" export BUNDLE_PATH="$rvm_ruby_gem_home" fi rvm_file_name="${gems_args}" if [[ -s "${rvm_file_name%.gems*}.gems" ]] ; then rvm_file_name="${rvm_file_name%.gems*}.gems" + elif [[ -s "${rvm_gemset_name}.gems" ]] ; then rvm_file_name="${rvm_gemset_name}.gems" + elif [[ -s "default.gems" ]] ; then rvm_file_name="default.gems" + elif [[ -s "system.gems" ]] ; then rvm_file_name="system.gems" + elif [[ -s ".gems" ]] ; then rvm_file_name=".gems" + else - "$rvm_scripts_path/log" "error" "No *.gems file found." + "$rvm_path/scripts/log" "error" "No *.gems file found." return 1 fi mkdir -p "$rvm_gems_cache_path" # Ensure the base cache dir is initialized. if [[ -s "$rvm_file_name" ]] ; then + echo "Importing $rvm_file_name file..." - rvm_ruby_gem_list=$(builtin cd "$rvm_ruby_gem_home/specifications/" ; find * -type f -maxdepth 0 -print 2> /dev/null | sed -e 's#.gems.*$##' 2> /dev/null) + rvm_ruby_gem_list=$(builtin cd "$rvm_ruby_gem_home/specifications/" ; find . -maxdepth 1 -mindepth 1 -type f -print 2> /dev/null | sed -e 's#.gems.*$##' 2> /dev/null) + rvm_ruby_gem_list="${rvm_ruby_gem_list//.\/}" while read -r line do # Keep this on 2nd line :( + if [[ -n "${line// /}" ]] ; then gems_args="$line" ; gem_install fi + done < <(awk '/^[^#]+/{print}' "${rvm_file_name}") + else - "$rvm_scripts_path/log" "error" "${rvm_file_name} does not exist to import from." + "$rvm_path/scripts/log" "error" "${rvm_file_name} does not exist to import from." fi } __rvm_parse_gems_args() { gem="${gems_args/;*}" ; gem_prefix="" + if echo "$gems_args" | grep -q ';' ; then gem_prefix="${gems_args/*;}" fi - if "$rvm_scripts_path/match" "$gem" ".gem$" ; then + if "$rvm_path/scripts/match" "$gem" ".gem$" ; then gem_name="$(basename "${gem/.gem/}" | awk -F'-' '{$NF=NULL;print}')" gem_version="$(basename "${gem/.gem/}" | awk -F'-' '{print $NF}' )" gem_postfix="$(basename "${gem/*.gem/}")" + else gem_name="${gem/ */}" - if "$rvm_scripts_path/match" "$gem" "--version" ; then + + if "$rvm_path/scripts/match" "$gem" "--version" ; then gem_version="$(echo "$gem" | sed -e 's#.*--version[=]*[ ]*##' | awk '{print $1}')" gem_postfix="$(echo "$gem" | sed -e "s#${gem_name/ /}##" -e "s#--version[=]*[ ]*${gem_version/ /}##")" - elif "$rvm_scripts_path/match" "$gem" "-v" ; then + + elif "$rvm_path/scripts/match" "$gem" "-v" ; then gem_version="$(echo "$gem" | sed -e 's#.*-v[=]*[ ]*##' | awk '{print $1}')" gem_postfix="$(echo "$gem" | sed -e "s#${gem_name/ /}##" -e "s#-v[=]*[ ]*${gem_version/ /}##")" + else unset gem_version # no version fi fi if [[ -s "$gem" ]] ; then gem_file_name="$gem" - elif "$rvm_scripts_path/match" "$gem" ".gem$" ; then + + elif "$rvm_path/scripts/match" "$gem" ".gem$" ; then gem_file_name="$gem" + elif [[ -z "${gem_version/ /}" ]] ; then gem_file_name="${gem_name/ /}*.gem" + else # version gem_file_name="${gem_name/ /}-${gem_version/ /}.gem" fi } # Install a gem gem_install() { - # First we parse the gem args to pick apart the pieces. + local gem gem_prefix gem_name gem_version gem_file_name gem_postfix cache_file gem_file_name gem_string gem_action + result=0 + + # First we parse the gem args to pick apart the pieces. __rvm_parse_gems_args # Now we determine if a .gem cache file is already installed - if [[ -z "$rvm_force_flag" ]] && [[ -f "${rvm_ruby_gem_home}/specifications/$(basename "$gem_file_name")spec" ]] ; then - unset gem - "$rvm_scripts_path/log" "info" "$gem_name $gem_version exists, skipping (--force to re-install)" + if [[ ${rvm_force_flag:-0} -eq 0 && -f "${rvm_ruby_gem_home}/specifications/$(basename "$gem_file_name")spec" ]] ; then + gem="" + + "$rvm_path/scripts/log" "info" \ + "$gem_name $gem_version exists, skipping (--force to re-install)" + else if [[ -s "$gem" ]] ; then cache_file="$gem" elif [[ -s "$(__rvm_current_gemcache_dir)/${gem_file_name}" ]] ; then cache_file="$(__rvm_current_gemcache_dir)/${gem_file_name}" else - cache_file="${cache_file:-$(builtin cd "$(__rvm_current_gemcache_dir)/${gem_file_name}" ; find * -type f -maxdepth 0 -print 2> /dev/null | sort | head -n1)}" + cache_file="${cache_file:-$( find "$(__rvm_current_gemcache_dir)/${gem_file_name}" -maxdepth 1 -mindepth 1 -type f -print 2> /dev/null | sort | head -n1)}" + cache_file="${cache_file//.\/}" fi if [[ ! -s "$cache_file" ]] ; then if [[ -s "$gem_file_name" ]] ; then @@ -393,14 +534,14 @@ gem_file_name="$(basename "$cache_file")" gem_string="$(echo "$gem_file_name" | sed 's#\.gem$##')" - if [[ -z "$rvm_force_flag" ]] && [[ -s "${rvm_ruby_gem_home}/specifications/$(basename $gem_file_name)spec" ]] ; then + if [[ ${rvm_force_flag:-0} -eq 0 && -s "${rvm_ruby_gem_home}/specifications/$(basename $gem_file_name)spec" ]] ; then unset gem # already installed, not forcing reinstall. - "$rvm_scripts_path/log" "info" "$gem_name $gem_version exists, skipping (--force to re-install)" + "$rvm_path/scripts/log" "info" "$gem_name $gem_version exists, skipping (--force to re-install)" else if [[ -s "$(__rvm_current_gemcache_dir)/$(basename $gem_file_name)" ]] ; then mkdir -p "$rvm_tmp_path/$$/" @@ -414,171 +555,265 @@ fi fi fi # If $gem is still set, go forward with the install. - if [[ ! -z "$gem" ]] ; then + if [[ -n "$gem" ]] ; then + # TODO: Set vars if fourth field is non-empty (means that there are conditional statements to execute in the gem install line. if [[ "rvm_make_flags_flag" -eq 1 ]] ; then __rvm_make_flags ; fi - if [[ ! -z "$rvm_ruby_gem_home" ]] && [[ "$rvm_ruby_gem_home" != "$rvm_gems_path" ]] ; then - command="GEM_HOME='$rvm_ruby_gem_home' GEM_PATH='$rvm_ruby_gem_home/bin:$rvm_gems_path/${rvm_ruby_string}${rvm_gemset_separator}global/bin' BUNDLE_PATH='${rvm_ruby_gem_home}' ${gem_prefix} command gem install $gems_args $rvm_gem_options $gem_postfix $vars" + if [[ -n "$rvm_ruby_gem_home" && "$rvm_ruby_gem_home" != "$rvm_gems_path" ]] ; then + + command="GEM_HOME='$rvm_ruby_gem_home' GEM_PATH='$rvm_ruby_gem_home/bin:$rvm_gems_path/${rvm_ruby_string}${rvm_gemset_separator:-"@"}global/bin' BUNDLE_PATH='${rvm_ruby_gem_home}' ${gem_prefix} command gem install $gems_args $rvm_gem_options $gem_postfix $vars" + else + #--ignore-dependencies command="$gem_prefix command gem install --ignore-dependencies $gems_args $rvm_gem_options -q $gem $gem_postfix $vars" + fi + __rvm_run "gem.install" "$command" "installing ${gem_name} ${gem_version}..." result=$? + if [[ $result -eq 0 ]] ; then - "$rvm_scripts_path/log" "info" "$gem_name $gem_version installed ( output logged to: $rvm_path/log/$rvm_ruby_string/gem.install.log )" + + "$rvm_path/scripts/log" "info" \ + "$gem_name $gem_version installed ( output logged to: $rvm_path/log/$rvm_ruby_string/gem.install.log )" + else - "$rvm_scripts_path/log" "error" "$gem_name $gem_version failed to install ( output logged to: $rvm_path/log/$rvm_ruby_string/gem.install.error.log )" + + "$rvm_path/scripts/log" "error" \ + "$gem_name $gem_version failed to install ( output logged to: $rvm_path/log/$rvm_ruby_string/gem.install.error.log )" + fi - fi ; unset gem gem_prefix gem_name gem_version gem_file_name gem_postfix cache_file gem_file_name gem_string gem_action + fi return $result } # Output the user's current gem directory. gemset_info() { - if [[ "$rvm_user_flag" -eq 1 ]] ; then + if [[ ${rvm_user_flag:-0} -eq 1 ]] ; then echo $(rvm system ; gem env | grep "\- $HOME" | awk '{print $NF}') - elif [[ "$rvm_system_flag" -eq 1 ]] ; then + + elif [[ ${rvm_system_flag:-0} -eq 1 ]] ; then echo $(rvm system ; gem env $action system) - elif [[ ! -z "$rvm_ruby_string" ]] ; then + + elif [[ -n "${rvm_ruby_string:-""}" ]] ; then echo $(rvm "$rvm_ruby_string" ; gem env $action) - elif [[ ! -z "$GEM_HOME" ]] ; then + + elif [[ -n "${GEM_HOME:-""}" ]] ; then echo "$GEM_HOME" + else gem env $action fi + return $? } gemset_prune() { + local 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_scripts_path/log" "info" "Moving active gems into temporary cache..." - while read -r used_gem; do + + "$rvm_path/scripts/log" "info" \ + "Moving active gems into temporary cache..." + + while read -r used_gem + do gem_name="$(echo "$used_gem" | sed -e 's/ .*//')" + versions="$(echo "${used_gem//, / }" | sed -e 's/.* (//' -e 's/)//')" + for version in $versions; do + cached_gem_name="${gem_name}-${version}.gem" + cached_file_path="${live_cache_path}/${cached_gem_name}" + if [[ -f "$cached_file_path" ]]; then mv "$cached_file_path" "${temporary_cache_path}/${cached_gem_name}" fi done done < <(gem list --versions) - "$rvm_scripts_path/log" "info" "Removing live cache and restoring temporary cache..." + + "$rvm_path/scripts/log" "info" \ + "Removing live cache and restoring temporary cache..." + # Switch the cache back. rm -rf "$live_cache_path" + mv "$temporary_cache_path" "$live_cache_path" + return 0 } gemset_pristine() { if command -v gem > /dev/null ; then + gem pristine --all + return $? + else - "$rvm_scripts_path/log" "error" "'gem' command not found in PATH" + + "$rvm_path/scripts/log" "error" \ + "'gem' command not found in PATH" + return 1 fi } # Loads the default gemsets for the current interpreter and gemset. gemset_initial() { - "$rvm_scripts_path/log" "info" "Importing initial gemsets for $(__rvm_environment_identifier)." - mkdir -p "$rvm_gemsets_path/${rvm_ruby_string//-//}" 2>/dev/null + "$rvm_path/scripts/log" "info" "Importing initial gemsets for $(__rvm_environment_identifier)." - for gemsets_path in $(__rvm_ruby_string_paths_under "$rvm_gemsets_path") ; do + mkdir -p "$rvm_path/gemsets/${rvm_ruby_string//-//}" 2>/dev/null + + for gemsets_path in $(__rvm_ruby_string_paths_under "$rvm_path/gemsets") ; do + # TODO: This can be condensed. if [[ -d "$gemsets_path" ]] ; then if [[ -n "$rvm_gemset_name" && -s "${gemsets_path}/${rvm_gemset_name}.gems" ]] ; then - ( rvm --create use "$rvm_ruby_string" ; "$rvm_scripts_path/gemsets" import "${gemsets_path}/${rvm_gemset_name}.gems" ) + ( + rvm --create "$rvm_ruby_string" + "$rvm_path/scripts/gemsets" import "${gemsets_path}/${rvm_gemset_name}.gems" + ) fi if [[ -s "${gemsets_path}/default.gems" ]] ; then - ( rvm --create use "$rvm_ruby_string" ; "$rvm_scripts_path/gemsets" import "$gemsets_path/default.gems" ) + ( + rvm --create "$rvm_ruby_string" + "$rvm_path/scripts/gemsets" import "$gemsets_path/default.gems" + ) fi if [[ -s "${gemsets_path}/global.gems" ]] ; then - ( rvm --create use "$rvm_ruby_string@global" ; "$rvm_scripts_path/gemsets" import "${gemsets_path}/global.gems" ) + ( + rvm --create "$rvm_ruby_string@global" + "$rvm_path/scripts/gemsets" import "${gemsets_path}/global.gems" + ) fi fi done - "$rvm_scripts_path/log" "info" "Installation of gems for $(__rvm_environment_identifier) is complete." + "$rvm_path/scripts/log" "info" \ + "Installation of gems for $(__rvm_environment_identifier) is complete." return 0 } unset GEM_PATH if ! command -v gem > /dev/null ; then - "$rvm_scripts_path/log" "error" "'gem' was not found, cannot perform gem actions (Do you have an RVM ruby selected?)" + "$rvm_path/scripts/log" "error" \ + "'gem' was not found, cannot perform gem actions (Do you have an RVM ruby selected?)" exit 1 fi args=($*) action="${args[0]}" -gems_args="$(echo ${args[@]:1}) " # Strip trailing / leading / extra spacing. +args=($(echo ${args[@]:1})) +gems_args="$(echo ${args[@]}) " # Strip trailing / leading / extra spacing. export rvm_gemset_name="${args[1]:-""}" # For wherever used. rvm_sticky_flag=1 -if [[ "import" = "$action" ]] || [[ "load" = "$action" ]] ; then - if [[ -z "$rvm_ruby_strings" ]]; then - gemset_import - else - original_env="$(__rvm_environment_identifier)" - for rvm_ruby_string in $(echo "$rvm_ruby_strings" | tr "," " "); do - __rvm_become - gemset_import - done - __rvm_become "$original_env" - unset original_env +if [[ -z "$rvm_ruby_string" ]] ; then + if echo "${GEM_HOME:-""}" | grep -q 'rvm' ; then + rvm_ruby_string="${GEM_HOME##*/}" + rvm_ruby_string="${rvm_ruby_string%%@*}" fi -elif [[ "export" = "$action" ]] || [[ "dump" = "$action" ]] ; then - gemset_export -elif [[ "create" = "$action" ]] ; then - gemset_create -elif [[ "copy" = "$action" ]] ; then - gemset_copy -elif [[ "empty" = "$action" ]] ; then - gemset_empty -elif [[ "delete" = "$action" ]] ; then - gemset_delete -elif [[ "name" = "$action" ]] || [[ "string" = "$action" ]]; then - gemset_name -elif [[ "dir" = "$action" ]] ; then - gemset_dir -elif [[ "list" = "$action" ]] ; then - gemset_list -elif [[ "gemdir" = "$action" ]] || [[ "gempath" = "$action" ]] || [[ "gemhome" = "$action" ]] || [[ "home" = "$action" ]] || [[ "path" = "$action" ]] || [[ "version" = "$action" ]] ; then - gemset_info -elif [[ "install" = "$action" ]] ; then - gem_install "$@" -elif [[ "pristine" = "$action" ]] ; then - gemset_pristine "$@" -elif [[ "initial" = "$action" ]] ; then - gemset_initial -elif [[ "prune" = "$action" ]] ; then - gemset_prune -elif [[ "update" = "$action" ]]; then - gemset_update -elif [[ "globalcache" = "$action" ]]; then - gemset_globalcache "$2" -elif [[ "clear" = "$action" ]] ; then - "$rvm_scripts_path/log" "info" "gemset cleared." - exit 0 -elif [[ "help" = "$action" ]] ; then - usage ; exit 0 -else - usage ; exit 1 fi + +case "$action" in + + import|load) + + if [[ -z "${rvm_ruby_strings:-""}" ]]; then + + gemset_import + + else + original_env="$(__rvm_environment_identifier)" + + for rvm_ruby_string in $(echo "$rvm_ruby_strings" | tr "," " "); do + + __rvm_become + + gemset_import + done + + __rvm_become "$original_env" + + unset original_env + fi + ;; + export|dump) + gemset_export + ;; + create) + gemset_create + ;; + copy) + gemset_copy + ;; + empty) + gemset_empty + ;; + delete) + gemset_delete + ;; + name|string) + gemset_name + ;; + dir) + gemset_dir + ;; + list) + gemset_list + ;; + gemdir|gempath|gemhome|home|path|version) + gemset_info + ;; + install) + gem_install "$@" + ;; + pristine) + gemset_pristine "$@" + ;; + initial) + gemset_initial + ;; + prune) + gemset_prune + ;; + update) + gemset_update + ;; + globalcache) + gemset_globalcache "$2" + ;; + clear) + "$rvm_path/scripts/log" "info" "gemset cleared." + exit 0 + ;; + help) + usage + exit 0 + ;; + *) + usage + exit 1 + ;; +esac exit $?