diff options
| author | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2023-03-23 01:13:40 -0700 | 
|---|---|---|
| committer | David Vazgenovich Shakaryan <dvshakaryan@gmail.com> | 2023-03-23 01:13:40 -0700 | 
| commit | 173c5071af7c84de38f11915846ac5a0957ce41a (patch) | |
| tree | 33ff6a0d6da81231598c5e44c5d527bb972baa27 | |
| parent | 7d30dbc6a8b0a267a0769cf94bfa6cd643a886f5 (diff) | |
| download | rbpm-master.tar.gz rbpm-master.tar.xz | |
| -rwxr-xr-x | rbpm.sh | 189 | 
1 files changed, 94 insertions, 95 deletions
| @@ -16,168 +16,167 @@  # Placing the above function inside ~/.bashrc (or equivalent) will load  # it upon starting your shell. -RBPM_VERSION='0.2' +RBPM_VERSION='0.3'  : ${RUBIES_PATH:="${HOME}/.rubies"}  _echo() { -    echo "echo '${@//\'/\'\\\'\'}'" + 	echo "echo '${@//\'/\'\\\'\'}'"  }  _export() { -    echo "export PATH='${PATH//\'/\'\\\'\'}'" -    echo 'hash -r' + 	echo "export PATH='${PATH//\'/\'\\\'\'}'" + 	echo 'hash -r'  }  _warn() { -    echo "echo 'rbpm: ${@//\'/\'\\\'\'}' 1>&2" + 	echo "echo 'rbpm: ${@//\'/\'\\\'\'}' 1>&2"  }  _die() { -    [[ -n "${@}" ]] && _warn "${@}" + 	[[ -n "${@}" ]] && _warn "${@}" -    echo 'false' -    exit 1 + 	echo 'false' + 	exit 1  }  _populate_dirs() { -    [[ -d "${RUBIES_PATH}" ]] \ -        || _die "directory ${RUBIES_PATH} does not exist." + 	[[ -d "${RUBIES_PATH}" ]] \ + 	 	|| _die "directory ${RUBIES_PATH} does not exist" -    mapfile -td $'\0' dirs < <(shopt -s nullglob; -        printf '%s\0' "${RUBIES_PATH}"/* | sort -zV) + 	mapfile -td $'\0' dirs < <(shopt -s nullglob; + 	 	printf '%s\0' "${RUBIES_PATH}"/* | sort -zV) -    [[ -n "${dirs}" ]] || _die "directory ${RUBIES_PATH} is empty." + 	[[ -n "${dirs}" ]] || _die "directory ${RUBIES_PATH} is empty"  }  _populate_selected() { -    local dir dirs + 	local dir dirs -    mapfile -td ':' dirs < <(printf %s "${PATH}") + 	mapfile -td : dirs < <(printf %s "${PATH}") -    for dir in "${dirs[@]}"; do -        if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then -            dir="${dir%/bin}" -            selected+=("${dir##*/}") -        fi -    done + 	for dir in "${dirs[@]}"; do + 	 	if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then + 	 	 	dir="${dir%/bin}" + 	 	 	selected+=("${dir##*/}") + 	 	fi + 	done -    [[ "${#selected[@]}" -ne 0 ]] || return 1 -    [[ "${#selected[@]}" -eq 1 ]] \ -        || _warn 'warning: multiple rubies found in PATH.' + 	[[ "${#selected[@]}" -ne 0 ]] || return 1 + 	[[ "${#selected[@]}" -eq 1 ]] \ + 	 	|| _warn 'warning: multiple managed paths found in PATH'  }  _clear() { -    local dir dirs cdirs + 	local dir dirs cdirs -    mapfile -td ':' dirs < <(printf %s "${PATH}") + 	mapfile -td : dirs < <(printf %s "${PATH}") -    for dir in "${dirs[@]}"; do -        if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then -            _echo "Removing ${dir} from PATH." -        else -            cdirs+=("${dir}") -        fi -    done + 	for dir in "${dirs[@]}"; do + 	 	if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then + 	 	 	_echo "removing ${dir} from PATH" + 	 	else + 	 	 	cdirs+=("${dir}") + 	 	fi + 	done -    [[ "${#cdirs[@]}" -ne "${#dirs[@]}" ]] || return 1 + 	[[ "${#cdirs[@]}" -ne "${#dirs[@]}" ]] || return 1 -    PATH="$(IFS=':'; echo "${cdirs[*]}")" + 	PATH="$(IFS=':'; echo "${cdirs[*]}")"  }  _add() { -    _echo "Adding ${1}/bin to PATH." + 	_echo "adding ${1}/bin to PATH" -    PATH="${1}/bin:${PATH}" + 	PATH="${1}/bin:${PATH}"  }  rbpm_ls() { -    local dir dirs selected str + 	local dir dirs selected str -    _populate_dirs -    _populate_selected + 	_populate_dirs + 	_populate_selected -    for dir in "${dirs[@]}"; do -        str="  ${dir##*/}" + 	for dir in "${dirs[@]}"; do + 	 	str="  ${dir##*/}" -        [[ "${dir##*/}" == "${selected}" ]] && str="${str/ /*}" + 	 	[[ "${dir##*/}" == "${selected}" ]] && str="${str/ /*}" -        _echo "${str}" -    done + 	 	_echo "${str}" + 	done  }  rbpm_get() { -    local dir selected + 	local dir selected -    _populate_selected || _die 'no rubies found in PATH.' + 	_populate_selected || _die 'no managed path found in PATH' -    for dir in "${selected[@]}"; do -        _echo "${dir}" -    done + 	for dir in "${selected[@]}"; do + 	 	_echo "${dir}" + 	done  }  rbpm_set() { -    [[ -n "${1}" ]] || _die 'set command requires an argument.' + 	[[ -n "${1}" ]] || _die 'set command requires an argument' -    local dir dirs match match_start + 	local dir dirs match match_start -    _populate_dirs + 	_populate_dirs -    for dir in "${dirs[@]}"; do -        if [[ "${dir##*/}" == *"${1}"* ]]; then -            match="${dir}" + 	for dir in "${dirs[@]}"; do + 	 	[[ "${dir##*/}" == *"${1}"* ]] || continue -            # Match from start of version is preferred. We assume the version -            # is at the beginning of the directory name or following a hyphen. -            # This avoids surprising behaviour like `2.1' matching `2.2.1' over -            # `2.1.0'. -            if [[ "${dir##*/}" == "${1}"* || "${dir##*/}" == *-"${1}"* ]]; then -                match_start="${dir}" -            fi -        fi -    done + 	 	match="${dir}" -    [[ -n "${match}" ]] || _die 'no matching ruby found.' -    [[ -n "${match_start}" ]] && match="${match_start}" +		# match from start of version is preferred. we assume the +		# version is at the beginning of the directory name or +		# immediately following a hyphen. this avoids unintuitive +		# behaviour like `2.1' matching `2.2.1' over `2.1.0'. + 	 	if [[ "${dir##*/}" == "${1}"* || +			"${dir##*/}" == *-"${1}"* ]]; then + 	 	 	match_start="${dir}" + 	 	fi + 	done -    _clear -    _add "${match}" -    _export + 	[[ -n "${match}" ]] || _die 'no matching ruby found' + 	[[ -n "${match_start}" ]] && match="${match_start}" + + 	_clear + 	_add "${match}" + 	_export  }  rbpm_clear() { -    _clear || _die 'no rubies found in PATH.' -    _export + 	_clear || _die 'no managed path found in PATH' + 	_export  }  rbpm_version() { -    _echo "rbpm ${RBPM_VERSION}" + 	_echo "rbpm ${RBPM_VERSION}"  }  rbpm_help() { -    _echo 'Usage: rbpm <command> [args]' -    _echo -    _echo 'Commands:' -    _echo '  ls       List all available rubies.' -    _echo '  get      Display currently selected ruby.' -    _echo '  set      Select specified ruby.' -    _echo '  clear    Unselect any selected rubies.' -    _echo '  version  Display rbpm version.' + 	_echo 'Usage: rbpm <command> [args]' + 	_echo + 	_echo 'Commands:' + 	_echo '  ls       List all available rubies' + 	_echo '  get      Display currently selected ruby' + 	_echo '  set      Select specified ruby' + 	_echo '  clear    Unselect any selected rubies' + 	_echo '  version  Display rbpm version'  }  case "${1}" in -    'ls') -        rbpm_ls ;; -    'get') -        rbpm_get ;; -    'set') -        rbpm_set "${2}" ;; -    'clear') -        rbpm_clear ;; -    'version') -        rbpm_version ;; -    *) -        rbpm_help ;; + 	'ls') + 	 	rbpm_ls ;; + 	'get') + 	 	rbpm_get ;; + 	'set') + 	 	rbpm_set "${2}" ;; + 	'clear') + 	 	rbpm_clear ;; + 	'version') + 	 	rbpm_version ;; + 	*) + 	 	rbpm_help ;;  esac - -# vim: set sw=4 sts=4 ts=4 et : | 
