diff options
| -rw-r--r-- | README | 61 | ||||
| -rwxr-xr-x | gbpm.sh (renamed from rbpm.sh) | 76 |
2 files changed, 74 insertions, 63 deletions
@@ -1,19 +1,19 @@ -rbpm (ruby path mangler) +gbpm (<generic binary> path mangler) -https://git.potato.am/rbpm.git/ -Manage multiple Ruby installations with no black magic. +https://git.potato.am/gbpm.git/ +Manage multiple Python/Ruby/etc. installations with no black magic. NOTES - rbpm only manages rubies located in the ~/.rubies directory. This - directory can be changed by setting the RUBIES_PATH environment - variable to some other location. rbpm does not display information - about rubies it does not manage, such as any system-wide install. + gbpm only manages installations located in GBPM_OPTS_PATH, shadowing + binaries already reachable from PATH. No information on external + installations is displayed. - rbpm performs a substring match when selecting a ruby. If there are - multiple matches, it gives precedence to matches at the start of the - version. If there are still multiple, the greatest of those is used. + A substring match is performed when selecting an installation, with + tiebreak rules to choose intuitively, the greatest being selected + amongst equally ranked matches. For example, `2.1' will match + `python-2.1.3' over `python-2.1.2' or `python-3.2.1'. DEPENDENCIES @@ -24,21 +24,32 @@ DEPENDENCIES INSTALLING - Save the script to a safe location, then add the following function to - your ~/.bashrc or equivalent file: + The output of this script is a series of commands to be executed, e.g. + via a shell function in `~/.bashrc': - rbpm() { source <(/path/to/rbpm.sh "${@}"); } + pypm() { + . <( + GBPM_OPTS_PATH="${HOME}/.pythons" \ + /path/to/gbpm.sh "${@}") + } + rbpm() { + . <( + GBPM_OPTS_PATH="${HOME}/.rubies" \ + /path/to/gbpm.sh "${@}") + } -INSTALLING RUBIES - The path to the executable should look something like this: +INSTALLING VERSIONS + + With `~/.rubies' as the managed directory, the path to a ruby binary + should look something like: ~/.rubies/ruby-2.1.2/bin/ruby To install Ruby to this directory: - $ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.bz2 + $ wget https://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.bz2 $ tar -xf ruby-2.1.2.tar.bz2 $ cd ruby-2.1.2 $ ./configure --prefix="${HOME}"/.rubies/ruby-2.1.2 @@ -48,7 +59,10 @@ INSTALLING RUBIES USAGE - A sequence of commands showing rbpm in use: + A series of commands showing gbpm in use, through an `rbpm' function: + + $ ruby -v + bash: ruby: command not found $ rbpm ls ruby-1.8.7-p374 @@ -56,7 +70,7 @@ USAGE ruby-2.1.2 $ rbpm set 2.1 - Adding /home/omp/.rubies/ruby-2.1.2/bin to PATH. + adding /home/david/.rubies/ruby-2.1.2/bin to PATH $ rbpm ls ruby-1.8.7-p374 @@ -67,19 +81,22 @@ USAGE ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux] $ rbpm set 1.9 - Removing /home/omp/.rubies/ruby-2.1.2/bin from PATH. - Adding /home/omp/.rubies/ruby-1.9.3-p547/bin to PATH. + removing /home/david/.rubies/ruby-2.1.2/bin from PATH + adding /home/david/.rubies/ruby-1.9.3-p547/bin to PATH $ ruby -v ruby 1.9.3p547 (2014-05-14 revision 45962) [x86_64-linux] $ rbpm clear - Removing /home/omp/.rubies/ruby-1.9.3-p547/bin from PATH. + removing /home/david/.rubies/ruby-1.9.3-p547/bin from PATH + + $ ruby -v + bash: ruby: command not found To set the version from a .ruby-version file: $ rbpm set $(cat .ruby-version) - Adding /home/omp/.rubies/ruby-1.8.7-p374/bin to PATH. + adding /home/david/.rubies/ruby-1.8.7-p374/bin to PATH AUTHORS @@ -3,22 +3,15 @@ # Copyright 2014 David Vazgenovich Shakaryan # Distributed under the terms of the MIT License. # -# rbpm (ruby path mangler) -# https://git.potato.am/rbpm.git/ -# Manage multiple Ruby installations with no black magic. +# gbpm +# https://git.potato.am/gbpm.git/ +# Manage multiple Python/Ruby/etc. installations with no black magic. # -# In order to prevent environment pollution, the output of this script -# is a list of commands which must be sourced. This can be achieved -# through a simple shell function: -# -# rbpm() { source <(/path/to/rbpm.sh "${@}"); } -# -# Placing the above function inside ~/.bashrc (or equivalent) will load -# it upon starting your shell. +# Output must be executed: gbpm() { . <(/path/to/gbpm.sh "${@}"); } -RBPM_VERSION='0.3' +GBPM_VERSION='0.4' -: ${RUBIES_PATH:="${HOME}/.rubies"} +: ${GBPM_OPTS_PATH:="${HOME}/.pythons"} _echo() { echo "echo '${@//\'/\'\\\'\'}'" @@ -30,7 +23,7 @@ _export() { } _warn() { - echo "echo 'rbpm: ${@//\'/\'\\\'\'}' 1>&2" + echo "echo 'gbpm: ${@//\'/\'\\\'\'}' >&2" } _die() { @@ -41,13 +34,13 @@ _die() { } _populate_dirs() { - [[ -d "${RUBIES_PATH}" ]] \ - || _die "directory ${RUBIES_PATH} does not exist" + [[ -d "${GBPM_OPTS_PATH}" ]] \ + || _die "directory ${GBPM_OPTS_PATH} does not exist" mapfile -td $'\0' dirs < <(shopt -s nullglob; - printf '%s\0' "${RUBIES_PATH}"/* | sort -zV) + printf '%s\0' "${GBPM_OPTS_PATH}"/* | sort -zV) - [[ -n "${dirs}" ]] || _die "directory ${RUBIES_PATH} is empty" + [[ -n "${dirs}" ]] || _die "directory ${GBPM_OPTS_PATH} is empty" } _populate_selected() { @@ -55,8 +48,9 @@ _populate_selected() { mapfile -td : dirs < <(printf %s "${PATH}") + selected=() for dir in "${dirs[@]}"; do - if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then + if [[ "${dir}" == "${GBPM_OPTS_PATH}/"* ]]; then dir="${dir%/bin}" selected+=("${dir##*/}") fi @@ -73,7 +67,7 @@ _clear() { mapfile -td : dirs < <(printf %s "${PATH}") for dir in "${dirs[@]}"; do - if [[ "${dir}" == "${RUBIES_PATH}/"* ]]; then + if [[ "${dir}" == "${GBPM_OPTS_PATH}/"* ]]; then _echo "removing ${dir} from PATH" else cdirs+=("${dir}") @@ -91,7 +85,7 @@ _add() { PATH="${1}/bin:${PATH}" } -rbpm_ls() { +cmd_ls() { local dir dirs selected str _populate_dirs @@ -106,7 +100,7 @@ rbpm_ls() { done } -rbpm_get() { +cmd_get() { local dir selected _populate_selected || _die 'no managed path found in PATH' @@ -116,7 +110,7 @@ rbpm_get() { done } -rbpm_set() { +cmd_set() { [[ -n "${1}" ]] || _die 'set command requires an argument' local dir dirs match match_start @@ -131,14 +125,14 @@ rbpm_set() { # 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'. + # behaviour like `2.1' matching `3.2.1' over `2.1.0'. if [[ "${dir##*/}" == "${1}"* || "${dir##*/}" == *-"${1}"* ]]; then match_start="${dir}" fi done - [[ -n "${match}" ]] || _die 'no matching ruby found' + [[ -n "${match}" ]] || _die 'no matching version found' [[ -n "${match_start}" ]] && match="${match_start}" _clear @@ -146,37 +140,37 @@ rbpm_set() { _export } -rbpm_clear() { +cmd_clear() { _clear || _die 'no managed path found in PATH' _export } -rbpm_version() { - _echo "rbpm ${RBPM_VERSION}" +cmd_version() { + _echo "gbpm ${GBPM_VERSION}" } -rbpm_help() { - _echo 'Usage: rbpm <command> [args]' +cmd_help() { + _echo 'Usage: gbpm <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 ' ls List all available versions' + _echo ' get Display currently selected version' + _echo ' set Select specified version' + _echo ' clear Unselect any selected versions' + _echo ' version Display gbpm version' } case "${1}" in 'ls') - rbpm_ls ;; + cmd_ls ;; 'get') - rbpm_get ;; + cmd_get ;; 'set') - rbpm_set "${2}" ;; + cmd_set "${2}" ;; 'clear') - rbpm_clear ;; + cmd_clear ;; 'version') - rbpm_version ;; + cmd_version ;; *) - rbpm_help ;; + cmd_help ;; esac |
