Skip to content

Plugins: bail early with descriptive messages #2062

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions plugins/available/autojump.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'Autojump configuration, see https://github.com/wting/autojump for more details'

# Only supports the Homebrew variant, Debian and Arch at the moment.
# Only supports the Homebrew variant, Debian, and Arch at the moment.
# Feel free to provide a PR to support other install locations
# shellcheck disable=SC1090
if _bash_it_homebrew_check && [[ -s "${BASH_IT_HOMEBREW_PREFIX}/etc/profile.d/autojump.sh" ]]; then
# shellcheck disable=SC1091
if _bash_it_homebrew_check && [[ -s "${BASH_IT_HOMEBREW_PREFIX?}/etc/profile.d/autojump.sh" ]]; then
source "${BASH_IT_HOMEBREW_PREFIX}/etc/profile.d/autojump.sh"
elif _command_exists dpkg && dpkg -s autojump &> /dev/null; then
source "$(dpkg-query -S autojump.sh | cut -d' ' -f2)"
Expand Down
4 changes: 2 additions & 2 deletions plugins/available/basher.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'initializes basher, the shell package manager'

# https://github.com/basherpm/basher
Expand All @@ -13,4 +12,5 @@ if ! _command_exists basher; then
fi
fi

eval "$(basher init - bash)"
# shellcheck disable=SC1090
source < <(basher init - bash)
8 changes: 7 additions & 1 deletion plugins/available/cht-sh.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ cite about-plugin
# shellcheck disable=SC2016
about-plugin 'Simplify `curl cht.sh/<query>` to `cht.sh <query>`'

# Play nicely if user already installed cht.sh cli tool
if _binary_exists cht.sh ; then
_log_warning "You have already installed 'cht.sh', so it's safe to disable this plugin."
return 1
fi

# Play nicely if user already installed cht.sh cli tool
if ! _command_exists cht.sh; then
function cht.sh() {
Expand All @@ -24,4 +30,4 @@ if ! _command_exists cht.sh; then
)
curl "cht.sh/${query}"
}
fi
fi
9 changes: 6 additions & 3 deletions plugins/available/direnv.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'load direnv, if you are using it: https://direnv.net/'

if _command_exists direnv; then
eval "$(direnv hook bash)"
if ! _binary_exists direnv; then
_log_warning "Could not find 'direnv'."
return 1
fi

# shellcheck disable=SC1090
source < <(direnv hook bash)
8 changes: 6 additions & 2 deletions plugins/available/fasd.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
cite about-plugin
about-plugin 'load fasd, if you are using it'

_command_exists fasd || return
if ! _binary_exists fasd; then
_log_warning "Unable to locage 'fasd'."
return 1
fi

eval "$(fasd --init auto)"
# shellcheck disable=SC1090
source < <(fasd --init auto)
15 changes: 9 additions & 6 deletions plugins/available/fzf.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,28 @@ if ! _bash-it-component-item-is-enabled plugin blesh; then
fi # only sources the keybindings and integration if blesh is not integrated already

# No need to continue if the command is not present
_command_exists fzf || return
if ! _binary_exists fzf; then
_log_warning "unable to initialize without '$_' installed."
return 1
fi

if [ -z ${FZF_DEFAULT_COMMAND+x} ] && _command_exists fd; then
if [[ -z ${FZF_DEFAULT_COMMAND+x} ]] && _command_exists fd; then
export FZF_DEFAULT_COMMAND='fd --type f'
fi

