#!/usr/bin/env bash __rvm_log_command_caclulate_log_timestamp() { export rvm_log_timestamp="$(__rvm_date "+%s")" rvm_debug "Log prefix: ${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/" } __rvm_log_command_caclulate_log_filesystem() { export rvm_log_filesystem="$( __rvm_mount 2>/dev/null | __rvm_awk -v rvm_path=$rvm_path ' BEGIN{longest=""; fstype=""} {if (index(rvm_path,$3)==1 && length($3)>length(longest)){longest=$3; fstype=$5}} END{print fstype} ' )" rvm_debug "Log filesystem: ${rvm_log_filesystem}" } __rvm_log_command_caclulate_log_namelen() { case "${rvm_log_filesystem}" in (ecryptfs) export rvm_log_namelen=138 ;; (*) export rvm_log_namelen=250 ;; esac rvm_debug "Log max name length: ${rvm_log_namelen}" } __rvm_log_command_caclulate_log_file_name() { [[ -n "${rvm_log_timestamp:-}" ]] || __rvm_log_command_caclulate_log_timestamp [[ -n "${rvm_log_filesystem:-}" ]] || __rvm_log_command_caclulate_log_filesystem [[ -n "${rvm_log_namelen:-}" ]] || __rvm_log_command_caclulate_log_namelen name="${name//[ \/]/_}" _log="${rvm_log_path}/${rvm_log_timestamp}${rvm_ruby_string:+_}${rvm_ruby_string:-}/${name}" if [[ -n "${ZSH_VERSION:-}" ]] then _log="${_log[0,${rvm_log_namelen}]}.log" else _log="${_log:0:${rvm_log_namelen}}.log" fi } # Run a specified command and log it (once). __rvm_log_command() { \typeset name message _command_start _command_name \typeset -a _command name="${1:-}" message="${2:-}" shift 2 _command=( "$@" ) # store full command so we can manipulate it _command_start="$1" # store first part so we can detect variables while (( $# )) && [[ "$1" == *"="* ]] # skip variables from beginning do shift done _command_name="$1" # store the real command so we can detect functions [[ "${_command_start}" != *"="* ]] || _command=( "env" "${_command[@]}" ) if __function_on_stack __rvm_log_command_internal then __rvm_log_command_simple "$@" || return $? else __rvm_log_command_internal "$@" || return $? fi } # basic debugging information for the command __rvm_log_command_debug() { printf "%b" "[$(__rvm_date +'%Y-%m-%d %H:%M:%S')] ${_command_name}\n" if is_a_function "${_command_name}" then \typeset -f "${_command_name}" fi printf "%b" "current path: $PWD\n" env | __rvm_grep -E '^GEM_HOME=|^GEM_PATH=|^PATH=' printf "%b" "command(${#_command[@]}): ${_command[*]}\n" } # Run a specified command and do not log it again. __rvm_log_command_simple() { __rvm_log_command_debug rvm_log "$message" "$@" || return $? } # Run a specified command and log it. __rvm_log_command_internal() { \typeset _log (( ${rvm_niceness:-0} == 0 )) || _command=( nice -n $rvm_niceness "${_command[@]}" ) __rvm_log_command_caclulate_log_file_name rvm_debug "Log file: ${_log}" [[ -d "${_log%\/*}" ]] || \command \mkdir -p "${_log%\/*}" [[ -f "${_log}" ]] || \command \rm -f "${_log}" __rvm_log_command_debug | tee "${_log}" | rvm_debug_stream __rvm_log_dotted "${_log}" "$message" "${_command[@]}" || { \typeset result=$? \typeset __show_lines="${rvm_show_log_lines_on_error:-0}" rvm_error "Error running '${_command[*]}'," case "${__show_lines}" in (0) rvm_error "please read ${_log}" ;; (all) rvm_error "content of log ${_log}" cat "${_log}" >&6 ;; (*) rvm_error "showing last ${__show_lines} lines of ${_log}" tail -n "${__show_lines}" "${_log}" >&6 ;; esac return ${result} } } __rvm_debug_command() { rvm_debug "Running($#): $*" "$@" || return $? } __rvm_pager_or_cat_v() { eval "${PAGER:-\command \cat} '$1'" } __rvm_ask_for() { \typeset response rvm_warn "$1" printf "%b" "(anything other than '$2' will cancel) > " # need and IF to properly handle CTRL+C ... wtf? if read response && [[ "$2" == "$response" ]] then return 0 else return 1 fi } __rvm_dotted() { set +x \typeset flush if (( $# )) then printf "%b" "${rvm_notify_clr:-}$*${rvm_reset_clr:-}" fi if __rvm_awk '{fflush;}' <</dev/null then flush=fflush else flush=flush fi # the nasty '${flush}' inside is for compatibility, # old awk does not allow running function from variable awk -v go_back="$( tput cub1 2>/dev/null || true)" \ ' BEGIN{ spin[0]="|"go_back; spin[1]="/"go_back; spin[2]="-"go_back; spin[3]="\\"go_back } { if ((NR-1)%(10)==9) printf "."; else if (go_back!="") printf spin[(NR-1)%4]; '${flush}' } END{ print "." } ' } __rvm_log_dotted() { \typeset __log_file __message __iterator __result __local_rvm_trace_flag __log_file="$1" __message="$2" shift 2 __result=0 __local_rvm_trace_flag=${rvm_trace_flag:-0} if (( ${rvm_trace_flag:-0} )) then { set -x "$@" 2>&1 | tee -a "${__log_file}" __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$? (( __local_rvm_trace_flag > 0 )) || set +x } 1>&2 elif [[ -n "${ZSH_VERSION:-}" ]] then rvm_log "${__message} - please wait" { set -x "$@" > "${__log_file}" 2>&1 || __result=$? (( __local_rvm_trace_flag > 0 )) || set +x } 2>/dev/null else { set -x "$@" 2>&1 | tee -a "${__log_file}" | __rvm_dotted "${__message}" __rvm_check_pipestatus ${PIPESTATUS[@]} ${pipestatus[@]} || __result=$? (( __local_rvm_trace_flag > 0 )) || set +x } 2>/dev/null fi return $__result } __rvm_check_pipestatus() { for __iterator do case "${__iterator}" in ("") true ;; (0) true ;; (*) return ${__iterator} ;; esac done return 0 } __rvm_wait_anykey() { if [[ -n "${1:-}" ]] then echo "$1" fi \typeset _read_char_flag if [[ -n "${ZSH_VERSION:-}" ]] then _read_char_flag=k else _read_char_flag=n fi builtin read -${_read_char_flag} 1 -s -r anykey } __rvm_table_br() { \typeset width=${COLUMNS:-78} width=$(( width > 116 ? 116 : width )) printf "%-${width}s\n" " " | __rvm_sed 's/ /*/g' } __rvm_fold() { if fold -s -w 10 <</dev/null then fold -s -w $1 else fold -w $1 fi } __rvm_table_wrap_text() { \typeset width=${COLUMNS:-78} width=$(( width > 116 ? 116 : width )) width=$(( width - 4 )) # "* *" __rvm_fold $width | __rvm_awk -v width=$width '{printf "* %-"width"s *\n", $0}' } # echo text | __rvm_table [header] __rvm_table() { if [[ -n "${1:-}" ]] then __rvm_table_br echo "$1" | __rvm_table_wrap_text fi __rvm_table_br \command \cat "${2:--}" | __rvm_table_wrap_text __rvm_table_br }