#!/usr/bin/env bash # Checks the rvmrc for the given directory. Note that if # argument is passed, it will be used instead of pwd. __rvm_project_rvmrc() { export __rvm_project_rvmrc_lock : __rvm_project_rvmrc_lock:${__rvm_project_rvmrc_lock:=0} : __rvm_project_rvmrc_lock:$((__rvm_project_rvmrc_lock+=1)) if (( __rvm_project_rvmrc_lock > 1 )) then return 0 # no nesting fi \typeset working_dir found_file rvm_trustworthiness_result save_PATH # Get the first argument or the pwd. working_dir="${1:-"$PWD"}" save_PATH="${PATH}" while : do if [[ -z "$working_dir" || "$HOME" == "$working_dir" || "${rvm_prefix:-}" == "$working_dir" || "$working_dir" == "." ]] then if (( ${rvm_project_rvmrc_default:-0} >= 1 )) then rvm_previous_environment=default fi if [[ -n "${rvm_previous_environment:-""}" ]] && (( ${rvm_project_rvmrc_default:-0} < 2 )) then __rvm_load_environment "$rvm_previous_environment" fi __rvm_file_env_check_unload unset rvm_current_rvmrc rvm_previous_environment break else if __rvm_project_dir_check "$working_dir" found_file then rvm_trustworthiness_result=0 if [[ "${found_file}" != "${rvm_current_rvmrc:-""}" ]] then __rvm_conditionally_do_with_env __rvm_load_project_config "${found_file}" || { rvm_trustworthiness_result=$? PATH="${save_PATH}" # restore PATH if project file load failed unset RVM_PROJECT_PATH } fi unset __rvm_project_rvmrc_lock return "$rvm_trustworthiness_result" else working_dir="${working_dir%/*}" fi fi done unset __rvm_project_rvmrc_lock return 1 } __rvm_load_project_config() { rvm_debug "__rvm_load_project_config $1" \typeset __gemfile _bundle_install \typeset -a __file_env_variables __file_env_variables=() __gemfile="" rvm_previous_environment="$(__rvm_env_string)" : rvm_autoinstall_bundler_flag:${rvm_autoinstall_bundler_flag:=0} case "$1" in (*/.rvmrc) __rvmrc_warning_display_for_rvmrc "$1" if __rvm_check_rvmrc_trustworthiness "$1" then __rvm_remove_rvm_from_path ; __rvm_conditionally_add_bin_path rvm_current_rvmrc="$1" __rvm_ensure_is_a_function unset GEM_HOME GEM_PATH rvm_ruby_string="${rvm_previous_environment/system/default}" rvm_action=use source "$1" || return $? else return $? fi ;; (*/.versions.conf) __rvm_ensure_is_a_function rvm_current_rvmrc="$1" rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby=/ {s/ruby=//;p;}' | tail -n 1 )" [[ -n "${rvm_ruby_string}" ]] || return 2 rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-gemset=/ {s/ruby-gemset=//;p;}' | tail -n 1 )" rvm_create_flag=1 __rvm_use || return 3 __rvm_file_load_env_and_trust "$1" "env-" _bundle_install="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^ruby-bundle-install=/ {s/ruby-bundle-install=//;p;}' )" if [[ -n "${_bundle_install}" ]] then if [[ -f "${_bundle_install}" ]] then __gemfile="${_bundle_install}" else __gemfile="${1%/*}/Gemfile" fi fi ;; (*/Gemfile) __rvm_ensure_is_a_function rvm_current_rvmrc="$1" rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby=/ {s/#ruby=//;p;}' | tail -n 1 )" [[ -n "${rvm_ruby_string}" ]] || { rvm_ruby_string="$( \command \tr -d '\r' <"$1" | __rvm_sed -n "s/[[:space:]]+rescue[[:space:]]+nil$//; /^\s*ruby[[:space:](]/ {s/^\s*ruby//; s/[[:space:]()'\"]//g; p;}" | \tail -n 1 )" [[ -n "${rvm_ruby_string}" ]] || return 2 rvm_ruby_string="${rvm_ruby_string%%\#*}" rvm_ruby_string="${rvm_ruby_string/,:engine=>/-}" rvm_ruby_string="${rvm_ruby_string/,engine:/-}" rvm_ruby_string="${rvm_ruby_string/,:engine_version=>[^,]*/}" rvm_ruby_string="${rvm_ruby_string/,engine_version:[^,]*/}" rvm_ruby_string="${rvm_ruby_string/,:patchlevel=>/-p}" rvm_ruby_string="${rvm_ruby_string/,patchlevel:/-p}" } #' rvm_gemset_name="$( \command \tr -d '\r' <"$1" | __rvm_sed -n '/^#ruby-gemset=/ {s/#ruby-gemset=//;p;}' | tail -n 1 )" if [[ -z "${rvm_gemset_name:-}" && -f "${1%/*}/.ruby-gemset" ]] then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )" fi __rvmrc_warning_display_for_Gemfile "$1" rvm_create_flag=1 __rvm_use || return 3 __rvm_file_load_env_and_trust "$1" "#ruby-env-" __gemfile="$1" ;; (*/.ruby-version|*/.rbfu-version|*/.rbenv-version) __rvm_ensure_is_a_function rvm_current_rvmrc="$1" rvm_ruby_string="$( \command \tr -d '\r' <"$1" )" if [[ -z "${rvm_ruby_string}" ]] then return 2 fi if [[ -f "${1%/*}/.ruby-gemset" ]] then rvm_gemset_name="$( \command \tr -d '\r' <"${1%/*}/.ruby-gemset" )" else rvm_gemset_name="" fi rvm_create_flag=1 __rvm_use || return 3 __rvm_file_load_env_and_trust "${1%/*}/.ruby-env" __rvm_file_load_env_and_trust "${1%/*}/.rbenv-vars" __gemfile="${1%/*}/Gemfile" ;; (*) rvm_error "Unsupported file format for '$1'" return 1 ;; esac __rvm_file_set_env if [[ "${rvm_autoinstall_bundler_flag:-0}" == 1 && -n "${__gemfile:-}" && -f "${__gemfile:-}" ]] then __rvm_which bundle >/dev/null 2>&1 || gem install --remote bundler bundle install --gemfile="${__gemfile}" | __rvm_grep -vE '^Using|Your bundle is complete' fi } # Detect if project file is in given PATH, # # Usage: # __rvm_project_dir_check [variable_name_to_set [default_value]] # # @param file_or_dir_to_check file or directory to check if it's valid project file # @param variable_name_to_set when project file is found - set this variable to it's location # @param default_value when no project file found - set variable to this value # @return 0 - found, >0 - not found # @env RVM_PROJECT_PATH unsets when not found, sets to project root when found __rvm_project_dir_check() { \typeset _found_file path_to_check variable variable_default \typeset -a _valid_files path_to_check="$1" variable="${2:-}" variable_default="${3:-}" _valid_files=( "$path_to_check" "$path_to_check/.rvmrc" "$path_to_check/.versions.conf" "$path_to_check/.ruby-version" "$path_to_check/.rbfu-version" "$path_to_check/.rbenv-version" "$path_to_check/Gemfile" ) __rvm_find_first_file _found_file "${_valid_files[@]}" || true if [[ ! -s "$_found_file" || "${_found_file}" == "$HOME/.rvmrc" ]] then _found_file="" elif [[ "${_found_file##*/}" == "Gemfile" ]] && ! __rvm_grep "^#ruby=" "$_found_file" >/dev/null && ! __rvm_grep -E "^\s*ruby" "$_found_file" >/dev/null then _found_file="" fi if [[ -n "$variable" ]] then eval "$variable=\"\${_found_file:-$variable_default}\"" fi if [[ -n "${_found_file:-$variable_default}" ]] then RVM_PROJECT_PATH="${_found_file:-$variable_default}" RVM_PROJECT_PATH="${RVM_PROJECT_PATH%/*}" else \typeset __result=$? unset RVM_PROJECT_PATH return $__result fi }