fe() {
function fe() {
about "Open the selected file in the default editor"
group "fzf"
param "1: Search term"
example "fe foo"

local IFS=$'\n' line
local files=()
while IFS='' read -r line; do files+=("$line"); done < <(fzf-tmux --query="$1" --multi --select-1 --exit-0)
[[ -n "${files[0]}" ]] && ${EDITOR:-vim} "${files[@]}"
read -ra files < <(fzf-tmux --query="$1" --multi --select-1 --exit-0)
[[ -n "${files[*]}" ]] && "${EDITOR:-${ALTERNATE_EDITOR:-nano}}" "${files[@]}"
}

fcd() {
function fcd() {
about "cd to the selected directory"
group "fzf"
param "1: Directory to browse, or . if omitted"
Expand Down
37 changes: 23 additions & 14 deletions plugins/available/gitstatus.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
cite about-plugin
about-plugin 'speeds up your life by using gitstatus for git status calculations. install from https://github.com/romkatv/gitstatus'

: "${SCM_GIT_GITSTATUS_DIR:="$HOME/gitstatus"}"
if [[ ! -d "${SCM_GIT_GITSTATUS_DIR}" ]] && _bash_it_homebrew_check; then
SCM_GIT_GITSTATUS_DIR="${BASH_IT_HOMEBREW_PREFIX?}/opt/gitstatus"
fi

function gitstatus_on_disable() {
about 'Destructor of gitstatus plugin'
group 'gitstatus'
Expand All @@ -10,19 +15,23 @@ function gitstatus_on_disable() {
_command_exists gitstatus_stop && gitstatus_stop
}

# No scm-check
[[ $SCM_CHECK == "true" ]] || return
function _bash-it-component-plugin-callback-on-init-gitstatus() {
# No scm-check
[[ ${SCM_CHECK?} == "true" ]] || return

# non-interactive shell
[[ $- == *i* ]] || return
# non-interactive shell
[[ $- == *i* ]] || return

: "${SCM_GIT_GITSTATUS_DIR:="$HOME/gitstatus"}"
if [[ -d ${SCM_GIT_GITSTATUS_DIR} ]]; then
# shellcheck disable=SC1091
source "${SCM_GIT_GITSTATUS_DIR}/gitstatus.plugin.sh"
# Start the actual gitstatus binary
gitstatus_stop && gitstatus_start -s -1 -u -1 -c -1 -d -1
export SCM_GIT_USE_GITSTATUS=true
else
_log_warning "Could not find gitstatus directory in ${SCM_GIT_GITSTATUS_DIR}. Please specify directory location using SCM_GIT_GITSTATUS_DIR."
fi
if [[ -d "${SCM_GIT_GITSTATUS_DIR?}" ]]; then
# shellcheck source-path=$HOME/gitstatus disable=SC1091
source "${SCM_GIT_GITSTATUS_DIR}/gitstatus.plugin.sh"
# Start the actual gitstatus binary
gitstatus_stop && gitstatus_start -s -1 -u -1 -c -1 -d -1
export SCM_GIT_USE_GITSTATUS=true
else
_log_warning "Could not find gitstatus directory in ${SCM_GIT_GITSTATUS_DIR}. Please specify directory location using SCM_GIT_GITSTATUS_DIR."
return 1
fi
}

_bash-it-component-plugin-callback-on-init-gitstatus
29 changes: 14 additions & 15 deletions plugins/available/go.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'go environment variables & path configuration'

# Load after basher and goenv
# BASH_IT_LOAD_PRIORITY: 270

# Test `go version` because goenv creates shim scripts that will be found in PATH
# but do not always resolve to a working install.
{ _command_exists go && go version &> /dev/null; } || return 0
if ! _binary_exists go || ! go version &> /dev/null; then
_log_warning "Unable to locate a working 'go'."
return 1
fi

export GOROOT="${GOROOT:-$(go env GOROOT)}"
export GOPATH="${GOPATH:-$(go env GOPATH)}"
: "${GOROOT:=$(go env GOROOT)}"
: "${GOPATH:=$(go env GOPATH)}"
export GOROOT GOPATH

# $GOPATH/bin is the default location for binaries. Because GOPATH accepts a list of paths and each
# might be managed differently, we add each path's /bin folder to PATH using pathmunge,
# while preserving ordering.
# e.g. GOPATH=foo:bar -> PATH=foo/bin:bar/bin
_bash-it-gopath-pathmunge() {
function _bash-it-component-plugin-callback-on-init-go() {
_about 'Ensures paths in GOPATH are added to PATH using pathmunge, with /bin appended'
_group 'go'
if [[ -z $GOPATH ]]; then
echo 'GOPATH empty' >&2
if [[ -z "${GOPATH:-}" ]]; then
_log_warning 'GOPATH empty'
return 1
fi
local paths i
local paths apath
IFS=: read -r -a paths <<< "$GOPATH"
i=${#paths[@]}
while [[ $i -gt 0 ]]; do
i=$((i - 1))
if [[ -n "${paths[i]}" ]]; then
pathmunge "${paths[i]}/bin"
fi
for apath in "${paths[@]}"; do
pathmunge "${apath}/bin" || true
done
}
_bash-it-gopath-pathmunge
_bash-it-component-plugin-callback-on-init-go
23 changes: 12 additions & 11 deletions plugins/available/goenv.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'load goenv, if you are using it'

# https://github.com/syndbg/goenv
Expand All @@ -11,29 +10,31 @@ about-plugin 'load goenv, if you are using it'
# - Check if in $PATH already
# - Check if installed manually to $GOENV_ROOT
# - Check if installed manually to $HOME
_command_exists goenv \
|| [[ -n "$GOENV_ROOT" && -x "$GOENV_ROOT/bin/goenv" ]] \
|| [[ -x "$HOME/.goenv/bin/goenv" ]] \
|| return 0
if ! _binary_exists goenv || ! [[ -n "${GOENV_ROOT:-}" && -x "$GOENV_ROOT/bin/goenv" ]] || ! [[ -x "$HOME/.goenv/bin/goenv" ]]; then
_log_warning "Unable to locate 'goenv'."
return 1
fi

# Set GOENV_ROOT, if not already set
export GOENV_ROOT="${GOENV_ROOT:-$HOME/.goenv}"
: "${GOENV_ROOT:=$HOME/.goenv}"
export GOENV_ROOT

# Add GOENV_ROOT/bin to PATH, if that's where it's installed
if ! _command_exists goenv && [[ -x "$GOENV_ROOT/bin/goenv" ]]; then
pathmunge "$GOENV_ROOT/bin"
fi

# Initialize goenv
eval "$(goenv init - bash)"
# shellcheck disable=SC1090 # Initialize goenv
source < <(goenv init - bash)

# If moving to a directory with a goenv version set, reload the shell
# to ensure the shell environment matches expectations.
_bash-it-goenv-preexec() {
function _bash-it-goenv-preexec() {
GOENV_OLD_VERSION="$(goenv version-name)"
}
_bash-it-goenv-precmd() {
if [[ -n $GOENV_OLD_VERSION ]] && [[ "$GOENV_OLD_VERSION" != "$(goenv version-name)" ]]; then

function _bash-it-goenv-precmd() {
if [[ -n "${GOENV_OLD_VERSION:-}" ]] && [[ "$GOENV_OLD_VERSION" != "$(goenv version-name)" ]]; then
exec env -u PATH -u GOROOT -u GOPATH -u GOENV_OLD_VERSION "${0/-/}" --login
fi
unset GOENV_OLD_VERSION
Expand Down
8 changes: 5 additions & 3 deletions plugins/available/hub.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'load hub, if you are using it'

if _command_exists hub; then
eval "$(hub alias -s)"
if ! _binary_exists hub; then
_log_warning "Unable to locate 'hub'."
return 1
fi

source < <(hub alias -s)
23 changes: 13 additions & 10 deletions plugins/available/jenv.plugin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,21 @@ about-plugin 'load jenv, if you are using it'
# - Check if in $PATH already
# - Check if installed manually to $JENV_ROOT
# - Check if installed manually to $HOME
_command_exists jenv \
|| [[ -n "$JENV_ROOT" && -x "$JENV_ROOT/bin/jenv" ]] \
|| [[ -x "$HOME/.jenv/bin/jenv" ]] \
|| return
if ! _binary_exists jenv &&
! [[ -n "${JENV_ROOT:-}" && -x "$JENV_ROOT/bin/jenv" ]] &&
! [[ -x "$HOME/.jenv/bin/jenv" ]]; then
_log_warning "Unable to locate 'jenv'."
return 1
fi

# Set JENV_ROOT, if not already set
export JENV_ROOT="${JENV_ROOT:-$HOME/.jenv}"
: "${JENV_ROOT:=$HOME/.jenv}"
export JENV_ROOT

# Add JENV_ROOT/bin to PATH, if that's where it's installed
! _command_exists jenv \
&& [[ -x "$JENV_ROOT/bin/jenv" ]] \
&& pathmunge "$JENV_ROOT/bin"
if ! _command_exists jenv && [[ -x "$JENV_ROOT/bin/jenv" ]]; then
pathmunge "$JENV_ROOT/bin"
fi

# Initialize jenv
eval "$(jenv init - bash)"
# shellcheck disable=SC1090 # Initialize jenv
source < <(jenv init - bash)
7 changes: 3 additions & 4 deletions plugins/available/jump.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# shellcheck shell=bash
# shellcheck disable=SC2016
cite about-plugin
about-plugin 'initialize jump (see https://github.com/gsamokovarov/jump). Add `export JUMP_OPTS=("--bind=z")` to change keybinding'

function __init_jump() {
function _bash-it-component-plugin-callback-on-init-jump() {
if _command_exists jump; then
eval "$(jump shell bash "${JUMP_OPTS[@]}")"
source < <(jump shell bash "${JUMP_OPTS[@]:-}")
fi
}

__init_jump
_bash-it-component-plugin-callback-on-init-jump
6 changes: 4 additions & 2 deletions plugins/available/less-pretty-cat.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'pygmentize instead of cat to terminal if possible'

_command_exists pygmentize || return
if ! _binary_exists pygmentize; then
_log_warning "${BASH_SOURCE[0]##*/}: unable to initialize without '$_' installed."
return 1
fi

# pigmentize cat and less outputs - call them ccat and cless to avoid that
# especially cat'ed output in scripts gets mangled with pygemtized meta characters
Expand Down
8 changes: 5 additions & 3 deletions plugins/available/node.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'Node.js helper functions'

# Check that we have npm
_command_exists npm || return
if ! _binary_exists npm; then
_log_warning "Unable to locage 'npm'."
return 1
fi

# Ensure local modules are preferred in PATH
pathmunge "./node_modules/.bin" "after"

# If not using nodenv, ensure global modules are in PATH
if [[ ! "$(type -p npm)" == *"nodenv/shims"* ]]; then
if [[ "$(type -p npm)" != *"nodenv/shims"* ]]; then
pathmunge "$(npm config get prefix)/bin" "after"
fi
15 changes: 10 additions & 5 deletions plugins/available/nodenv.plugin.bash
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'load nodenv, if you are using it'

export NODENV_ROOT="$HOME/.nodenv"
pathmunge "$NODENV_ROOT/bin"
if [[ -d "${NODENV_ROOT:=$HOME/.nodenv}/bin" ]]; then
export NODENV_ROOT
pathmunge "$NODENV_ROOT/bin"
fi

if _command_exists nodenv; then
eval "$(nodenv init - bash)"
if ! _binary_exists nodenv; then
_log_warning "Unable to locage 'nodenv'."
return 1
fi

# shellcheck disable=SC1090
source < <(nodenv init - bash)
Loading
Loading