#!/bin/bash __rvm_gems() { unset GEM_PATH if [ -z "$rvm_ruby_selected_flag" ] ; then __rvm_select $* ; fi if [ ! -z "$rvm_use_flag" ] ; then __rvm_gems_use elif [ ! -z "$rvm_load_flag" ] ; then __rvm_gems_load elif [ ! -z "$rvm_dump_flag" ] ; then __rvm_gems_dump elif [ ! -z "$rvm_delete_flag" ] ; then __rvm_gems_delete elif [ ! -z "$rvm_name_flag" ] ; then __rvm_gems_name elif [ ! -z "$rvm_dir_flag" ] ; then __rvm_gems_dir elif [ ! -z "$rvm_list_flag" ] ; then __rvm_gems_list elif [ ! -z "$rvm_clear_flag" ] ; then __rvm_gems_clear fi } __rvm_gems_select() { if [ -z "$rvm_gem_set_name" ] ; then if [ ! -z "$GEM_HOME" ] ; then rvm_gem_set_name=$(echo $GEM_HOME | xargs basename | awk -F'%' '{print $2}') fi if [ ! -z "$rvm_ruby_gem_home" ] ; then rvm_gem_set_name=$(echo $rvm_ruby_gem_home | xargs basename | awk -F'%' '{print $2}') fi if [ ! -z "$rvm_gem_set_name" ] && [[ ! "$rvm_gem_set_name" =~ ^\d\.\d ]] ; then rvm_ruby_gem_home="$rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version%$rvm_gem_set_name" else if [ ! -z "$rvm_ruby_interpreter" -a ! -z "$rvm_ruby_version" -a "$rvm_ruby_interpreter" != "system" ] ; then rvm_ruby_gem_home="$rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version" elif [ -z "$GEM_HOME" ] ; then rvm_ruby_gem_home=$(gem env gemdir) elif [ ! -z "$GEM_HOME" ] ; then rvm_ruby_gem_home="$GEM_HOME" else __rvm_log "error" "Cannot select gem home, something definitely wrong :/" fi fi if [ -z "$rvm_gem_set_name" ] ; then unset rvm_gem_set_name ; fi else rvm_ruby_gem_home="$rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version%$rvm_gem_set_name" fi } __rvm_gems_use() { mkdir -p "$rvm_ruby_gem_home" ; GEM_HOME="$rvm_ruby_gem_home" ; export GEM_HOME } __rvm_gems_name() { echo "$rvm_gem_set_name" } __rvm_gems_dir() { echo "$rvm_ruby_gem_home" } __rvm_gems_list() { for gemdir in "$rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version%"* ; do echo "$gemdir" | awk -F'%' '{print $2}' done } __rvm_gems_clear() { __rvm_gems_use if [ -d "$rvm_ruby_gem_home" -a "$rvm_ruby_gem_home" != '/' ] ; then rm -rf "$rvm_ruby_gem_home" fi } __rvm_gems_dump() { if [ ! -z "$rvm_ruby_gem_home" ] ; then GEM_HOME="$rvm_ruby_gem_home" ; export GEM_HOME ; GEM_PATH="$rvm_ruby_gem_home" ; export GEM_PATH ; fi if [ -z "$rvm_file_name" ] ; then if [ ! -z "$rvm_gem_set_name" ] ; then rvm_file_name="$rvm_gem_set_name.gems" else rvm_file_name="default.gems" fi fi touch $rvm_file_name echo "# $rvm_file_name generated gem dump 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 name="$(echo $gem | awk -F';' '{print $1}')" if [ -z "$rvm_latest_flag" ] ; then versions="$(echo $gem | awk -F';' '{print $2}' | sed 's/,/ /g')" 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 } __rvm_gems_load() { if [ ! -z "$rvm_ruby_gem_home" ] ; then GEM_HOME="$rvm_ruby_gem_home" ; export GEM_HOME ; GEM_PATH="$rvm_ruby_gem_home" ; export GEM_PATH ; fi if [ -z "$rvm_file_name" ] ; then if [ -f "$rvm_gem_set_name.gems" ] ; then rvm_file_name="$rvm_gem_set_name.gems" elif [ -f "default.gems" ] ; then rvm_file_name="default.gems" elif [ -f "system.gems" ] ; then rvm_file_name="system.gems" fi fi if [ -f "$rvm_file_name" ] ; then echo "Loading $rvm_file_name file..." rvm_ruby_gem_list=$(/bin/ls $rvm_ruby_gem_home/specifications/ 2> /dev/null | sed 's/\.gemspec$//' 2> /dev/null) while read line do # Keep this on 2nd line :( bash fail. # TODO: Switch to a different field separator than ; to allow for evals gem="$(echo $line | awk -F';' '{print $1}')" gem_prefix="$(echo $line | awk -F';' '{print $2}')" gem_name="$(echo $gem | awk '{print $1}')" gem_version="$(echo $gem | sed 's/^.*-v[=]*[ ]*//' | awk '{print $1}')" gem_postfix="$(echo $gem | sed "s/$gem_name//" | sed "s/-v[=]*[ ]*$gem_version//")" if [ -f "$gem" ] ; then gem_file_name="${gem}" elif [[ "$gem" =~ ".gem$" ]] ; then gem_file_name="${gem}" elif [ -z "$gem_version" ] ; then # no version gem_file_name="${gem_name}*.gem" else # version gem_file_name="$gem_name-$gem_version.gem" fi cache_file=$(/bin/ls -t "$rvm_gem_path/*/*/cache/${gem_file_name}*" 2> /dev/null | head -n1) if [ -z "$cache_file" ] ; then if [ -f "$gem_file_name" ] ; then gem="$gem_file_name" elif [ -z "$gem_version" ] ; then gem="$gem_name" else gem="$gem_name -v $gem_version" fi else # cached gem_file_name="$(basename $cache_file)" gem_string="$(echo "$gem_file_name" | sed 's/\.gem$//')" if [ ! -z "$(echo "$rvm_ruby_gem_list" | awk "/$gem_string/{print}")" ] ; then #if [[ $rvm_ruby_gem_list =~ $gem_string ]] ; then if [ ! -z "$rvm_force_flag" ] ; then cp $cache_file $rvm_temp_path/$gem_file_name gem="$rvm_temp_path/$gem_file_name" # install as a named local gem else unset gem __rvm_log "info" "$gem_name $gem_version is already installed, skipping. (use --force to force these to install regardless)" fi else gem="$cache_file" fi fi if [ ! -z "$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 [ -z "$vars" ] ; then GEM_HOME="$rvm_ruby_gem_home" GEM_PATH="$rvm_ruby_gem_home" $gem_prefix $rvm_ruby_home/bin/gem install --no-rdoc --no-ri -q $gem $gem_postfix else eval "GEM_HOME='$rvm_ruby_gem_home' GEM_PATH='$rvm_ruby_gem_home' $gem_prefix $rvm_ruby_home/bin/gem install --no-rdoc --no-ri -q $gem $gem_postfix" fi fi unset gem gem_prefix gem_name gem_version gem_file_name gem_postfix cache_file gem_file_name gem_string done < <(awk '/^[\.\/a-zA-Z]/{print}' "$rvm_file_name") else __rvm_log "error" "$rvm_file_name does not exist to load from." fi } __rvm_gems_delete () { if [ ! -z "$rvm_gem_set_name" ] ; then gemdir="$rvm_gem_path/$rvm_ruby_interpreter/$rvm_ruby_version%$rvm_gem_set_name" if [ -d "$gemdir" -a ! -z "$rvm_force_flag" ] ; then rm -rf "$gemdir" elif [ -d "$gemdir" ] ; then __rvm_log "warn" "Are you SURE you wish to remove the installed gems '$rvm_gem_set_name ' ($gemdir)?" echo -n "(anything other than 'yes' will cancel) > " read response if [ "yes" = "$response" ] ; then rm -rf "$gemdir" else __rvm_log "info" "Not doing anything, phew... close call that one eh?" fi else __rvm_log "info" "$gemdir already does not exist." fi ; unset gemdir else __rvm_log "error" "A gems name must be specified in order to delete a gems." fi }