123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #!/usr/bin/env bash
- source "$rvm_scripts_path/base"
- source "$rvm_scripts_path/functions/tools"
- usage()
- {
- echo "Usage: rvm tools {identifier,path-identifier,strings,user}" 1>&2
- return 1
- }
- # Return the identifier that's current in use.
- tools_identifier()
- {
- __rvm_env_string
- }
- tools_path_identifier()
- {
- if [[ -z "$1" || ! -d "$1" ]]; then
- echo "Usage: rvm tools path-identifier 'path-to-check'"
- return 1
- fi
- __rvm_cd "$1"
- __rvm_do_with_env_before
- rvm_promptless=1 __rvm_project_rvmrc >/dev/null 2>&1
- rvmrc_result="$?"
- __rvm_env_string
- __rvm_do_with_env_after
- return $rvmrc_result
- }
- tools_user_usage()
- {
- \typeset msg
- for msg in "$@"
- do
- rvm_error "$msg"
- done
- rvm_error "Usage: rvm user [[gemsets] [rubies] [hooks] [pkgs] [wrappers] [all] [--skel]|none]"
- }
- tools_user_setup_path()
- {
- tools_user_setup "$1" "rvm_$2_path" "\${HOME}/.rvm/$2"
- }
- tools_user_setup()
- ( # subprocess cause we change the HOME
- \typeset _target _var_name _user_value
- _target="$1"
- _var_name="$2"
- _user_value="$3"
- # detect _var_name in config
- if [[ -f "${_target}/.rvmrc" ]] && __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" > /dev/null
- then
- # if defined read path
- _user_value="$( __rvm_grep "^export ${_var_name}=" "${_target}/.rvmrc" | __rvm_sed "s/^export ${_var_name}=//" )"
- else
- # if not defined - define it
- echo "export ${_var_name}=\"${_user_value}\"" >> "${_target}/.rvmrc"
- fi
- # set home to _target, so --skel works fine
- HOME="${_target}"
- # resolve the stored path
- eval "_user_value=\"${_user_value}\""
- # ensure the defined path exists
- [[ -d "${_user_value}" ]] || mkdir -p "${_user_value}"
- # create empty db files for rvm_user_value
- if [[ "$_var_name" == "rvm_user_path" ]]
- then
- \typeset _file
- for _file in db md5 rvmrcs sha512
- do
- [[ -f "${_user_value}/${_file}" ]] || touch "${_user_value}/${_file}"
- done
- fi
- )
- tools_user_none()
- {
- __rvm_sed_i "$1" -E -e "/^(export )?rvm_[a-z_]+_path=/ d" -e "/^(export )?rvm_create_flag=/ d"
- }
- tools_user()
- {
- \typeset item dir target
- \typeset -a selection
- selection=()
- for item in $@
- do
- case "$item" in
- all) selection+=( gemsets rubies hooks pkgs wrappers userdb log ) ;;
- gemsets) selection+=( gemsets userdb log ) ;;
- --skel) rvm_skel_flag=1 ;;
- rubies|hooks|pkgs|userdb|log|wrappers) selection+=( "$item" ) ;;
- (none)
- tools_user_none "${HOME}/.rvmrc"
- return $?
- ;;
- *)
- tools_user_usage "Unrecognized option '$item'."
- return 1
- ;;
- esac
- done
- if (( ${#selection[@]} == 0 ))
- then
- tools_user_usage
- return 1
- fi
- if [[ ${rvm_skel_flag:-0} == 1 ]] && (( UID ))
- then
- tools_user_usage "The --skel flag should be run as root: rvmsudo rvm user $@."
- return 1
- fi
- [[ ${rvm_skel_flag:-0} == 1 ]] && target=/etc/skel || target="${HOME}"
- if [[ ! -w "${target}" ]] || [[ -d "${target}/.rvm" && ! -w "${target}/.rvm" ]]
- then
- tools_user_usage "Directory '${target}' or '${target}/.rvm' is not writable for current user."
- return 1
- fi
- if [[ -f "${target}/.rvmrc" && ! -w "${target}/.rvmrc" ]]
- then
- tools_user_usage "Configuration file '${target}/.rvmrc' is not writable for current user."
- return 1
- fi
- for item in "${selection[@]}"
- do
- case "$item" in
- rubies)
- for dir in archives bin environments gems gems_cache log repos rubies rubygems src tmp wrappers user
- do
- tools_user_setup_path "${target}" $dir
- done
- tools_user_setup "${target}" rvm_create_flag 1
- ;;
- gemsets)
- for dir in environments gems gems_cache wrappers
- do
- tools_user_setup_path "${target}" $dir
- done
- tools_user_setup "${target}" rvm_create_flag 1
- ;;
- wrappers|hooks|pkgs|log)
- tools_user_setup_path "${target}" "$item"
- ;;
- userdb)
- tools_user_setup_path "${target}" user
- ;;
- esac
- done
- }
- tools_mirror()
- {
- \typeset file="$rvm_user_path/db"
- if
- [[ -f "$file" ]] &&
- __rvm_grep "^ruby_url=" "$file" >/dev/null
- then
- if
- (( ${rvm_force_flag:-0} == 1 ))
- then
- __rvm_sed_i "${file}" -e "s/^ruby_${n}_url=.*$/ruby_${n}_url=https:\/\/www.mirrorservice.org\/sites\/ftp.ruby-lang.org\/pub\/ruby\/${n}/"
- else
- rvm_warn "Some settings already exist, use 'rvm --force tools mirror' to overwrite."
- fi
- else
- printf "ruby_url=https://www.mirrorservice.org/sites/ftp.ruby-lang.org/pub/ruby\n" >> "$file"
- fi
- }
- tools_rvm_env()
- {
- \typeset script
- rvm_log "# use shebang: #!/usr/bin/$1-rvm-env 1.9.3"
- for script in $@
- do
- if builtin command -v ${script} >/dev/null
- then
- __rvm_sudo ln -nfs $rvm_bin_path/rvm-shell /usr/bin/${script}-rvm-env &&
- rvm_log "Created link '/usr/bin/${script}-rvm-env'." ||
- rvm_error "Cannot create link '/usr/bin/${script}-rvm-env'."
- else
- rvm_error "There is no command/script '${script}' in system."
- fi
- done
- }
- args=($*)
- action="${args[0]}"
- args="$(echo ${args[@]:1})" # Strip trailing / leading / extra spacing.
- [[ -z "$action" ]] && usage
- case "$action" in
- identifier) tools_identifier ;;
- path-identifier) tools_path_identifier "$args" ;;
- strings) tools_strings "$args" ;;
- mirror) tools_mirror ;;
- user) __rvm_call_with_restored_umask tools_user "$args" ;;
- rvm-env) tools_rvm_env $args ;;
- *) usage ;;
- esac
|