scripts/gemsets in rvm-1.0.2 vs scripts/gemsets in rvm-1.0.3

- old
+ new

@@ -1,24 +1,34 @@ #!/usr/bin/env bash source "$rvm_scripts_path/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 usage() { - printf "Usage: 'rvm gemset action'\n" - printf " where action is one of: {import,export,create,copy,empty,delete,name,dir,list,gemdir,install,pristine,clear,use,update,globalcache}\n" - printf "\n" - printf " Tools for working with and manipulating gemsets within rvm.\n" - exit 1 + printf " + Usage: + + rvm gemset [action] + + Action: + + {import,export,create,copy,empty,delete,name,dir,list,gemdir,install,pristine,clear,use,update,globalcache} + + Description: + + Commands for working with and manipulating gemsets within RVM. + +" } gemset_update() { if [[ -z "$rvm_ruby_strings" ]]; then "$rvm_scripts_path/log" "info" "Running gem update for all rubies and gemsets." - rvm_ruby_strings="$(\ls "$rvm_gems_path" | \grep -v '^\(doc\|cache\|@\|system\)' | \tr '\n' ',')" + rvm_ruby_strings="$(ls "$rvm_gems_path" | grep -v '^\(doc\|cache\|@\|system\)' | \tr '\n' ',')" else "$rvm_scripts_path/log" "info" "Running gem update for the specified rubies." fi export rvm_ruby_strings "$rvm_scripts_path/set" "gem" "update" @@ -37,119 +47,146 @@ fi "$rvm_scripts_path/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 $(\ls "$rvm_gems_path"); do + for directory_name in $(ls "$rvm_gems_path"); 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." - \rm -f "$current_cache_path" 2>/dev/null - \mkdir -p "$current_cache_path" 2>/dev/null + 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" elif [[ "$1" == "enable" ]]; then "$rvm_scripts_path/log" "info" "Enabling global cache for gems." - \mkdir -p "$rvm_gems_cache_path" - for directory_name in $(\ls "$rvm_gems_path"); do + mkdir -p "$rvm_gems_cache_path" + for directory_name in $(ls "$rvm_gems_path"); 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." mv "$current_cache_path/"*.gem "$rvm_gems_cache_path/" 2>/dev/null - \rm -rf "$current_cache_path" + 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" else - printf "Usage: 'rvm gemset globalcache {enable,disable}\n" - printf " Enable / Disable the use of a global gem cachedir.\n" + printf " + Usage: + + rvm gemset globalcache {enable,disable} + + Enable / Disable the use of a global gem cachedir. + +" return 1 fi } gemset_name() { gemset_dir | awk -F${rvm_gemset_separator} '{print $2}' + return $? } gemset_dir() { echo "$rvm_ruby_gem_home" + return $? } gemset_create() { + local gem_home="" + rvm_ruby_gem_prefix=$(echo $rvm_ruby_gem_home | sed 's/'${rvm_gemset_separator}'.*$//') + for gemset in $(echo $gems_args) ; do if [[ "$gemset" == *"${rvm_gemset_separator}"* ]]; then "$rvm_scripts_path/log" "error" "Can't do that, it contains a \"${rvm_gemset_separator}\"." continue fi + gem_home="${rvm_ruby_gem_prefix}${rvm_gemset_separator}${gemset}" - \mkdir -p "$gem_home" + + mkdir -p "$gem_home" + # 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" + rm -rf "$gem_home/cache" fi ln -nfs "$rvm_gems_cache_path" "$gem_home/cache" fi + "$rvm_scripts_path/log" "info" "Gemset '$gemset' created." - done ; unset gem_home + done + return 0 } gemset_list() { - if [[ -z "$rvm_ruby_selected_flag" ]] ; then __rvm_select ; fi + rvm_ruby_selected_flag=${rvm_ruby_selected_flag:-0} + rvm_gems_path="${rvm_gems_path:-""}" + rvm_ruby_string="${rvm_ruby_string:-""}" - "$rvm_scripts_path/log" "info" "gemsets : for $rvm_ruby_string (found in $rvm_gems_path/)" + if [[ $rvm_ruby_selected_flag -eq 0 ]] ; then __rvm_select ; fi - if [[ ! -z "$rvm_gems_path" ]] ; then - if [[ ! -z "$rvm_ruby_string" ]] ; then - \ls "${rvm_gems_path}/" | awk -F"${rvm_gemset_separator}" "/${rvm_ruby_string}${rvm_gemset_separator}/{print \$2}" 2>/dev/null + "$rvm_scripts_path/log" "info" "gemsets for $rvm_ruby_string (found in $rvm_gems_path/$rvm_ruby_string)\n" + + 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!" + return 1 fi else "$rvm_scripts_path/log" "error" "\$rvm_gems_path is not set!" + return 1 fi + printf "\n" + return 0 } gemset_delete() { - if [[ -z "$rvm_ruby_selected_flag" ]] ; then __rvm_select ; fi - if [[ ! -z "$rvm_gemset_name" ]] ; then + rvm_ruby_selected_flag=${rvm_ruby_selected_flag:-0} + + if [[ $rvm_ruby_selected_flag -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" + 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) > " read response if [[ "yes" = "$response" ]] ; then - \rm -f $gemdir/cache 2>/dev/null - \rm -rf $gemdir + rm -f $gemdir/cache 2>/dev/null + 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 + fi else "$rvm_scripts_path/log" "error" "A gemset name must be specified in order to delete a gems." fi } gemset_empty() { if [[ -z "$rvm_ruby_gem_home" ]] ; then __rvm_select ; fi gemdir="$rvm_ruby_gem_home" if [[ -d "$gemdir" ]] && [[ "$gemdir" != '/' ]] && [[ ! -z "$rvm_force_flag" ]] ; then - builtin cd "$gemdir" && \rm -rf ./bin/* ./doc/* ./gems/* ./specifications/* + 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)?" echo -n "(anything other than 'yes' will cancel) > " read response if [[ "yes" = "$response" ]] ; then - builtin cd "$gemdir" && \rm -rf ./bin/* ./doc/* ./gems/* ./specifications/* + builtin 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." @@ -178,15 +215,15 @@ "$rvm_scripts_path/log" "error" "Unable to expand ruby '$destination_ruby'" return 1 fi if [[ -d "$source_path" ]] ; then - [[ ! -d "$destination_path" ]] && \mkdir -p "$destination_path" + [[ ! -d "$destination_path" ]] && mkdir -p "$destination_path" "$rvm_scripts_path/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/" + mkdir -p "$destination_path/$dir" + cp -Rf "$source_path/$dir" "$destination_path/" done "$rvm_scripts_path/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)" @@ -211,13 +248,13 @@ fi fi "$rvm_scripts_path/log" "info" "Exporting current environments gemset to $rvm_file_name" - \touch "$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 + for gem in $(gem list | sed 's#[\(|\)]##g' | sed 's#, #,#g' | tr ' ' ';') ; do name="${gem/;*/}" if [[ -z "$rvm_latest_flag" ]] ; then versions="${gem/*;/}" ; versions="${versions//,/ }" for version in $versions ; do echo "$name -v$version" >> $rvm_file_name @@ -227,22 +264,22 @@ fi ; unset name done ; unset file_name } gemset_import() { - 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${rvm_gemset_separator}global/bin" export BUNDLE_PATH="$rvm_ruby_gem_home" fi - rvm_gemset_name="${gems_args//.gem*/}" - rvm_gemset_name="${gems_args// /}" + rvm_file_name="${gems_args}" - if [[ -s "$rvm_gemset_name.gems" ]] ; then - rvm_file_name="$rvm_gemset_name.gems" + 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 @@ -250,15 +287,15 @@ else "$rvm_scripts_path/log" "error" "No *.gems file found." return 1 fi - \mkdir -p "$rvm_gems_cache_path" # Ensure the base cache dir is initialized. + 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=$(\ls "$rvm_ruby_gem_home/specifications/" 2> /dev/null | sed 's#.gems.*$##' 2> /dev/null) + 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 [[ -n "${line// /}" ]] ; then gems_args="$line" ; gem_install @@ -268,12 +305,16 @@ "$rvm_scripts_path/log" "error" "${rvm_file_name} does not exist to import from." fi } __rvm_parse_gems_args() { - gem="${gems_args/;*}" - gem_prefix="${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 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 @@ -314,31 +355,31 @@ 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:-$(\ls "$(__rvm_current_gemcache_dir)/${gem_file_name}" 2> /dev/null | sort | head -n1)}" + cache_file="${cache_file:-$(ls "$(__rvm_current_gemcache_dir)/${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/ /}" + elif [[ -z "${gem_version// /}" ]] ; then + gem="${gem_name// /}" else - gem="${gem_name/ /} -v $gem_version" + 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" "$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/$$/" + mkdir -p "$rvm_tmp_path/$$/" mv "$(__rvm_current_gemcache_dir)/$gem_file_name" "$rvm_tmp_path/$$/$gem_file_name" gem="$rvm_tmp_path/$$/$gem_file_name -f -l" else gem="$cache_file" fi @@ -350,46 +391,47 @@ 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}${rvm_gemset_separator}global/bin' BUNDLE_PATH='${rvm_ruby_gem_home}' ${gem_prefix} gem install $gems_args $rvm_gem_options $gem_postfix $vars" + 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 gem install --ignore-dependencies $gems_args $rvm_gem_options -q $gem $gem_postfix $vars" + 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:\n$rvm_path/log/$rvm_ruby_string/gem.install.log" + "$rvm_scripts_path/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:\n$rvm_path/log/$rvm_ruby_string/gem.install.error.log" + "$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 )" 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. gemset_info() { if [[ "$rvm_user_flag" -eq 1 ]] ; then - echo $(rvm system ; gem env | \grep "\- $HOME" | awk '{print $NF}') + echo $(rvm system ; gem env | grep "\- $HOME" | awk '{print $NF}') elif [[ "$rvm_system_flag" -eq 1 ]] ; then echo $(rvm system ; gem env $action system) elif [[ ! -z "$rvm_ruby_string" ]] ; then echo $(rvm "$rvm_ruby_string" ; gem env $action) elif [[ ! -z "$GEM_HOME" ]] ; then echo "$GEM_HOME" else gem env $action fi + return $? } gemset_prune() { temporary_cache_path="$GEM_HOME/temporary-cache" live_cache_path="$GEM_HOME/cache" - \mkdir -p "$temporary_cache_path" + mkdir -p "$temporary_cache_path" "$rvm_scripts_path/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 @@ -400,56 +442,74 @@ fi done done < <(gem list --versions) "$rvm_scripts_path/log" "info" "Removing live cache and restoring temporary cache..." # Switch the cache back. - \rm -rf "$live_cache_path" + rm -rf "$live_cache_path" mv "$temporary_cache_path" "$live_cache_path" + return 0 } gemset_pristine() { - gem pristine --all + if command -v gem > /dev/null ; then + gem pristine --all + return $? + else + "$rvm_scripts_path/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/$(echo "$rvm_ruby_string" | \tr '-' '/')" 2>/dev/null + + mkdir -p "$rvm_gemsets_path/${rvm_ruby_string//-//}" 2>/dev/null + for gemsets_path in $(__rvm_ruby_string_paths_under "$rvm_gemsets_path") ; do - if [[ -n "$rvm_gemset_name" ]] ; then - if [[ -s "${gemsets_path}/${rvm_gemset_name}.gems" ]] ; then - (source "$rvm_scripts_path/rvm"; rvm gemset import "${gemsets_path}/${rvm_gemset_name}.gems") > /dev/null + # 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" ) fi - else - if [[ -d "$gemsets_path" ]] && [[ -s "${gemsets_path}/default.gems" ]] ; then - (source "$rvm_scripts_path/rvm"; rvm gemset import "$gemsets_path/default.gems") > /dev/null + + if [[ -s "${gemsets_path}/default.gems" ]] ; then + ( rvm --create use "$rvm_ruby_string" ; "$rvm_scripts_path/gemsets" import "$gemsets_path/default.gems" ) fi - if [[ -d "$gemsets_path" ]] && [[ -s "${gemsets_path}/global.gems" ]] ; then - (source "$rvm_scripts_path/rvm"; rvm use "$rvm_ruby_string@global" --create ; rvm gemset import "${gemsets_path}/global.gems") > /dev/null + + if [[ -s "${gemsets_path}/global.gems" ]] ; then + ( rvm --create use "$rvm_ruby_string@global" ; "$rvm_scripts_path/gemsets" import "${gemsets_path}/global.gems" ) fi fi done + "$rvm_scripts_path/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?)" exit 1 fi -action="$(echo "$*" | awk '{print $1}')" -gems_args="$(echo "$*" | awk '{$1="" ; print}' | __rvm_strip)" -export rvm_gemset_name +args=($*) +action="${args[0]}" +gems_args="$(echo ${args[@]:1}) " # 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 + for rvm_ruby_string in $(echo "$rvm_ruby_strings" | tr "," " "); do __rvm_become gemset_import done __rvm_become "$original_env" unset original_env @@ -485,10 +545,12 @@ 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 + usage ; exit 1 fi exit $?