Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
executable file 316 lines (277 sloc) 11.5 KB
#!/usr/bin/env bash
source $rvm_scripts_path/utility
source $rvm_scripts_path/selector
color_green=$($rvm_scripts_path/color "green")
color_red=$($rvm_scripts_path/color "red")
color_yellow=$($rvm_scripts_path/color "yellow")
color_none=$($rvm_scripts_path/color "none")
if [[ ! -z "$rvm_trace_flag" ]] ; then set -x ; export rvm_trace_flag ; fi
rvm_ruby_gem_home="${rvm_ruby_gem_home:-$GEM_HOME}"
if [[ -d "$rvm_ruby_gem_home" ]] && which gem &> /dev/null ; then rvm_ruby_gem_home="$(gem env home)" ; fi
trap "if [[ -d $rvm_tmp_path/ ]] && [[ -s $rvm_tmp_path/$$ ]] ; then rm -f $rvm_tmp_path/$$ > /dev/null 2>&1 ; fi ; exit" 0 1 2 3 15
__rvm_gems_name() {
echo "$(gem env gemdir)" | awk -F'%' '{print $2}'
}
__rvm_gems_dir() {
echo "$rvm_ruby_gem_home"
}
__rvm_gems_list() {
if [[ -z "$rvm_ruby_selected_flag" ]] ; then __rvm_select ; fi
$rvm_scripts_path/log "info" "gems(ets) : for $rvm_ruby_string (found in $rvm_gems_path/)"
if [[ ! -z "$rvm_gems_path" ]] ; then
if [[ ! -z $rvm_ruby_string ]] ; then
for gemdir in $rvm_gems_path/${rvm_ruby_string}%* ; do
echo "$gemdir" | awk -F'%' '{print $2}'
done
else
$rvm_scripts_path/log "error" "\$rvm_ruby_string is not set!"
fi
else
$rvm_scripts_path/log "error" "\$rvm_gems_path is not set!"
fi
}
__rvm_gems_delete() {
if [[ -z "$rvm_ruby_selected_flag" ]] ; then __rvm_select ; fi
if [[ ! -z "$rvm_gem_set_name" ]] ; then
gemdir="$rvm_gems_path/$rvm_ruby_string%$rvm_gem_set_name"
if [[ -d "$gemdir" ]] && [[ "$gemdir" != '/' ]] && [[ ! -z "$rvm_force_flag" ]] ; 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_gem_set_name' ($gemdir)?"
echo -n "(anything other than 'yes' will cancel) > "
read response
if [[ "yes" = "$response" ]] ; then
rm -f $gemdir/cache && rm -rf $gemdir
else
$rvm_scripts_path/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
else
$rvm_scripts_path/log "error" "A gems name must be specified in order to delete a gems."
fi
}
__rvm_gems_nuke() {
if [[ -z "$rvm_ruby_selected_flag" ]] ; then __rvm_select ; fi
if [[ ! -z "$rvm_gem_set_name" ]] ; then
gemdir="$rvm_gems_path/$rvm_ruby_string%$rvm_gem_set_name"
if [[ -d "$gemdir" ]] && [[ "$gemdir" != '/' ]] && [[ ! -z "$rvm_force_flag" ]] ; then
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 gems for gemset '%$rvm_gem_set_name' ($gemdir)?"
echo -n "(anything other than 'yes' will cancel) > "
read response
if [[ "yes" = "$response" ]] ; then
cd $gemdir && rm -rf ./bin/* ./doc/* ./gems/* ./specifications/*
else
$rvm_scripts_path/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
else
$rvm_scripts_path/log "error" "A gems name must be specified in order to delete a gems."
fi
}
__rvm_gems_dump() {
rvm_file_name="${rvm_file_name:-$gems_args}"
if [[ ! -z "$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%global/bin"
export BUNDLE_PATH="$rvm_ruby_gem_home"
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
$rvm_scripts_path/log "info" "Dumping current environments gems to $rvm_file_name"
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
export GEM_HOME="$rvm_ruby_gem_home"
export GEM_PATH="$rvm_ruby_gem_home/bin:$rvm_gems_path/$rvm_ruby_string%global/bin"
export BUNDLE_PATH="$rvm_ruby_gem_home"
fi
if [[ ! -z "$(echo "$gems_args" | awk '/\.gem.*$/')" ]] ; then
rvm_gem_set_name="$(echo "$gems_args" | sed 's#\.gem.*##g' | sed 's# ##g')"
else
rvm_gem_set_name="$(echo "$gems_args" | sed 's# ##g')"
fi
if [[ -s "$rvm_gem_set_name.gems" ]] ; then
rvm_file_name="$rvm_gem_set_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."
return 1
fi
mkdir -p "$rvm_gems_path/cache" # Ensure the base cache dir is initialized.
if [[ -s "$rvm_file_name" ]] ; then
echo "Loading $rvm_file_name file..."
rvm_ruby_gem_list=$(\ls $rvm_ruby_gem_home/specifications/ 2> /dev/null | sed 's#.gems.*$##' 2> /dev/null)
while read -r line
do # Keep this on 2nd line :(
if [[ ! -z "$(echo $line | sed 's/\s//g')" ]] ; then
gems_args="$line" ; __rvm_gem_install
fi
done < <(awk '/^[^#]+/{print}' "${rvm_file_name}")
else
$rvm_scripts_path/log "error" "${rvm_file_name} does not exist to load from."
fi
}
__rvm_parse_gem_args() {
gem="$(echo $gems_args | awk -F';' '{print $1}')"
gem_prefix="$(echo $gems_args | awk -F';' '{print $2}')"
if $rvm_scripts_path/match "$gem" "\.gem$" ; then
gem_name="$(basename $gem | sed 's#\.gem##' | awk -F'-' '{$NF=NULL;print}')"
gem_version="$(basename $gem | sed 's#\.gem##' | awk -F'-' '{print $NF}' )"
gem_postfix="$(basename $gem | sed "s#.*\.gem##")"
else
gem_name="$(echo $gem | awk '{print $1}')"
if $rvm_scripts_path/match "$gem" "--version" ; then
gem_version="$(echo $gem | sed 's#.*--version[=]*[ ]*##' | awk '{print $1}')"
gem_postfix="$(echo $gem | sed "s#${gem_name/ /}##" | sed "s#--version[=]*[ ]*${gem_version/ /}##")"
elif $rvm_scripts_path/match "$gem" "-v" ; then
gem_version="$(echo $gem | sed 's#.*-v[=]*[ ]*##' | awk '{print $1}')"
gem_postfix="$(echo $gem | sed "s#${gem_name/ /}##" | sed "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
gem_file_name="$gem"
elif [[ -z "${gem_version/ /}" ]] ; then # no v/Users/wayne/projects/db0/rvm/scripts/gems
gem_file_name="${gem_name/ /}*.gem"
else # version
gem_file_name="${gem_name/ /}-${gem_version/ /}.gem"
fi
}
# Install a gem
__rvm_gem_install() {
# First we parse the gem args to pick apart the pieces.
__rvm_parse_gem_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" "$color_green$gem_name $gem_version$yellow exists, skipping (--force to re-install)"
else
if [[ -s "$gem" ]] ; then
cache_file="$gem"
elif [[ -s "$rvm_gems_path/cache/${gem_file_name}" ]] ; then
cache_file="$rvm_gems_path/cache/${gem_file_name}"
else
cache_file="${cache_file:-$(\ls ${rvm_gems_path}/cache/${gem_file_name} 2> /dev/null | sort | head -n1)}"
fi
if [[ ! -s "$cache_file" ]] ; then
if [[ -s "$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 "$rvm_force_flag" ]] && [[ -s "${rvm_ruby_gem_home}/specifications/$(basename $gem_file_name)spec" ]] ; then
unset gem # already installed, not forcing reinstall.
$rvm_scripts_path/log "info" "$color_green$gem_name $gem_version$yellow exists, skipping (--force to re-install)"
else
if [[ -s "$rvm_gems_path/cache/$(basename $gem_file_name)" ]] ; then
mkdir -p "$rvm_tmp_path/$$/"
mv "$rvm_gems_path/cache/$gem_file_name" "$rvm_tmp_path/$$/$gem_file_name"
gem="$rvm_tmp_path/$$/$gem_file_name -f -l"
else
gem="$cache_file"
fi
fi
fi
fi
# If $gem is still set, go forward with the install.
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 [[ "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%global/bin' BUNDLE_PATH='$rvm_ruby_gem_home' $gem_prefix gem install $gems_args $rvm_gem_options $gem_postfix $vars"
else
command="$gem_prefix gem install $gems_args $rvm_gem_options -q $gem $gem_postfix $vars"
fi
__rvm_run "gem.install" "$command" "$gem_name $gem_version is not installed, installing..."
result=$?
if [[ $result -eq 0 ]] ; then
$rvm_scripts_path/log "info" "$gem_name $gem_version installed."
else
$rvm_scripts_path/log "error" "$gem_name $gem_version failed to install, output has been logged to:\n$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
return $result
}
# Output the user's current gem directory.
__rvm_gems_gemdir() {
if [[ "$rvm_user_flag" -eq 1 ]] ; then
echo $(rvm system ; gem env | grep "\- $HOME" | awk '{print $NF}')
elif [[ "$rvm_system_flag" -eq 1 ]] ; then
echo $(rvm system ; gem env gemdir system)
elif [[ ! -z "$rvm_ruby_string" ]] ; then
echo $(rvm "$rvm_ruby_string" ; gem env gemdir)
elif [[ ! -z "$GEM_HOME" ]] ; then
echo "$GEM_HOME"
else
gem env gemdir
fi
}
unset GEM_PATH
if [[ -z "$(which gem 2>/dev/null)" ]] ; then
$rvm_scripts_path/log "error" "'gem' was not found, cannot perform gem actions."
return 1
fi
action="$(echo $* | awk '{print $1}')"
gems_args="$(echo $* | awk '{$1="" ; print}' | sed 's/^\s*//')"
if [[ "load" = "$action" ]] ; then
__rvm_gems_load
elif [[ "dump" = "$action" ]] ; then
__rvm_gems_dump
elif [[ "nuke" = "$action" ]] ; then
__rvm_gems_nuke
elif [[ "delete" = "$action" ]] ; then
__rvm_gems_delete
elif [[ "name" = "$action" ]] ; then
__rvm_gems_name
elif [[ "dir" = "$action" ]] ; then
__rvm_gems_dir
elif [[ "list" = "$action" ]] ; then
__rvm_gems_list
elif [[ "gemdir" = "$action" ]] ; then
__rvm_gems_gemdir
elif [[ "install" = "$action" ]] ; then
__rvm_gem_install $*
elif [[ "clear" = "$action" ]] ; then
$rvm_scripts_path/log "info" "gems(et) cleared."
exit 0
else
$rvm_scripts_path/log "error" "gems must be passed an action as the first parameter {load,dump,delete,name,list,gemdir,install}"
fi
exit $?
Jump to Line
Something went wrong with that request. Please try again.