Compare commits

..

No commits in common. "master" and "v3.0.0" have entirely different histories.

79 changed files with 1067 additions and 2472 deletions

View File

@ -0,0 +1,46 @@
---
name: Bug report
about: Create a bug report to help us improve
title: ''
labels: bug:general
assignees: ''
---
<!--- Provide a general summary of the issue in the Title above -->
## Expected Behavior
<!--- Tell us what should happen -->
## Current Behavior
<!--- Tell us what happens instead of the expected behavior -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
## Steps to Reproduce
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
* Bash-it version used:
* List of enabled plugins, themes and aliases (use ``bash-it show (plugins/themes/aliases)``):
* ``bash-it doctor`` output:
* Bash version:
* Operating System and version:
## Your Bash Config File
<!--- Please paste here your bash config file (.bashrc/.bash_profile) -->
<!--- This will help us debug and locate the problem -->
```bash
# Your bash config file should be here
```

View File

@ -1,85 +0,0 @@
name: 🐛 Bug report
title: "[Bug]: "
description: Create a bug report to help us improve
labels: "bug:general"
body:
- type: textarea
attributes:
label: Expected behavior
description: Tell us what should happen.
validations:
required: true
- type: textarea
attributes:
label: Current behavior
description: Tell us what happens instead of the expected behavior.
validations:
required: true
- type: textarea
attributes:
label: Possible solution
description: Tell us how it could be fixed at your glance.
validations:
required: false
- type: textarea
attributes:
label: Context
description: >
How has this issue affected you? What are you trying to accomplish?
Providing context helps us come up with a solution that is most useful in the real world.
validations:
required: false
- type: textarea
attributes:
label: Steps to reproduce
description: >
Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant.
validations:
required: true
- type: input
attributes:
label: Bash-it version
placeholder: "How to get: bash-it version"
validations:
required: true
- type: input
attributes:
label: List of enabled plugins, themes and aliases
placeholder: "How to get: bash-it show plugins|themes|aliases (it is not a pipe)"
validations:
required: true
- type: input
attributes:
label: Bash version
placeholder: "How to get: bash --version"
validations:
required: true
- type: input
attributes:
label: Operating system and version
placeholder: "How to get: neofetch (or another command)"
validations:
required: true
- type: textarea
attributes:
label: "bash-it doctor output"
value: |
```
# How to get: bash-it doctor
```
validations:
required: false
- type: textarea
attributes:
label: Your ~/.bashrc
value: |
```bash
# How to get: cat ~/.bashrc
```
validations:
required: true
- type: textarea
attributes:
label: Notes
description: >
Provide any extra details here.

View File

@ -1,5 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: Libera chat
url: https://web.libera.chat/?channel=#bash-it
about: You can ask and answer questions here

View File

@ -0,0 +1,23 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature request
assignees: ''
---
<!--- Provide a general summary of the issue in the Title above -->
## Expected Behavior
<!--- Tell us how your feature should work -->
## Current Behavior
<!--- Explain the difference your feature will have from current behavior -->
## Possible Solution
<!--- Not obligatory, but suggest ideas on how to implement the addition or change -->
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->

View File

@ -1,34 +0,0 @@
name: 💡 Feature request
title: "[Feature]: "
description: Suggest an idea for this project
labels: "feature request"
body:
- type: textarea
attributes:
label: Expected behavior
description: Tell us how your feature should work.
validations:
required: true
- type: textarea
attributes:
label: Current behavior
description: Explain the difference your feature will have from current behavior.
validations:
required: true
- type: textarea
attributes:
label: Possible solution
description: Tell us how it could be fixed at your glance.
validations:
required: false
- type: textarea
attributes:
label: Context
description: >
How has this issue affected you? What are you trying to accomplish?
Providing context helps us come up with a solution that is most useful in the real world.
- type: textarea
attributes:
label: Notes
description: >
Provide any extra details here.

View File

@ -7,7 +7,7 @@ jobs:
bats-test: bats-test:
strategy: strategy:
matrix: matrix:
os: [ubuntu-20.04, ubuntu-22.04, macos-12, macos-11] os: [ubuntu-20.04, ubuntu-18.04, macos-10.15, macos-11]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
@ -49,17 +49,10 @@ jobs:
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.8 python-version: 3.8
# - name: Update APT Package Lists
# run: sudo apt-get update
- name: Install shfmt - name: Install shfmt
run: GO111MODULE=on go get mvdan.cc/sh/v3/cmd/shfmt run: GO111MODULE=on go get mvdan.cc/sh/v3/cmd/shfmt
- name: Install shellcheck - name: Install shellcheck
env: run: brew install shellcheck
scversion: stable # Or latest, vxx, etc
run: |
wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv "shellcheck-${scversion}/shellcheck"
sudo cp "shellcheck-${scversion}/shellcheck" /usr/bin/
shellcheck --version
- name: Install pre-commit - name: Install pre-commit
run: python3 -m pip install -r test/lint-requirements.txt run: python3 -m pip install -r test/lint-requirements.txt
- name: Run lint - name: Run lint

View File

@ -34,7 +34,7 @@ fi
alias c='clear' alias c='clear'
alias cls='clear' alias cls='clear'
alias edit='${EDITOR:-${ALTERNATE_EDITOR:-nano}}' alias edit='${EDITOR:-${ALTERNATE_EDITOR?}}'
alias pager='${PAGER:=less}' alias pager='${PAGER:=less}'
alias q='exit' alias q='exit'
@ -71,6 +71,10 @@ alias rd='rmdir'
# Shorten extract # Shorten extract
alias xt='extract' alias xt='extract'
# sudo editors
alias svim='sudo ${VISUAL:-vim}'
alias snano='sudo nano'
# Display whatever file is regular file or folder # Display whatever file is regular file or folder
function catt() { function catt() {
for i in "$@"; do for i in "$@"; do

View File

@ -8,18 +8,13 @@ alias get='git'
alias ga='git add' alias ga='git add'
alias gall='git add -A' alias gall='git add -A'
alias gap='git add -p' alias gap='git add -p'
alias gav='git add -v'
# branch # branch
alias gb='git branch' alias gb='git branch'
alias gba='git branch --all'
alias gbd='git branch -d'
alias gbD='git branch -D' alias gbD='git branch -D'
alias gbl='git branch --list' alias gba='git branch -a'
alias gbla='git branch --list --all' alias gbd='git branch -d'
alias gblr='git branch --list --remotes' alias gbm='git branch -m'
alias gbm='git branch --move'
alias gbr='git branch --remotes'
alias gbt='git branch --track' alias gbt='git branch --track'
alias gdel='git branch -D' alias gdel='git branch -D'

View File

@ -1,16 +1,20 @@
# shellcheck shell=bash # shellcheck shell=bash
about-alias 'kubectl aliases' about-alias 'kubectl aliases'
if _command_exists kubectl; then function _set_pkg_aliases() {
alias kc='kubectl' if _command_exists kubectl; then
alias kcgp='kubectl get pods' alias kc='kubectl'
alias kcgd='kubectl get deployments' alias kcgp='kubectl get pods'
alias kcgn='kubectl get nodes' alias kcgd='kubectl get deployments'
alias kcdp='kubectl describe pod' alias kcgn='kubectl get nodes'
alias kcdd='kubectl describe deployment' alias kcdp='kubectl describe pod'
alias kcdn='kubectl describe node' alias kcdd='kubectl describe deployment'
alias kcgpan='kubectl get pods --all-namespaces' alias kcdn='kubectl describe node'
alias kcgdan='kubectl get deployments --all-namespaces' alias kcgpan='kubectl get pods --all-namespaces'
# launches a disposable netshoot pod in the k8s cluster alias kcgdan='kubectl get deployments --all-namespaces'
alias kcnetshoot='kubectl run netshoot-$(date +%s) --rm -i --tty --image nicolaka/netshoot -- /bin/bash' # launches a disposable netshoot pod in the k8s cluster
fi alias kcnetshoot='kubectl run netshoot-$(date +%s) --rm -i --tty --image nicolaka/netshoot -- /bin/bash'
fi
}
_set_pkg_aliases

View File

@ -11,7 +11,6 @@ alias safari='open -a safari'
alias firefox='open -a firefox' alias firefox='open -a firefox'
alias chrome='open -a "Google Chrome"' alias chrome='open -a "Google Chrome"'
alias chromium='open -a chromium' alias chromium='open -a chromium'
alias brave='open -a "Brave Browser"'
alias dashcode='open -a dashcode' alias dashcode='open -a dashcode'
alias f='open -a Finder ' alias f='open -a Finder '
alias fh='open -a Finder .' alias fh='open -a Finder .'

View File

@ -2,7 +2,6 @@
about-alias 'Aliases for Terraform and Terragrunt' about-alias 'Aliases for Terraform and Terragrunt'
alias tf='terraform' alias tf='terraform'
alias tfi='tf init'
alias tfv='terraform validate' alias tfv='terraform validate'
alias tfp='terraform plan' alias tfp='terraform plan'
alias tfa='terraform apply' alias tfa='terraform apply'

View File

@ -51,6 +51,8 @@ if [[ -n "${BASH_IT_THEME:-}" ]]; then
source "${BASH_IT}/themes/githelpers.theme.bash" source "${BASH_IT}/themes/githelpers.theme.bash"
BASH_IT_LOG_PREFIX="themes: p4helpers: " BASH_IT_LOG_PREFIX="themes: p4helpers: "
source "${BASH_IT}/themes/p4helpers.theme.bash" source "${BASH_IT}/themes/p4helpers.theme.bash"
BASH_IT_LOG_PREFIX="themes: command_duration: "
source "${BASH_IT}/themes/command_duration.theme.bash"
BASH_IT_LOG_PREFIX="themes: base: " BASH_IT_LOG_PREFIX="themes: base: "
source "${BASH_IT}/themes/base.theme.bash" source "${BASH_IT}/themes/base.theme.bash"

View File

@ -33,7 +33,6 @@ lint_clean_files.sh
# #
completion/available/apm.completion.bash completion/available/apm.completion.bash
completion/available/awless.completion.bash completion/available/awless.completion.bash
completion/available/awscli.completion.bash
completion/available/bash-it.completion.bash completion/available/bash-it.completion.bash
completion/available/brew.completion.bash completion/available/brew.completion.bash
completion/available/cargo.completion.bash completion/available/cargo.completion.bash
@ -46,7 +45,6 @@ completion/available/dmidecode.completion.bash
completion/available/docker-machine.completion.bash completion/available/docker-machine.completion.bash
completion/available/docker.completion.bash completion/available/docker.completion.bash
completion/available/dotnet.completion.bash completion/available/dotnet.completion.bash
completion/available/flutter.completion.bash
completion/available/gcloud.completion.bash completion/available/gcloud.completion.bash
completion/available/gem.completion.bash completion/available/gem.completion.bash
completion/available/git.completion.bash completion/available/git.completion.bash
@ -76,12 +74,9 @@ completion/available/system.completion.bash
completion/available/vault.completion.bash completion/available/vault.completion.bash
completion/available/vuejs.completion.bash completion/available/vuejs.completion.bash
completion/available/wpscan.completion.bash completion/available/wpscan.completion.bash
completion/available/yarn.completion.bash
# libraries # libraries
lib/appearance.bash
lib/colors.bash lib/colors.bash
lib/command_duration.bash
lib/helpers.bash lib/helpers.bash
lib/history.bash lib/history.bash
lib/log.bash lib/log.bash
@ -139,9 +134,10 @@ plugins/available/zoxide.plugin.bash
# tests # tests
# #
test/completion/aliases.completion.bats test/plugins/alias-completion.plugin.bats
test/run test/run
test/test_helper.bash test/test_helper.bash
test/test_helper_libs.bash
# themes # themes
# #
@ -159,13 +155,11 @@ themes/bobby-python
themes/brainy themes/brainy
themes/brunton themes/brunton
themes/candy themes/candy
themes/command_duration.theme.bash
themes/easy themes/easy
themes/essential themes/essential
themes/githelpers.theme.bash
themes/modern themes/modern
themes/norbu themes/norbu
themes/oh-my-posh
themes/p4helpers.theme.bash
themes/pete themes/pete
themes/powerline themes/powerline
themes/pure themes/pure

View File

@ -50,7 +50,7 @@ function _bash-it-component-completion-callback-on-init-aliases() {
fi fi
# skip aliases to pipes, boolean control structures and other command lists # skip aliases to pipes, boolean control structures and other command lists
chars=$'|&;()<>\n' chars='\|\&\;\)\(\n\<\>'
if [[ "${alias_defn}" =~ [$chars] ]]; then if [[ "${alias_defn}" =~ [$chars] ]]; then
continue continue
fi fi

View File

@ -1,5 +1,6 @@
# shellcheck shell=bash # shellcheck shell=bash
if _command_exists aws_completer; then if _command_exists aws_completer
then
complete -C "$(command -v aws_completer)" aws complete -C "$(command -v aws_completer)" aws
fi fi

View File

@ -14,17 +14,17 @@ fi
_bash_it_homebrew_check || return 0 _bash_it_homebrew_check || return 0
if [[ -r "$BASH_IT_HOMEBREW_PREFIX/etc/bash_completion.d/brew" ]]; then if [[ -r "$BASH_IT_HOMEBREW_PREFIX/etc/bash_completion.d/brew" ]]; then
# shellcheck disable=1090,1091 # shellcheck disable=1090
source "$BASH_IT_HOMEBREW_PREFIX/etc/bash_completion.d/brew" source "$BASH_IT_HOMEBREW_PREFIX/etc/bash_completion.d/brew"
elif [[ -r "$BASH_IT_HOMEBREW_PREFIX/Library/Contributions/brew_bash_completion.sh" ]]; then elif [[ -r "$BASH_IT_HOMEBREW_PREFIX/Library/Contributions/brew_bash_completion.sh" ]]; then
# shellcheck disable=1090,1091 # shellcheck disable=1090
source "$BASH_IT_HOMEBREW_PREFIX/Library/Contributions/brew_bash_completion.sh" source "$BASH_IT_HOMEBREW_PREFIX/Library/Contributions/brew_bash_completion.sh"
elif [[ -f "$BASH_IT_HOMEBREW_PREFIX/completions/bash/brew" ]]; then elif [[ -f "$BASH_IT_HOMEBREW_PREFIX/completions/bash/brew" ]]; then
# For the git-clone based installation, see here for more info: # For the git-clone based installation, see here for more info:
# https://github.com/Bash-it/bash-it/issues/1458 # https://github.com/Bash-it/bash-it/issues/1458
# https://docs.brew.sh/Shell-Completion # https://docs.brew.sh/Shell-Completion
# shellcheck disable=1090,1091 # shellcheck disable=1090
source "$BASH_IT_HOMEBREW_PREFIX/completions/bash/brew" source "$BASH_IT_HOMEBREW_PREFIX/completions/bash/brew"
fi fi

View File

@ -1,4 +1,4 @@
# shellcheck shell=bash #!/usr/bin/env bash
# #
# Bash completion support for Fabric (http://fabfile.org/) # Bash completion support for Fabric (http://fabfile.org/)
# #
@ -91,7 +91,7 @@ function __fab_completion() {
-*) -*)
if [[ -z "${__FAB_COMPLETION_LONG_OPT}" ]]; then if [[ -z "${__FAB_COMPLETION_LONG_OPT}" ]]; then
export __FAB_COMPLETION_LONG_OPT=$( export __FAB_COMPLETION_LONG_OPT=$(
fab --help | grep -E -o "\-\-[A-Za-z_\-]+\=?" | sort -u) fab --help | egrep -o "\-\-[A-Za-z_\-]+\=?" | sort -u)
fi fi
opts="${__FAB_COMPLETION_LONG_OPT}" opts="${__FAB_COMPLETION_LONG_OPT}"
;; ;;
@ -101,7 +101,7 @@ function __fab_completion() {
# -*) # -*)
# if [[ -z "${__FAB_COMPLETION_SHORT_OPT}" ]]; then # if [[ -z "${__FAB_COMPLETION_SHORT_OPT}" ]]; then
# export __FAB_COMPLETION_SHORT_OPT=$( # export __FAB_COMPLETION_SHORT_OPT=$(
# fab --help | grep -E -o "^ +\-[A-Za-z_\]" | sort -u) # fab --help | egrep -o "^ +\-[A-Za-z_\]" | sort -u)
# fi # fi
# opts="${__FAB_COMPLETION_SHORT_OPT}" # opts="${__FAB_COMPLETION_SHORT_OPT}"
# ;; # ;;

View File

@ -1,5 +1,5 @@
# shellcheck shell=bash #!/usr/bin/bash
if _command_exists flutter; then if _command_exists flutter; then
eval "$(flutter bash-completion)" eval "$(flutter bash-completion)"
fi fi

View File

@ -1,5 +1,3 @@
# shellcheck shell=bash
# Copyright (c) 2017 Eric Wendelin # Copyright (c) 2017 Eric Wendelin
# Permission is hereby granted, free of charge, to any person obtaining a copy of # Permission is hereby granted, free of charge, to any person obtaining a copy of
@ -68,7 +66,7 @@ __gradle-generate-script-cache() {
if [[ ! $(find $cache_dir/$cache_name -mmin -$cache_ttl_mins 2>/dev/null) ]]; then if [[ ! $(find $cache_dir/$cache_name -mmin -$cache_ttl_mins 2>/dev/null) ]]; then
# Cache all Gradle scripts # Cache all Gradle scripts
local gradle_build_scripts=$(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | grep -E -v "$script_exclude_pattern") local gradle_build_scripts=$(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | egrep -v "$script_exclude_pattern")
printf "%s\n" "${gradle_build_scripts[@]}" > $cache_dir/$cache_name printf "%s\n" "${gradle_build_scripts[@]}" > $cache_dir/$cache_name
fi fi
} }

View File

@ -1,5 +1,3 @@
# shellcheck shell=bash
# Bash completion for Makefile # Bash completion for Makefile
# Loosely adapted from http://stackoverflow.com/a/38415982/1472048 # Loosely adapted from http://stackoverflow.com/a/38415982/1472048
@ -19,7 +17,7 @@ _makecomplete() {
for f in "${files[@]}" ; do for f in "${files[@]}" ; do
while IFS='' read -r line ; do while IFS='' read -r line ; do
targets+=("$line") targets+=("$line")
done < <(grep -E -o '^[a-zA-Z0-9_-]+:([^=]|$)' "$f" | cut -d':' -f1) done < <(grep -oE '^[a-zA-Z0-9_-]+:([^=]|$)' "$f" | cut -d':' -f1)
done done
[ "${#targets[@]}" -eq 0 ] && return 0 [ "${#targets[@]}" -eq 0 ] && return 0

View File

@ -7,7 +7,7 @@ _is_function _rl_enabled ||
_pj() { _pj() {
_is_function _init_completion || return _is_function _init_completion || return
_is_function _rl_enabled || return _is_function _rl_enabled || return
[ -n "$BASH_IT_PROJECT_PATHS" ] || return [ -n "$PROJECT_PATHS" ] || return
shift shift
[ "$1" == "open" ] && shift [ "$1" == "open" ] && shift
@ -21,7 +21,7 @@ _pj() {
local -r mark_dirs=$(_rl_enabled mark-directories && echo y) local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y) local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)
for i in ${BASH_IT_PROJECT_PATHS//:/$'\n'}; do for i in ${PROJECT_PATHS//:/$'\n'}; do
# create an array of matched subdirs # create an array of matched subdirs
k="${#COMPREPLY[@]}" k="${#COMPREPLY[@]}"
for j in $( compgen -d $i/$cur ); do for j in $( compgen -d $i/$cur ); do

View File

@ -1,5 +0,0 @@
# shellcheck shell=bash
about-completion "yarn cli completions"
# shellcheck disable=SC1090 source=../../vendor/github.com/dsifford/yarn-completion/yarn
source "${BASH_IT}/vendor/github.com/dsifford/yarn-completion/yarn"

View File

@ -4,6 +4,7 @@
![Docs Status](https://readthedocs.org/projects/bash-it/badge/) ![Docs Status](https://readthedocs.org/projects/bash-it/badge/)
![License](https://img.shields.io/github/license/Bash-it/bash-it) ![License](https://img.shields.io/github/license/Bash-it/bash-it)
![shell](https://img.shields.io/badge/Shell-Bash-blue) ![shell](https://img.shields.io/badge/Shell-Bash-blue)
[![Join the chat at https://web.libera.chat/?channel=#bash-it](https://img.shields.io/badge/chat-on%20Libera.Chat-brightgreen.svg)](https://web.libera.chat/?channel=#bash-it)
**Bash-it** is a collection of community Bash commands and scripts for Bash 3.2+. **Bash-it** is a collection of community Bash commands and scripts for Bash 3.2+.
(And a shameless ripoff of [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) :smiley:) (And a shameless ripoff of [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) :smiley:)

View File

@ -14,6 +14,7 @@
# import sys # import sys
# sys.path.insert(0, os.path.abspath('.')) # sys.path.insert(0, os.path.abspath('.'))
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------
project = 'Bash-it' project = 'Bash-it'
@ -23,6 +24,7 @@ author = 'Bash-it Team'
# The full version, including alpha/beta/rc tags # The full version, including alpha/beta/rc tags
release = '' release = ''
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
@ -39,7 +41,8 @@ templates_path = ['_templates']
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path. # This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', "venv"] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# -- Options for HTML output ------------------------------------------------- # -- Options for HTML output -------------------------------------------------

View File

@ -1,4 +1,4 @@
sphinx==4.5.0 sphinx==3.2.1
sphinx-rtd-theme==0.5.0 sphinx-rtd-theme==0.5.0
sphinxemoji==0.1.8 sphinxemoji==0.1.8
docutils==0.17.1 docutils==0.17.1

View File

@ -8,35 +8,13 @@ A minimal theme with a clean git prompt
Provided Information Provided Information
-------------------- --------------------
* Current git remote tool logo (support: github, gitlab, bitbucket) * Current git remote tool logo (support: github, gitlab, bitbucket)
* Current path (red when user is root) * Current path (red when user is root)
* Current git info * Current git info
* Last command exit code (only shown when the exit code is greater than 0) * Last command exit code (only shown when the exit code is greater than 0)
* user@hostname for ssh connection * user@hostname for ssh connection
Default configuration
^^^^^^^^^^^^^^^^^^^^^
.. code-block:: bash
BARBUK_PROMPT="git-uptream-remote-logo ssh path scm python_venv ruby node terraform cloud duration exit"
You can override BARBUK_PROMPT to display only the desired information.
available block:
* git-uptream-remote-logo
* ssh
* path
* scm
* python_venv
* ruby
* node
* terraform
* cloud
* duration
* exit
Fonts and glyphs Fonts and glyphs
---------------- ----------------
@ -61,12 +39,6 @@ Default theme glyphs
BARBUK_EXIT_CODE_ICON=' ' BARBUK_EXIT_CODE_ICON=' '
BARBUK_PYTHON_VENV_CHAR=' ' BARBUK_PYTHON_VENV_CHAR=' '
BARBUK_COMMAND_DURATION_ICON='  ' BARBUK_COMMAND_DURATION_ICON='  '
BARBUK_RUBY_CHAR=' '
BARBUK_NODE_CHAR=' '
BARBUK_TERRAFORM_CHAR="t "
BARBUK_AWS_PROFILE_CHAR=" aws "
BARBUK_SCALEWAY_PROFILE_CHAR=" scw "
BARBUK_GCLOUD_CHAR=" gcp "
Customize glyphs Customize glyphs
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^

View File

@ -346,19 +346,6 @@ NWinkler
:alt: :alt:
----
.. _oh_my_posh_image:
Oh-My-Posh
^^^^^^^^^^
.. image:: https://bash-it.github.io/bash-it/docs/images/oh-my-posh.png
:target: https://bash-it.github.io/bash-it/docs/images/oh-my-posh.png
:alt:
---- ----
Pete Pete

View File

@ -1,15 +0,0 @@
.. _oh-my-posh:
Oh-My-Posh Theme
================
The oh-my-posh ״theme״ is really a plug to a whole other system
of managing your prompt. To use it please start here:
`Oh-My-Posh homepage <https://ohmyposh.dev/>`_
It is beyond the scope of bash-it to install and manage oh-my-posh,
this theme is here just to make sure your OMP setup doesn't clash
with other bash-it themes. Once installed, OMP will load a default
OMP theme (jandedobbeleer), which you can then customize or override.
Note: Nerd Fonts are highly recommended, as most of the themes are graphic candies.

View File

@ -8,38 +8,9 @@ Table of Contents
* `I'm stuck in the LightDM login screen after setting up bash-it. <im-stuck-in-the-lightdm-login-screen-after-setting-up-bash-it>`_ * `I'm stuck in the LightDM login screen after setting up bash-it. <im-stuck-in-the-lightdm-login-screen-after-setting-up-bash-it>`_
* `I'm getting strange line break and wrapping behaviour on macOS. <im-getting-strange-line-break-and-wrapping-behaviour-on-macos>`_
I'm stuck in the LightDM login screen after setting up bash-it I'm stuck in the LightDM login screen after setting up bash-it
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Possible issue**\ : `#672 <https://github.com/Bash-it/bash-it/issues/672>`_ **Possible issue**\ : `#672 <https://github.com/Bash-it/bash-it/issues/672>`_
**Solution**\ : Check `this comment <https://github.com/Bash-it/bash-it/issues/672#issuecomment-257870653>`_ for detailed information about the cause and solution for this issue. **Solution**\ : Check `this comment <https://github.com/Bash-it/bash-it/issues/672#issuecomment-257870653>`_ for detailed information about the cause and solution for this issue.
I'm getting strange line break and wrapping behaviour on macOS
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Possible issue**\ : `#1614 <https://github.com/Bash-it/bash-it/issues/1614>`_
**Solution**\ : Bash-it requires Bash 4.?? or later to run correctly. Any reasonably current Linux distribution should have shipped with a compatible version of Bash. However, macOS users must upgrade from the included, obsolete Bash version 3. While some functionality might work with Bash 3, there is no guarantee that everything will work perfectly. Thus, we recommend using `Homebrew <https://brew.sh/>`_ to ensure Bash is up to date:
x86 Mac
^^^^^^^
.. code-block:: bash
brew install bash
sudo sh -c 'echo /usr/local/bin/bash >> /etc/shells'
chsh -s /usr/local/bin/bash
M1 Mac
^^^^^^
Homebrew's default installation location on M1 is ``/opt/homebrew/bin/``:
.. code-block:: bash
brew install bash
sudo sh -c 'echo /opt/homebrew/bin/bash >> /etc/shells'
chsh -s /opt/homebrew/bin/bash

View File

@ -12,6 +12,7 @@ function _bash-it_show_usage() {
echo "--no-modify-config (-n): Do not modify existing config file" echo "--no-modify-config (-n): Do not modify existing config file"
echo "--append-to-config (-a): Keep existing config file and append bash-it templates at the end" echo "--append-to-config (-a): Keep existing config file and append bash-it templates at the end"
echo "--overwrite-backup (-f): Overwrite existing backup" echo "--overwrite-backup (-f): Overwrite existing backup"
exit 0
} }
# enable a thing # enable a thing

View File

@ -1,18 +1,19 @@
# shellcheck shell=bash #!/usr/bin/env bash
: "${CLICOLOR:=$(tput colors)}" # colored ls
export CLICOLOR export LSCOLORS='Gxfxcxdxdxegedabagacad'
: "${CUSTOM_THEME_DIR:="${BASH_IT_CUSTOM:=${BASH_IT}/custom}/themes"}" if [[ -z "$CUSTOM_THEME_DIR" ]]; then
CUSTOM_THEME_DIR="${BASH_IT_CUSTOM:=${BASH_IT}/custom}/themes"
fi
# Load the theme # Load the theme
# shellcheck disable=SC1090 if [[ $BASH_IT_THEME ]]; then
if [[ -n "${BASH_IT_THEME:-}" ]]; then if [[ -f $BASH_IT_THEME ]]; then
if [[ -f "${BASH_IT_THEME}" ]]; then source $BASH_IT_THEME
source "${BASH_IT_THEME}" elif [[ -f "$CUSTOM_THEME_DIR/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash" ]]; then
elif [[ -f "$CUSTOM_THEME_DIR/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash" ]]; then source "$CUSTOM_THEME_DIR/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash"
source "$CUSTOM_THEME_DIR/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash" else
else source "$BASH_IT/themes/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash"
source "$BASH_IT/themes/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash" fi
fi
fi fi

View File

@ -1,76 +0,0 @@
# shellcheck shell=bash
#
# Functions for measuring and reporting how long a command takes to run.
# Get shell duration in decimal format regardless of runtime locale.
# Notice: This function runs as a sub-shell - notice '(' vs '{'.
function _shell_duration_en() (
# DFARREL You would think LC_NUMERIC would do it, but not working in my local
LC_ALL='en_US.UTF-8'
printf "%s" "${EPOCHREALTIME:-$SECONDS}"
)
: "${COMMAND_DURATION_START_SECONDS:=$(_shell_duration_en)}"
: "${COMMAND_DURATION_ICON:=🕘}"
: "${COMMAND_DURATION_MIN_SECONDS:=1}"
function _command_duration_pre_exec() {
COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)"
}
function _command_duration_pre_cmd() {
COMMAND_DURATION_START_SECONDS=""
}
function _dynamic_clock_icon {
local clock_hand
# clock hand value is between 90 and 9b in hexadecimal.
# so between 144 and 155 in base 10.
printf -v clock_hand '%x' $(((${1:-${SECONDS}} % 12) + 144))
printf -v 'COMMAND_DURATION_ICON' '%b' "\xf0\x9f\x95\x$clock_hand"
}
function _command_duration() {
[[ -n "${BASH_IT_COMMAND_DURATION:-}" ]] || return
[[ -n "${COMMAND_DURATION_START_SECONDS:-}" ]] || return
local command_duration=0 command_start="${COMMAND_DURATION_START_SECONDS:-0}"
local -i minutes=0 seconds=0 deciseconds=0
local -i command_start_seconds="${command_start%.*}"
local -i command_start_deciseconds=$((10#${command_start##*.}))
command_start_deciseconds="${command_start_deciseconds:0:1}"
local current_time
current_time="$(_shell_duration_en)"
local -i current_time_seconds="${current_time%.*}"
local -i current_time_deciseconds="$((10#${current_time##*.}))"
current_time_deciseconds="${current_time_deciseconds:0:1}"
if [[ "${command_start_seconds:-0}" -gt 0 ]]; then
# seconds
command_duration="$((current_time_seconds - command_start_seconds))"
if ((current_time_deciseconds >= command_start_deciseconds)); then
deciseconds="$((current_time_deciseconds - command_start_deciseconds))"
else
((command_duration -= 1))
deciseconds="$((10 - (command_start_deciseconds - current_time_deciseconds)))"
fi
else
command_duration=0
fi
if ((command_duration >= COMMAND_DURATION_MIN_SECONDS)); then
minutes=$((command_duration / 60))
seconds=$((command_duration % 60))
_dynamic_clock_icon "${command_duration}"
if ((minutes > 0)); then
printf "%s %s%dm %ds" "${COMMAND_DURATION_ICON:-}" "${COMMAND_DURATION_COLOR:-}" "$minutes" "$seconds"
else
printf "%s %s%d.%01ds" "${COMMAND_DURATION_ICON:-}" "${COMMAND_DURATION_COLOR:-}" "$seconds" "$deciseconds"
fi
fi
}
_bash_it_library_finalize_hook+=("safe_append_preexec '_command_duration_pre_exec'")
_bash_it_library_finalize_hook+=("safe_append_prompt_command '_command_duration_pre_cmd'")

View File

@ -211,7 +211,7 @@ function _is_function() {
_example '$ _is_function ls && echo exists' _example '$ _is_function ls && echo exists'
_group 'lib' _group 'lib'
local msg="${2:-Function '$1' does not exist}" local msg="${2:-Function '$1' does not exist}"
if LC_ALL=C type -t "$1" | _bash-it-fgrep -q 'function'; then if LC_ALL=C type -t "$1" | _bash-it-egrep -q 'function'; then
return 0 return 0
else else
_log_debug "$msg" _log_debug "$msg"
@ -290,7 +290,6 @@ function _bash-it-update-() {
DIFF=$(git diff --name-status) DIFF=$(git diff --name-status)
if [[ -n "$DIFF" ]]; then if [[ -n "$DIFF" ]]; then
echo -e "Local changes detected in bash-it directory. Clean '$BASH_IT' directory to proceed.\n$DIFF" echo -e "Local changes detected in bash-it directory. Clean '$BASH_IT' directory to proceed.\n$DIFF"
popd > /dev/null || return
return 1 return 1
fi fi
@ -335,7 +334,7 @@ function _bash-it-update-() {
log_color="%Cred" log_color="%Cred"
fi fi
git log --no-merges --format="${log_color}%h: %s (%an)" "${revision}" git log --format="${log_color}%h: %s (%an)" "${revision}"
echo "" echo ""
if [[ -n "${silent}" ]]; then if [[ -n "${silent}" ]]; then

View File

@ -45,7 +45,7 @@ function _bash-it-log-prefix-by-path() {
function _has_colors() { function _has_colors() {
# Check that stdout is a terminal, and that it has at least 8 colors. # Check that stdout is a terminal, and that it has at least 8 colors.
[[ -t 1 && "${CLICOLOR:=$(tput colors 2> /dev/null)}" -ge 8 ]] [[ -t 1 && "${_bash_it_available_colors:=$(tput colors 2> /dev/null)}" -ge 8 ]]
} }
function _bash-it-log-message() { function _bash-it-log-message() {

View File

@ -24,7 +24,7 @@ function _bash-it-preview() {
# shellcheck disable=SC2034 # shellcheck disable=SC2034
for BASH_IT_THEME in "${themes[@]}"; do for BASH_IT_THEME in "${themes[@]}"; do
BASH_IT_LOG_LEVEL=0 BASH_IT_LOG_LEVEL=0
bash --init-file "${BASH_IT?}/bash_it.sh" -i <<< '_bash-it-flash-term "${#BASH_IT_THEME}" "${BASH_IT_THEME}"' bash --init-file "${BASH_IT_BASHRC:-${BASH_IT?}/bash_it.sh}" -i <<< '_bash-it-flash-term "${#BASH_IT_THEME}" "${BASH_IT_THEME}"'
done done
} }

View File

@ -347,7 +347,7 @@ function _bash-it-flash-term() {
local -i len="${1:-0}" # redundant local -i len="${1:-0}" # redundant
local term="${2:-}" local term="${2:-}"
# as currently implemented, `$match` has already been printed to screen the first time # as currently implemented, `$match` has already been printed to screen the first time
local delay=0.2 local delay=0.1
local color local color
[[ "${#term}" -gt 0 ]] && len="${#term}" [[ "${#term}" -gt 0 ]] && len="${#term}"

View File

@ -60,21 +60,15 @@ function _bash-it-array-dedup() {
printf '%s\n' "$@" | sort -u printf '%s\n' "$@" | sort -u
} }
# Runs `grep` with *just* the provided arguments # Outputs a full path of the grep found on the filesystem
function _bash-it-grep() { function _bash-it-grep() {
: "${BASH_IT_GREP:=$(type -P grep)}" : "${BASH_IT_GREP:=$(type -p egrep || type -p grep)}"
"${BASH_IT_GREP:-/usr/bin/grep}" "$@" printf "%s" "${BASH_IT_GREP:-/usr/bin/grep}"
} }
# Runs `grep` with fixed-string expressions (-F) # Runs `grep` with extended regular expressions
function _bash-it-fgrep() {
: "${BASH_IT_GREP:=$(type -P grep)}"
"${BASH_IT_GREP:-/usr/bin/grep}" -F "$@"
}
# Runs `grep` with extended regular expressions (-E)
function _bash-it-egrep() { function _bash-it-egrep() {
: "${BASH_IT_GREP:=$(type -P grep)}" : "${BASH_IT_GREP:=$(type -p egrep || type -p grep)}"
"${BASH_IT_GREP:-/usr/bin/grep}" -E "$@" "${BASH_IT_GREP:-/usr/bin/grep}" -E "$@"
} }
@ -156,12 +150,12 @@ function _bash-it-component-list-matching() {
function _bash-it-component-list-enabled() { function _bash-it-component-list-enabled() {
local IFS=$'\n' component="$1" local IFS=$'\n' component="$1"
_bash-it-component-help "${component}" | _bash-it-fgrep '[x]' | awk '{print $1}' | sort -u _bash-it-component-help "${component}" | _bash-it-egrep '\[x\]' | awk '{print $1}' | sort -u
} }
function _bash-it-component-list-disabled() { function _bash-it-component-list-disabled() {
local IFS=$'\n' component="$1" local IFS=$'\n' component="$1"
_bash-it-component-help "${component}" | _bash-it-fgrep -v '[x]' | awk '{print $1}' | sort -u _bash-it-component-help "${component}" | _bash-it-egrep -v '\[x\]' | awk '{print $1}' | sort -u
} }
# Checks if a given item is enabled for a particular component/file-type. # Checks if a given item is enabled for a particular component/file-type.

View File

@ -8,8 +8,8 @@
# shellcheck disable=SC2002 # Prefer 'cat' for cleaner script # shellcheck disable=SC2002 # Prefer 'cat' for cleaner script
mapfile -t FILES < <( mapfile -t FILES < <(
cat clean_files.txt \ cat clean_files.txt \
| grep -E -v '^\s*$' \ | grep -v -E '^\s*$' \
| grep -E -v '^\s*#' \ | grep -v -E '^\s*#' \
| xargs -n1 -I{} find "{}" -type f | xargs -n1 -I{} find "{}" -type f
) )

View File

@ -1,4 +1,3 @@
# shellcheck shell=bash
cite about-plugin cite about-plugin
about-plugin 'AWS helper functions' about-plugin 'AWS helper functions'
@ -41,13 +40,13 @@ function __awskeys_help {
function __awskeys_get { function __awskeys_get {
local ln=$(grep -n "\[ *$1 *\]" "${AWS_SHARED_CREDENTIALS_FILE}" | cut -d ":" -f 1) local ln=$(grep -n "\[ *$1 *\]" "${AWS_SHARED_CREDENTIALS_FILE}" | cut -d ":" -f 1)
if [[ -n "${ln}" ]]; then if [[ -n "${ln}" ]]; then
tail -n +${ln} "${AWS_SHARED_CREDENTIALS_FILE}" | grep -F -m 2 -e "aws_access_key_id" -e "aws_secret_access_key" tail -n +${ln} "${AWS_SHARED_CREDENTIALS_FILE}" | egrep -m 2 "aws_access_key_id|aws_secret_access_key"
tail -n +${ln} "${AWS_SHARED_CREDENTIALS_FILE}" | grep -F -m 1 "aws_session_token" tail -n +${ln} "${AWS_SHARED_CREDENTIALS_FILE}" | egrep -m 1 "aws_session_token"
fi fi
} }
function __awskeys_list { function __awskeys_list {
local credentials_list="$((grep -E '^\[ *[a-zA-Z0-9_-]+ *\]$' "${AWS_SHARED_CREDENTIALS_FILE}"; grep "\[profile" "${AWS_CONFIG_FILE}" | sed "s|\[profile |\[|g") | sort | uniq)" local credentials_list="$((egrep '^\[ *[a-zA-Z0-9_-]+ *\]$' "${AWS_SHARED_CREDENTIALS_FILE}"; grep "\[profile" "${AWS_CONFIG_FILE}" | sed "s|\[profile |\[|g") | sort | uniq)"
if [[ -n $"{credentials_list}" ]]; then if [[ -n $"{credentials_list}" ]]; then
echo -e "Available credentials profiles:\n" echo -e "Available credentials profiles:\n"
for profile in ${credentials_list}; do for profile in ${credentials_list}; do

View File

@ -4,8 +4,8 @@ about-plugin 'display info about your battery charge level'
function ac_adapter_connected() { function ac_adapter_connected() {
local batteries local batteries
if _command_exists upower; then if _command_exists upower; then
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT) batteries="$(upower -e | grep --max-count=1 -i BAT)"
upower -i "${batteries[0]:-}" | grep 'state' | grep -q 'charging\|fully-charged' upower -i "${batteries}" | grep 'state' | grep -q 'charging\|fully-charged'
elif _command_exists acpi; then elif _command_exists acpi; then
acpi -a | grep -q "on-line" acpi -a | grep -q "on-line"
elif _command_exists pmset; then elif _command_exists pmset; then
@ -20,8 +20,8 @@ function ac_adapter_connected() {
function ac_adapter_disconnected() { function ac_adapter_disconnected() {
local batteries local batteries
if _command_exists upower; then if _command_exists upower; then
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT) batteries="$(upower -e | grep --max-count=1 -i BAT)"
upower -i "${batteries[0]:-}" | grep 'state' | grep -q 'discharging' upower -i "${batteries}" | grep 'state' | grep -q 'discharging'
elif _command_exists acpi; then elif _command_exists acpi; then
acpi -a | grep -q "off-line" acpi -a | grep -q "off-line"
elif _command_exists pmset; then elif _command_exists pmset; then
@ -40,8 +40,8 @@ function battery_percentage() {
local command_output batteries local command_output batteries
if _command_exists upower; then if _command_exists upower; then
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT) batteries="$(upower --enumerate | grep --max-count=1 -i BAT)"
command_output="$(upower --show-info "${batteries[0]:-}" | grep percentage | grep -o '[0-9]\+' | head -1)" command_output="$(upower --show-info "${batteries:-}" | grep percentage | grep -o '[0-9]\+' | head -1)"
elif _command_exists acpi; then elif _command_exists acpi; then
command_output=$(acpi -b | awk -F, '/,/{gsub(/ /, "", $0); gsub(/%/,"", $0); print $2}') command_output=$(acpi -b | awk -F, '/,/{gsub(/ /, "", $0); gsub(/%/,"", $0); print $2}')
elif _command_exists pmset; then elif _command_exists pmset; then

View File

@ -2,16 +2,15 @@
cite about-plugin cite about-plugin
about-plugin 'Alert (BEL) when process ends after a threshold of seconds' about-plugin 'Alert (BEL) when process ends after a threshold of seconds'
function precmd_return_notification() { precmd_return_notification() {
local command_start="${COMMAND_DURATION_START_SECONDS:=0}" export LAST_COMMAND_DURATION=$(($(date +%s) - ${LAST_COMMAND_TIME:=$(date +%s)}))
local current_time [[ ${LAST_COMMAND_DURATION} -gt ${NOTIFY_IF_COMMAND_RETURNS_AFTER:-5} ]] && echo -e "\a"
current_time="$(_shell_duration_en)" export LAST_COMMAND_TIME=
local -i command_duration="$((${current_time%.*} - ${command_start%.*}))"
if [[ "${command_duration}" -gt "${NOTIFY_IF_COMMAND_RETURNS_AFTER:-5}" ]]; then
printf '\a'
fi
return 0
} }
safe_append_prompt_command 'precmd_return_notification' preexec_return_notification() {
safe_append_preexec '_command_duration_pre_exec' [[ -z "${LAST_COMMAND_TIME}" ]] && LAST_COMMAND_TIME=$(date +%s)
}
precmd_functions+=(precmd_return_notification)
preexec_functions+=(preexec_return_notification)

View File

@ -8,13 +8,13 @@ function __() {
function __make_ansi() { function __make_ansi() {
next=$1 next=$1
shift shift
echo -e "\[\e[$("__$next" "$@")m\]" echo "\[\e[$("__$next" "$@")m\]"
} }
function __make_echo() { function __make_echo() {
next=$1 next=$1
shift shift
echo -e "\033[$("__$next" "$@")m" echo "\033[$("__$next" "$@")m"
} }
function __reset() { function __reset() {

View File

@ -63,15 +63,12 @@ function dirs-help() {
if [[ -f "${BASH_IT_DIRS_BKS?}" ]]; then if [[ -f "${BASH_IT_DIRS_BKS?}" ]]; then
# shellcheck disable=SC1090 # shellcheck disable=SC1090
source "${BASH_IT_DIRS_BKS?}" source "${BASH_IT_DIRS_BKS?}"
elif [[ -f ~/.dirs ]]; then
mv -vn ~/.dirs "${BASH_IT_DIRS_BKS?}"
# shellcheck disable=SC1090
source "${BASH_IT_DIRS_BKS?}"
else else
mkdir -p "${BASH_IT_DIRS_BKS%/*}" touch "${BASH_IT_DIRS_BKS?}"
if [[ -f ~/.dirs ]]; then
mv -vn ~/.dirs "${BASH_IT_DIRS_BKS?}"
# shellcheck disable=SC1090
source "${BASH_IT_DIRS_BKS?}"
else
touch "${BASH_IT_DIRS_BKS?}"
fi
fi fi
alias L='cat "${BASH_IT_DIRS_BKS?}"' alias L='cat "${BASH_IT_DIRS_BKS?}"'

View File

@ -30,8 +30,8 @@ function editpost() {
pushd "${SITE}/_posts" > /dev/null || return pushd "${SITE}/_posts" > /dev/null || return
for POST in *; do for POST in *; do
DATE="$(echo "${POST}" | grep -E -o "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}")" DATE="$(echo "${POST}" | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}")"
TITLE="$(grep -E -o "title: (.+)" < "${POST}")" TITLE="$(grep -oE "title: (.+)" < "${POST}")"
TITLE="${TITLE/title: /}" TITLE="${TITLE/title: /}"
echo "${COUNTER}) ${DATE} ${TITLE}" echo "${COUNTER}) ${DATE} ${TITLE}"
POSTS[COUNTER]="$POST" POSTS[COUNTER]="$POST"

View File

@ -1,4 +1,3 @@
# shellcheck shell=bash
cite about-plugin cite about-plugin
about-plugin 'postgres helper functions' about-plugin 'postgres helper functions'
@ -51,7 +50,7 @@ function postgres_status {
function is_postgres_running { function is_postgres_running {
$POSTGRES_BIN/pg_ctl -D $PGDATA status | grep -F -o "no server running" $POSTGRES_BIN/pg_ctl -D $PGDATA status | egrep -o "no server running"
} }

View File

@ -21,7 +21,7 @@ function pj() {
# with the same name in project directories # with the same name in project directories
IFS=':' read -ra dests <<< "${BASH_IT_PROJECT_PATHS?${FUNCNAME[0]}: project working folders must be configured}" IFS=':' read -ra dests <<< "${BASH_IT_PROJECT_PATHS?${FUNCNAME[0]}: project working folders must be configured}"
for d in "${!dests[@]}"; do for d in "${!dests[@]}"; do
if [[ ! -d "${dests[d]}/${proj}" ]]; then if [[ ! -d "${dests[d]}" ]]; then
unset 'dests[d]' unset 'dests[d]'
fi fi
done done

View File

@ -1,11 +1,19 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
function local_setup {
setup_test_fixture
function local_setup_file() {
# Copy the test fixture to the Bash-it folder # Copy the test fixture to the Bash-it folder
cp -fRP "${BASH_IT?}/test/fixtures/bash_it"/* "${BASH_IT?}/" || true if command -v rsync &> /dev/null
# don't load any libraries as the tests here test the *whole* kit then
rsync -a "$BASH_IT/test/fixtures/bash_it/" "$BASH_IT/"
else
find "$BASH_IT/test/fixtures/bash_it" \
-mindepth 1 -maxdepth 1 \
-exec cp -r {} "$BASH_IT/" \;
fi
} }
@test "bash-it: verify that the test fixture is available" { @test "bash-it: verify that the test fixture is available" {

View File

@ -1,30 +1,28 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { # Load something, anything...
setup_libs "helpers" load ../../completion/available/capistrano.completion
# Load something, anything...
load ../../completion/available/capistrano.completion
}
@test "alias-completion: See that aliases with double quotes and brackets do not break the plugin" { @test "alias-completion: See that aliases with double quotes and brackets do not break the plugin" {
alias gtest="git log --graph --pretty=format:'%C(bold)%h%Creset%C(magenta)%d%Creset %s %C(yellow)<%an> %C(cyan)(%cr)%Creset' --abbrev-commit --date=relative" alias gtest="git log --graph --pretty=format:'%C(bold)%h%Creset%C(magenta)%d%Creset %s %C(yellow)<%an> %C(cyan)(%cr)%Creset' --abbrev-commit --date=relative"
run load "${BASH_IT?}/completion/available/aliases.completion.bash" run load ../../completion/available/aliases.completion
assert_success assert_success
} }
@test "alias-completion: See that aliases with single quotes and brackets do not break the plugin" { @test "alias-completion: See that aliases with single quotes and brackets do not break the plugin" {
alias gtest='git log --graph --pretty=format:"%C(bold)%h%Creset%C(magenta)%d%Creset %s %C(yellow)<%an> %C(cyan)(%cr)%Creset" --abbrev-commit --date=relative' alias gtest='git log --graph --pretty=format:"%C(bold)%h%Creset%C(magenta)%d%Creset %s %C(yellow)<%an> %C(cyan)(%cr)%Creset" --abbrev-commit --date=relative'
run load "${BASH_IT?}/completion/available/aliases.completion.bash" run load ../../completion/available/aliases.completion
assert_success assert_success
} }
@test "alias-completion: See that having aliased rm command does not output unnecessary output" { @test "alias-completion: See that having aliased rm command does not output unnecessary output" {
alias rm='rm -v' alias rm='rm -v'
run load "${BASH_IT?}/completion/available/aliases.completion.bash" run load ../../completion/available/aliases.completion
refute_output refute_output
} }

View File

@ -1,16 +1,17 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../../lib/utilities
load ../../lib/helpers
load ../../completion/available/bash-it.completion
function local_setup_file() { function local_setup {
setup_libs "helpers" setup_test_fixture
load "${BASH_IT?}/completion/available/bash-it.completion.bash"
} }
@test "completion bash-it: ensure that the _bash-it function is available" { @test "completion bash-it: ensure that the _bash-it function is available" {
run type -t _bash-it type -a _bash-it &> /dev/null
assert_success assert_success
assert_output "function"
} }
function __check_completion () { function __check_completion () {

View File

@ -1,22 +1,19 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
function local_setup() { # Determine which config file to use based on OS.
export HOME="$BATS_TEST_TMPDIR" case $OSTYPE in
} darwin*)
export BASH_IT_CONFIG_FILE=.bash_profile
;;
*)
export BASH_IT_CONFIG_FILE=.bashrc
;;
esac
function local_setup_file() { function local_setup {
# Determine which config file to use based on OS. setup_test_fixture
case $OSTYPE in
darwin*)
export BASH_IT_CONFIG_FILE=.bash_profile
;;
*)
export BASH_IT_CONFIG_FILE=.bashrc
;;
esac
# don't load any libraries as the tests here test the *whole* kit
} }
@test "install: verify that the install script exists" { @test "install: verify that the install script exists" {
@ -28,7 +25,7 @@ function local_setup_file() {
./install.sh --silent ./install.sh --silent
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
assert_link_exist "$BASH_IT/enabled/150---general.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---general.aliases.bash"
assert_link_exist "$BASH_IT/enabled/250---base.plugin.bash" assert_link_exist "$BASH_IT/enabled/250---base.plugin.bash"
@ -40,16 +37,16 @@ function local_setup_file() {
@test "install: verify that a backup file is created" { @test "install: verify that a backup file is created" {
cd "$BASH_IT" cd "$BASH_IT"
touch "$HOME/$BASH_IT_CONFIG_FILE" touch "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
echo "test file content" > "$HOME/$BASH_IT_CONFIG_FILE" echo "test file content" > "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
local md5_orig=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}') local md5_orig=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}')
./install.sh --silent ./install.sh --silent
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE.bak" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak"
local md5_bak=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE.bak" | awk '{print $1}') local md5_bak=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak" | awk '{print $1}')
assert_equal "$md5_orig" "$md5_bak" assert_equal "$md5_orig" "$md5_bak"
} }
@ -73,15 +70,15 @@ function local_setup_file() {
@test "install: verify that the template is appended" { @test "install: verify that the template is appended" {
cd "$BASH_IT" cd "$BASH_IT"
touch "$HOME/$BASH_IT_CONFIG_FILE" touch "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
echo "test file content" > "$HOME/$BASH_IT_CONFIG_FILE" echo "test file content" > "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
./install.sh --silent --append-to-config ./install.sh --silent --append-to-config
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE.bak" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak"
run cat "$HOME/$BASH_IT_CONFIG_FILE" run cat $BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE
assert_line "test file content" assert_line "test file content"
assert_line "source \"\$BASH_IT\"/bash_it.sh" assert_line "source \"\$BASH_IT\"/bash_it.sh"

View File

@ -1,22 +1,19 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
function local_setup() { # Determine which config file to use based on OS.
export HOME="$BATS_TEST_TMPDIR" case $OSTYPE in
} darwin*)
export BASH_IT_CONFIG_FILE=.bash_profile
;;
*)
export BASH_IT_CONFIG_FILE=.bashrc
;;
esac
function local_setup_file() { function local_setup {
# Determine which config file to use based on OS. setup_test_fixture
case $OSTYPE in
darwin*)
export BASH_IT_CONFIG_FILE=.bash_profile
;;
*)
export BASH_IT_CONFIG_FILE=.bashrc
;;
esac
# don't load any libraries as the tests here test the *whole* kit
} }
@test "uninstall: verify that the uninstall script exists" { @test "uninstall: verify that the uninstall script exists" {
@ -26,18 +23,19 @@ function local_setup_file() {
@test "uninstall: run the uninstall script with an existing backup file" { @test "uninstall: run the uninstall script with an existing backup file" {
cd "$BASH_IT" cd "$BASH_IT"
echo "test file content for backup" > "$HOME/$BASH_IT_CONFIG_FILE.bak" echo "test file content for backup" > "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak"
echo "test file content for original file" > "$HOME/$BASH_IT_CONFIG_FILE" echo "test file content for original file" > "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
local md5_bak=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE.bak" | awk '{print $1}') local md5_bak=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak" | awk '{print $1}')
./uninstall.sh
run ./uninstall.sh
assert_success assert_success
assert_file_not_exist "$HOME/$BASH_IT_CONFIG_FILE.uninstall" assert_file_not_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.uninstall"
assert_file_not_exist "$HOME/$BASH_IT_CONFIG_FILE.bak" assert_file_not_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak"
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
local md5_conf=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}') local md5_conf=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}')
assert_equal "$md5_bak" "$md5_conf" assert_equal "$md5_bak" "$md5_conf"
} }
@ -45,17 +43,18 @@ function local_setup_file() {
@test "uninstall: run the uninstall script without an existing backup file" { @test "uninstall: run the uninstall script without an existing backup file" {
cd "$BASH_IT" cd "$BASH_IT"
echo "test file content for original file" > "$HOME/$BASH_IT_CONFIG_FILE" echo "test file content for original file" > "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
local md5_orig=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}') local md5_orig=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE" | awk '{print $1}')
./uninstall.sh
run ./uninstall.sh
assert_success assert_success
assert_file_exist "$HOME/$BASH_IT_CONFIG_FILE.uninstall" assert_file_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.uninstall"
assert_file_not_exist "$HOME/$BASH_IT_CONFIG_FILE.bak" assert_file_not_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.bak"
assert_file_not_exist "$HOME/$BASH_IT_CONFIG_FILE" assert_file_not_exist "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE"
local md5_uninstall=$(md5sum "$HOME/$BASH_IT_CONFIG_FILE.uninstall" | awk '{print $1}') local md5_uninstall=$(md5sum "$BASH_IT_TEST_HOME/$BASH_IT_CONFIG_FILE.uninstall" | awk '{print $1}')
assert_equal "$md5_orig" "$md5_uninstall" assert_equal "$md5_orig" "$md5_uninstall"
} }

View File

@ -1,11 +1,6 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
function local_setup_file() {
true
# don't load any libraries as the tests here test the *whole* kit
}
@test "lib composure: _composure_keywords()" { @test "lib composure: _composure_keywords()" {
run _composure_keywords run _composure_keywords

22
test/lib/helpers.bats 100644 → 100755
View File

@ -1,15 +1,21 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
load ../../plugins/available/base.plugin
load ../../lib/colors
function local_setup_file() { function local_setup {
setup_libs "colors" setup_test_fixture
load "${BASH_IT?}/plugins/available/base.plugin.bash"
}
function local_setup() {
# Copy the test fixture to the Bash-it folder # Copy the test fixture to the Bash-it folder
cp -RP "$BASH_IT/test/fixtures/bash_it"/* "$BASH_IT/" if command -v rsync &> /dev/null; then
rsync -a "$BASH_IT/test/fixtures/bash_it/" "$BASH_IT/"
else
find "$BASH_IT/test/fixtures/bash_it" \
-mindepth 1 -maxdepth 1 \
-exec cp -r {} "$BASH_IT/" \;
fi
} }
# TODO Create global __is_enabled function # TODO Create global __is_enabled function

View File

@ -1,10 +1,11 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../../lib/colors
function local_setup_file() { load ../../lib/log
setup_libs "log" load ../../lib/helpers
} load ../../plugins/available/base.plugin
@test "lib log: basic debug logging with BASH_IT_LOG_LEVEL_ALL" { @test "lib log: basic debug logging with BASH_IT_LOG_LEVEL_ALL" {
BASH_IT_LOG_LEVEL=$BASH_IT_LOG_LEVEL_ALL BASH_IT_LOG_LEVEL=$BASH_IT_LOG_LEVEL_ALL

View File

@ -111,7 +111,7 @@ function local_setup {
@test "lib preexec: __check_precmd_conflict()" { @test "lib preexec: __check_precmd_conflict()" {
test_precmd_function_name="test" test_precmd_function_name="test"
setup_libs "preexec" load ../test_helper_libs
run __check_precmd_conflict "$test_precmd_function_name" run __check_precmd_conflict "$test_precmd_function_name"
assert_failure assert_failure
@ -124,7 +124,7 @@ function local_setup {
@test "lib preexec: __check_preexec_conflict()" { @test "lib preexec: __check_preexec_conflict()" {
test_preexec_function_name="test" test_preexec_function_name="test"
setup_libs "preexec" load ../test_helper_libs
run __check_preexec_conflict "$test_preexec_function_name" run __check_preexec_conflict "$test_preexec_function_name"
assert_failure assert_failure
@ -137,7 +137,7 @@ function local_setup {
@test "lib preexec: safe_append_prompt_command()" { @test "lib preexec: safe_append_prompt_command()" {
test_precmd_function_name="test" test_precmd_function_name="test"
setup_libs "preexec" load ../test_helper_libs
export precmd_functions=() export precmd_functions=()
assert_equal "${precmd_functions[*]}" "" assert_equal "${precmd_functions[*]}" ""
@ -151,7 +151,7 @@ function local_setup {
@test "lib preexec: safe_append_preexec()" { @test "lib preexec: safe_append_preexec()" {
test_preexec_function_name="test" test_preexec_function_name="test"
setup_libs "preexec" load ../test_helper_libs
export preexec_functions=() export preexec_functions=()
assert_equal "${preexec_functions[*]}" "" assert_equal "${preexec_functions[*]}" ""

28
test/lib/search.bats 100644 → 100755
View File

@ -1,14 +1,28 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../plugins/available/base.plugin
setup_libs "search" load ../../aliases/available/git.aliases
load ../../plugins/available/ruby.plugin
load ../../plugins/available/rails.plugin
load ../../completion/available/bundler.completion
load ../../completion/available/gem.completion
load ../../completion/available/rake.completion
load ../../lib/helpers
function local_setup {
setup_test_fixture
export OLD_PATH="$PATH"
export PATH="/usr/bin:/bin:/usr/sbin"
} }
function local_setup() { function local_teardown {
# shellcheck disable=SC2034 export PATH="$OLD_PATH"
BASH_IT_SEARCH_USE_COLOR=false unset OLD_PATH
} }
@test "search: plugin base" { @test "search: plugin base" {

View File

@ -1,9 +1,10 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { function local_setup {
setup_libs "helpers" setup_test_fixture
} }
@test "_bash-it-component-item-is-enabled() - for a disabled item" { @test "_bash-it-component-item-is-enabled() - for a disabled item" {

35
test/plugins/base.plugin.bats 100644 → 100755
View File

@ -1,13 +1,14 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../plugins/available/base.plugin
setup_libs "helpers"
load "${BASH_IT?}/plugins/available/base.plugin.bash"
}
@test 'plugins base: ips()' { @test 'plugins base: ips()' {
if [[ $CI ]]; then
skip 'ifconfig probably requires sudo on TravisCI'
fi
declare -r localhost='127.0.0.1' declare -r localhost='127.0.0.1'
run ips run ips
assert_success assert_success
@ -22,7 +23,7 @@ function local_setup_file() {
} }
@test 'plugins base: pickfrom()' { @test 'plugins base: pickfrom()' {
stub_file="${BATS_TEST_TMPDIR}/stub_file" stub_file="${BASH_IT_ROOT}/stub_file"
printf "l1\nl2\nl3" > $stub_file printf "l1\nl2\nl3" > $stub_file
run pickfrom $stub_file run pickfrom $stub_file
assert_success assert_success
@ -30,30 +31,28 @@ function local_setup_file() {
} }
@test 'plugins base: mkcd()' { @test 'plugins base: mkcd()' {
cd "${BATS_TEST_TMPDIR}" cd "${BASH_IT_ROOT}"
declare -r dir_name="-dir_with_dash" declare -r dir_name="-dir_with_dash"
# Make sure that the directory does not exist prior to the test # Make sure that the directory does not exist prior to the test
rm -rf "${BATS_TEST_TMPDIR}/${dir_name}" rm -rf "${BASH_IT_ROOT}/${dir_name}"
run mkcd "${dir_name}"
assert_success
assert_dir_exist "${BATS_TEST_TMPDIR}/${dir_name}"
mkcd "${dir_name}" mkcd "${dir_name}"
assert_equal "${PWD}" "${BATS_TEST_TMPDIR//\/\///}/${dir_name}" assert_success
assert_dir_exist "${BASH_IT_ROOT}/${dir_name}"
assert_equal "${PWD}" "${BASH_IT_ROOT//\/\///}/${dir_name}"
} }
@test 'plugins base: lsgrep()' { @test 'plugins base: lsgrep()' {
for i in 1 2 3; do mkdir -p "${BASH_IT}/${i}"; done for i in 1 2 3; do mkdir -p "${BASH_IT_TEST_DIR}/${i}"; done
cd $BASH_IT cd $BASH_IT_TEST_DIR
run lsgrep 2 run lsgrep 2
assert_success assert_success
assert_equal $output 2 assert_equal $output 2
} }
@test 'plugins base: buf()' { @test 'plugins base: buf()' {
declare -r file="${BATS_TEST_TMPDIR}/file" declare -r file="${BASH_IT_ROOT}/file"
touch $file touch $file
# Take one timestamp before running the `buf` function # Take one timestamp before running the `buf` function

13
test/plugins/battery.plugin.bats 100644 → 100755
View File

@ -1,11 +1,9 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../plugins/available/battery.plugin
setup_libs "helpers"
load "${BASH_IT?}/plugins/available/battery.plugin.bash"
}
# Sets up the `_command_exists` function so that it only responds `true` if called with # Sets up the `_command_exists` function so that it only responds `true` if called with
# the name of the function that was passed in as an argument to `setup_command_exists`. # the name of the function that was passed in as an argument to `setup_command_exists`.
@ -201,7 +199,8 @@ function setup_upower {
function upower { function upower {
case $1 in case $1 in
'-e'|'--enumerate') '-e'|'--enumerate')
printf '%s\n' "$BAT0" "/org/freedesktop/UPower/devices/mouse_hid_${RANDOM}_battery" # don't just `echo` twice because `grep` will close the pipe after matching the first line...
echo "$BAT0"$'\n'"/org/freedesktop/UPower/devices/mouse_hid_${RANDOM}_battery"
;; ;;
'-i'|'--show-info') '-i'|'--show-info')
if [[ $2 == "$BAT0" ]] if [[ $2 == "$BAT0" ]]

View File

@ -1,41 +1,46 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../plugins/available/cmd-returned-notify.plugin
setup_libs "command_duration"
load "${BASH_IT?}/plugins/available/cmd-returned-notify.plugin.bash"
}
@test "plugins cmd-returned-notify: notify after elapsed time" { @test "plugins cmd-returned-notify: notify after elapsed time" {
export NOTIFY_IF_COMMAND_RETURNS_AFTER=0 export NOTIFY_IF_COMMAND_RETURNS_AFTER=0
export COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)" export LAST_COMMAND_TIME=$(date +%s)
sleep 1 sleep 1
run precmd_return_notification run precmd_return_notification
assert_success assert_success
assert_output $'\a' assert_output $'\a'
} }
@test "plugins cmd-returned-notify: do not notify before elapsed time" { @test "plugins cmd-returned-notify: do not notify before elapsed time" {
export NOTIFY_IF_COMMAND_RETURNS_AFTER=10 export NOTIFY_IF_COMMAND_RETURNS_AFTER=10
export COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)" export LAST_COMMAND_TIME=$(date +%s)
sleep 1 sleep 1
run precmd_return_notification run precmd_return_notification
assert_success assert_success
assert_output $'' assert_output $''
} }
@test "lib command_duration: preexec no output" { @test "plugins cmd-returned-notify: preexec no output" {
export COMMAND_DURATION_START_SECONDS= export LAST_COMMAND_TIME=
run _command_duration_pre_exec run preexec_return_notification
assert_success assert_success
assert_output "" assert_output ""
} }
@test "lib command_duration: preexec set COMMAND_DURATION_START_SECONDS" {
export COMMAND_DURATION_START_SECONDS= @test "plugins cmd-returned-notify: preexec no output env set" {
assert_equal "${COMMAND_DURATION_START_SECONDS}" "" export LAST_COMMAND_TIME=$(date +%s)
NOW="$(_shell_duration_en)" run preexec_return_notification
_command_duration_pre_exec assert_failure
# We need to make sure to account for nanoseconds... assert_output ""
assert_equal "${COMMAND_DURATION_START_SECONDS%.*}" "${NOW%.*}" }
@test "plugins cmd-returned-notify: preexec set LAST_COMMAND_TIME" {
export LAST_COMMAND_TIME=
assert_equal "${LAST_COMMAND_TIME}" ""
NOW=$(date +%s)
preexec_return_notification
assert_equal "${LAST_COMMAND_TIME}" "${NOW}"
} }

View File

@ -1,9 +1,11 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { function local_setup()
setup_libs "helpers" {
setup_test_fixture
} }
function setup_go_path() function setup_go_path()

27
test/plugins/ruby.plugin.bats 100644 → 100755
View File

@ -1,15 +1,24 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { function local_setup {
setup_libs "helpers" setup_test_fixture
_command_exists "ruby" && mkdir -p "$(ruby -e 'print Gem.user_dir')/bin"
export OLD_PATH="$PATH"
export PATH="/usr/bin:/bin:/usr/sbin"
}
function local_teardown {
export PATH="$OLD_PATH"
unset OLD_PATH
} }
@test "plugins ruby: remove_gem is defined" { @test "plugins ruby: remove_gem is defined" {
run load "${BASH_IT?}/plugins/available/ruby.plugin.bash" load ../../plugins/available/ruby.plugin
assert_success
load "${BASH_IT?}/plugins/available/ruby.plugin.bash"
run type remove_gem run type remove_gem
assert_line -n 1 "remove_gem () " assert_line -n 1 "remove_gem () "
@ -22,9 +31,7 @@ function local_setup_file() {
mkdir -p "$(ruby -e 'print Gem.user_dir')/bin" mkdir -p "$(ruby -e 'print Gem.user_dir')/bin"
run load "${BASH_IT?}/plugins/available/ruby.plugin.bash" load ../../plugins/available/ruby.plugin
assert_success
load "${BASH_IT?}/plugins/available/ruby.plugin.bash"
local last_path_entry="$(tail -1 <<<"${PATH//:/$'\n'}")" local last_path_entry="$(tail -1 <<<"${PATH//:/$'\n'}")"
[[ "${last_path_entry}" == "$(ruby -e 'print Gem.user_dir')/bin" ]] [[ "${last_path_entry}" == "$(ruby -e 'print Gem.user_dir')/bin" ]]

View File

@ -1,10 +1,21 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../plugins/available/xterm.plugin
setup_libs "helpers"
load "${BASH_IT?}/plugins/available/xterm.plugin.bash" function local_setup {
setup_test_fixture
# Copy the test fixture to the Bash-it folder
if _command_exists rsync; then
rsync -a "$BASH_IT/test/fixtures/plugin/xterm/" "$BASH_IT/"
else
find "$BASH_IT/test/fixtures/plugin/xterm" \
-mindepth 1 -maxdepth 1 \
-exec cp -r {} "$BASH_IT/" \;
fi
} }
@test "plugins xterm: shorten command output" { @test "plugins xterm: shorten command output" {

View File

@ -2,23 +2,17 @@
test_directory="$(cd "$(dirname "$0")" && pwd)" test_directory="$(cd "$(dirname "$0")" && pwd)"
bats_executable="${test_directory}/../test_lib/bats-core/bin/bats" bats_executable="${test_directory}/../test_lib/bats-core/bin/bats"
# Locate ourselves for easy reference.
export MAIN_BASH_IT_DIR="${test_directory%/*}"
export MAIN_BASH_IT_GITDIR="${MAIN_BASH_IT_DIR}/.git"
# Make sure BATS is available:
git submodule init && git submodule update git submodule init && git submodule update
# Warn user that tests run from the current git HEAD if [[ -z "${BASH_IT}" ]]; then
if ! git diff --quiet; then BASH_IT="$(cd "${test_directory}" && dirname "${PWD}")"
echo "${BASH_SOURCE##*/}: your worktree is dirty; uncommitted changes will *not* be tested!" export BASH_IT
fi fi
# Which tests do we run? if [[ -z "$1" ]]; then
if [[ $# -eq '0' ]]; then
test_dirs=("${test_directory}"/{bash_it,completion,install,lib,plugins,themes}) test_dirs=("${test_directory}"/{bash_it,completion,install,lib,plugins,themes})
else else
test_dirs=("$@") test_dirs=("$1")
fi fi
# Make sure that the `parallel` command is installed, # Make sure that the `parallel` command is installed,
@ -44,8 +38,8 @@ if command -v parallel &> /dev/null \
fi fi
)" )"
exec "$bats_executable" "${CI:+--tap}" --jobs "${test_jobs_effective}" \ exec "$bats_executable" "${CI:+--tap}" --jobs "${test_jobs_effective}" \
--no-parallelize-within-files "${test_dirs[@]}" "${test_dirs[@]}"
else else
# Run `bats` in single-threaded mode. # Run `bats` in single-threaded mode.
exec "$bats_executable" "${CI:+--tap}" "${test_dirs[@]}" exec "$bats_executable" ${CI:+--tap} "${test_dirs[@]}"
fi fi

180
test/test_helper.bash 100644 → 100755
View File

@ -1,117 +1,105 @@
# shellcheck shell=bash #!/usr/bin/env bats
load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
function setup_file() { unset BASH_IT_THEME
common_setup_file unset GIT_HOSTING
unset NGINX_PATH
unset IRC_CLIENT
unset TODO
unset SCM_CHECK
unset BASH_IT_AUTOMATIC_RELOAD_AFTER_CONFIG_CHANGE
export TEST_MAIN_DIR="${BATS_TEST_DIRNAME}/.."
export TEST_DEPS_DIR="${TEST_DEPS_DIR-${TEST_MAIN_DIR}/../test_lib}"
# be independent of git's system configuration
export GIT_CONFIG_NOSYSTEM
load "${TEST_DEPS_DIR}/bats-support/load.bash"
load "${TEST_DEPS_DIR}/bats-assert/load.bash"
load "${TEST_DEPS_DIR}/bats-file/load.bash"
# support 'plumbing' metadata
cite _about _param _example _group _author _version
cite about-alias about-plugin about-completion
local_setup() {
true
} }
function common_setup_file() { local_teardown() {
# export *everything* to subshells, needed to support tests true
set -a }
# Locate ourselves for easy reference. # This function sets up a local test fixture, i.e. a completely
TEST_MAIN_DIR="${MAIN_BASH_IT_DIR:-${BATS_TEST_DIRNAME?}/../..}/test" # fresh and isolated Bash-it directory. This is done to avoid
TEST_DEPS_DIR="${MAIN_BASH_IT_DIR:-${TEST_MAIN_DIR}/..}/test_lib" # messing with your own Bash-it source directory.
# If you need this, call it in your .bats file's `local_setup` function.
setup_test_fixture() {
mkdir -p "$BASH_IT"
lib_directory="$(cd "$(dirname "$0")" && pwd)"
local src_topdir="$lib_directory/../../../.."
# Load the BATS modules we use: if command -v rsync &> /dev/null; then
load "${TEST_DEPS_DIR}/bats-support/load.bash" # Use rsync to copy Bash-it to the temp folder
load "${TEST_DEPS_DIR}/bats-assert/load.bash" rsync -qavrKL -d --delete-excluded --exclude=.git --exclude=helper.bash --exclude=enabled "$src_topdir" "$BASH_IT"
load "${TEST_DEPS_DIR}/bats-file/load.bash" else
rm -rf "$BASH_IT"
mkdir -p "$BASH_IT"
# shellcheck disable=SC2034 # Clear any inherited environment: find "$src_topdir" \
XDG_DUMMY="" BASH_IT_DUMMY="" # avoid possible invalid reference: -mindepth 1 -maxdepth 1 \
unset "${!XDG_@}" "${!BASH_IT@}" # unset all BASH_IT* and XDG_* variables -not -name .git \
unset GIT_HOSTING NGINX_PATH IRC_CLIENT TODO SCM_CHECK -exec cp -r {} "$BASH_IT" \;
fi
rm -rf "$BASH_IT"/enabled
rm -rf "$BASH_IT"/aliases/enabled
rm -rf "$BASH_IT"/completion/enabled
rm -rf "$BASH_IT"/plugins/enabled
mkdir -p "$BASH_IT"/enabled
mkdir -p "$BASH_IT"/aliases/enabled
mkdir -p "$BASH_IT"/completion/enabled
mkdir -p "$BASH_IT"/plugins/enabled
# Some tests use the BASH_IT_TEST_HOME variable, e.g. install/uninstall
export BASH_IT_TEST_HOME="$TEST_TEMP_DIR"
}
setup() {
# The `temp_make` function from "bats-file" requires the tralston/bats-file fork,
# since the original ztombol/bats-file's `temp_make` does not work on macOS.
TEST_TEMP_DIR="$(temp_make --prefix 'bash-it-test-')"
export TEST_TEMP_DIR
export BASH_IT_TEST_DIR="${TEST_TEMP_DIR}/.bash_it"
export BASH_IT_ROOT="${BASH_IT_TEST_DIR}/root"
export BASH_IT=$BASH_IT_TEST_DIR
mkdir -p -- "${BASH_IT_ROOT}"
# Some tools, e.g. `git` use configuration files from the $HOME directory, # Some tools, e.g. `git` use configuration files from the $HOME directory,
# which interferes with our tests. The only way to keep `git` from doing # which interferes with our tests. The only way to keep `git` from doing this
# this seems to set HOME explicitly to a separate location. # seems to set HOME explicitly to a separate location.
# Refer to https://git-scm.com/docs/git-config#FILES. # Refer to https://git-scm.com/docs/git-config#FILES.
readonly HOME="${BATS_SUITE_TMPDIR?}" unset XDG_CONFIG_HOME
export HOME="${TEST_TEMP_DIR}"
mkdir -p "${HOME}" mkdir -p "${HOME}"
# For `git` tests to run well, user name and email need to be set. # For `git` tests to run well, user name and email need to be set.
# Refer to https://git-scm.com/docs/git-commit#_commit_information. # Refer to https://git-scm.com/docs/git-commit#_commit_information.
# This goes to the test-specific config, due to the $HOME overridden above. # This goes to the test-specific config, due to the $HOME overridden above.
git config --global user.name "Bash It BATS Runner" git config --global user.name "John Doe"
git config --global user.email "bats@bash.it" git config --global user.email "johndoe@example.com"
git config --global advice.detachedHead false
git config --global init.defaultBranch "master"
# Locate the temporary folder, avoid double-slash.
BASH_IT="${BATS_FILE_TMPDIR//\/\///}/.bash_it"
# This sets up a local test fixture, i.e. a completely fresh and isolated Bash-it directory. This is done to avoid messing with your own Bash-it source directory.
git --git-dir="${MAIN_BASH_IT_GITDIR?}" worktree add -d "${BASH_IT}"
load "${BASH_IT?}/vendor/github.com/erichs/composure/composure.sh"
# support 'plumbing' metadata
cite _about _param _example _group _author _version
cite about-alias about-plugin about-completion
# Run any local test setup
local_setup_file
set +a # not needed, but symetiric!
}
# Load standard _Bash It_ libraries
function setup_libs() {
local lib
# Use a loop to allow convenient short-circuiting for some test files
for lib in "log" "utilities" "helpers" "search" "preexec" "colors" "command_duration"; do
load "${BASH_IT?}/lib/${lib}.bash" || return
# shellcheck disable=SC2015 # short-circuit if we've reached the requested library
[[ "${lib}" == "${1:-}" ]] && return 0 || true
done
return 0
}
function local_setup_file() {
true
}
function local_setup() {
true
}
function local_teardown() {
true
}
function clean_test_fixture() {
rm -rf "${BASH_IT_CONFIG?}/enabled"
rm -rf "${BASH_IT_CONFIG?}/aliases/enabled"
rm -rf "${BASH_IT_CONFIG?}/completion/enabled"
rm -rf "${BASH_IT_CONFIG?}/plugins/enabled"
rm -rf "${BASH_IT_CONFIG?}/tmp/cache"
rm -rf "${BASH_IT_CONFIG?}/profiles"/test*.bash_it
}
function setup_test_fixture() {
mkdir -p "${BASH_IT_CONFIG?}/enabled"
mkdir -p "${BASH_IT_CONFIG?}/aliases/enabled"
mkdir -p "${BASH_IT_CONFIG?}/completion/enabled"
mkdir -p "${BASH_IT_CONFIG?}/plugins/enabled"
}
function setup() {
# be independent of git's system configuration
export GIT_CONFIG_NOSYSTEM
# Locate the temporary folder:
BASH_IT_CONFIG="${BASH_IT?}" #"${BATS_TEST_TMPDIR//\/\///}"
export XDG_CACHE_HOME="${BATS_TEST_TMPDIR?}"
setup_test_fixture
local_setup local_setup
} }
function teardown() { teardown() {
unset GIT_CONFIG_NOSYSTEM
local_teardown local_teardown
clean_test_fixture
}
function teardown_file() { rm -rf "${BASH_IT_TEST_DIR}"
# This only serves to clean metadata from the real git repo. temp_del "${TEST_TEMP_DIR}"
git --git-dir="${MAIN_BASH_IT_GITDIR?}" worktree remove -f "${BASH_IT?}"
} }

View File

@ -0,0 +1,8 @@
# shellcheck shell=bash
load "${BASH_IT}/lib/log.bash"
load "${BASH_IT}/lib/utilities.bash"
load "${BASH_IT}/lib/helpers.bash"
load "${BASH_IT}/lib/search.bash"
load "${BASH_IT}/lib/preexec.bash"
load "${BASH_IT}/lib/colors.bash"

View File

@ -1,11 +1,8 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../themes/base.theme
setup_libs "colors" #"theme"
load "${BASH_IT?}/themes/base.theme.bash"
}
@test 'themes base: battery_percentage should not exist' { @test 'themes base: battery_percentage should not exist' {
run type -a battery_percentage &> /dev/null run type -a battery_percentage &> /dev/null
@ -13,7 +10,7 @@ function local_setup_file() {
} }
@test 'themes base: battery_percentage should exist if battery plugin loaded' { @test 'themes base: battery_percentage should exist if battery plugin loaded' {
load "${BASH_IT?}/plugins/available/battery.plugin.bash" load ../../plugins/available/battery.plugin
run type -a battery_percentage &> /dev/null run type -a battery_percentage &> /dev/null
assert_success assert_success
@ -31,12 +28,12 @@ function local_setup_file() {
@test 'themes base: battery_char should exist if battery plugin loaded' { @test 'themes base: battery_char should exist if battery plugin loaded' {
unset -f battery_char unset -f battery_char
load "${BASH_IT?}/plugins/available/battery.plugin.bash" load ../../plugins/available/battery.plugin
run type -t battery_percentage run type -t battery_percentage
assert_success assert_success
assert_line "function" assert_line "function"
load "${BASH_IT?}/themes/base.theme.bash" load ../../themes/base.theme
run type -t battery_char run type -t battery_char
assert_success assert_success
assert_line "function" assert_line "function"
@ -54,13 +51,13 @@ function local_setup_file() {
run battery_charge run battery_charge
assert_success assert_success
assert_output "" assert_line -n 0 ""
} }
@test 'themes base: battery_charge should exist if battery plugin loaded' { @test 'themes base: battery_charge should exist if battery plugin loaded' {
unset -f battery_charge unset -f battery_charge
load "${BASH_IT?}/plugins/available/battery.plugin.bash" load ../../plugins/available/battery.plugin
load "${BASH_IT?}/themes/base.theme.bash" load ../../themes/base.theme
run type -a battery_charge &> /dev/null run type -a battery_charge &> /dev/null
assert_success assert_success

View File

@ -1,14 +1,9 @@
# shellcheck shell=bats #!/usr/bin/env bats
# shellcheck disable=SC2034
# shellcheck disable=SC2016
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { load ../../themes/githelpers.theme
setup_libs "colors" #"theme" load ../../themes/base.theme
load "${BASH_IT?}/themes/base.theme.bash"
load "${BASH_IT?}/themes/githelpers.theme.bash"
}
add_commit() { add_commit() {
local file_name="general-${RANDOM}" local file_name="general-${RANDOM}"

View File

@ -1,10 +1,29 @@
# shellcheck shell=bats #!/usr/bin/env bats
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash" load ../test_helper
load ../test_helper_libs
function local_setup_file() { function local_setup {
setup_libs "colors" #"theme" setup_test_fixture
load "${BASH_IT?}/themes/base.theme.bash"
# Copy the test fixture to the Bash-it folder
if command -v rsync &> /dev/null
then
rsync -a "$BASH_IT/test/fixtures/bash_it/" "$BASH_IT/"
else
find "$BASH_IT/test/fixtures/bash_it" \
-mindepth 1 -maxdepth 1 \
-exec cp -r {} "$BASH_IT/" \;
fi
export OLD_PATH="$PATH"
load ../../themes/base.theme
}
function local_teardown {
export PATH="$OLD_PATH"
unset OLD_PATH
} }
function setup_repo { function setup_repo {

View File

@ -182,7 +182,7 @@ prompt_segment() {
# declare -p codes # declare -p codes
if [[ $CURRENT_BG != NONE && $1 != "$CURRENT_BG" ]]; then if [[ $CURRENT_BG != NONE && $1 != "$CURRENT_BG" ]]; then
declare -a intermediate=("$(fg_color "$CURRENT_BG")" "$(bg_color "$1")") declare -a intermediate=("$(fg_color $CURRENT_BG)" "$(bg_color "$1")")
debug "pre prompt " "$(ansi intermediate[@])" debug "pre prompt " "$(ansi intermediate[@])"
PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR" PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR"
debug "post prompt " "$(ansi codes[@])" debug "post prompt " "$(ansi codes[@])"

View File

@ -1,11 +1,8 @@
# shellcheck shell=bash # shellcheck shell=bash
# shellcheck disable=SC2034 # Expected behavior for themes. # shellcheck disable=SC2034 # Expected behavior for themes.
# shellcheck disable=SC2154 #TODO: fix these all.
# Prompt defaut configuration
BARBUK_PROMPT=${BARBUK_PROMPT:="git-uptream-remote-logo ssh path scm python_venv ruby node terraform cloud duration exit"}
# Theme custom glyphs # Theme custom glyphs
# SCM
SCM_GIT_CHAR_GITLAB=${BARBUK_GITLAB_CHAR:=' '} SCM_GIT_CHAR_GITLAB=${BARBUK_GITLAB_CHAR:=' '}
SCM_GIT_CHAR_BITBUCKET=${BARBUK_BITBUCKET_CHAR:=' '} SCM_GIT_CHAR_BITBUCKET=${BARBUK_BITBUCKET_CHAR:=' '}
SCM_GIT_CHAR_GITHUB=${BARBUK_GITHUB_CHAR:=' '} SCM_GIT_CHAR_GITHUB=${BARBUK_GITHUB_CHAR:=' '}
@ -13,20 +10,13 @@ SCM_GIT_CHAR_DEFAULT=${BARBUK_GIT_DEFAULT_CHAR:=' '}
SCM_GIT_CHAR_ICON_BRANCH=${BARBUK_GIT_BRANCH_ICON:=''} SCM_GIT_CHAR_ICON_BRANCH=${BARBUK_GIT_BRANCH_ICON:=''}
SCM_HG_CHAR=${BARBUK_HG_CHAR:='☿ '} SCM_HG_CHAR=${BARBUK_HG_CHAR:='☿ '}
SCM_SVN_CHAR=${BARBUK_SVN_CHAR:='⑆ '} SCM_SVN_CHAR=${BARBUK_SVN_CHAR:='⑆ '}
# Exit code
EXIT_CODE_ICON=${BARBUK_EXIT_CODE_ICON:=' '} EXIT_CODE_ICON=${BARBUK_EXIT_CODE_ICON:=' '}
# Programming and tools
PYTHON_VENV_CHAR=${BARBUK_PYTHON_VENV_CHAR:=' '} PYTHON_VENV_CHAR=${BARBUK_PYTHON_VENV_CHAR:=' '}
RUBY_CHAR=${BARBUK_RUBY_CHAR:=' '} COMMAND_DURATION_ICON=${BARBUK_COMMAND_DURATION_ICON:-"$bold_blue"}
NODE_CHAR=${BARBUK_NODE_CHAR:=' '}
TERRAFORM_CHAR=${BARBUK_TERRAFORM_CHAR:="t "}
# Cloud
AWS_PROFILE_CHAR=${BARBUK_AWS_PROFILE_CHAR:=" aws "}
SCALEWAY_PROFILE_CHAR=${BARBUK_SCALEWAY_PROFILE_CHAR:=" scw "}
GCLOUD_CHAR=${BARBUK_GCLOUD_CHAR:=" google "}
# Command duration # Command duration
COMMAND_DURATION_MIN_SECONDS=${COMMAND_DURATION_MIN_SECONDS:-1} COMMAND_DURATION_MIN_SECONDS=${COMMAND_DURATION_MIN_SECONDS:-1}
COMMAND_DURATION_COLOR="$normal"
# Ssh user and hostname display # Ssh user and hostname display
SSH_INFO=${BARBUK_SSH_INFO:=true} SSH_INFO=${BARBUK_SSH_INFO:=true}
@ -34,32 +24,24 @@ HOST_INFO=${BARBUK_HOST_INFO:=long}
# Bash-it default glyphs customization # Bash-it default glyphs customization
SCM_NONE_CHAR= SCM_NONE_CHAR=
SCM_THEME_PROMPT_DIRTY=" ${bold_red?}" SCM_THEME_PROMPT_DIRTY=" ${bold_red}"
SCM_THEME_PROMPT_CLEAN=" ${bold_green?}" SCM_THEME_PROMPT_CLEAN=" ${bold_green}"
SCM_THEME_PROMPT_PREFIX="|" SCM_THEME_PROMPT_PREFIX="|"
SCM_THEME_PROMPT_SUFFIX="${green?}| " SCM_THEME_PROMPT_SUFFIX="${green}| "
SCM_GIT_BEHIND_CHAR="${bold_red?}${normal?}" SCM_GIT_BEHIND_CHAR="${bold_red}${normal}"
SCM_GIT_AHEAD_CHAR="${bold_green?}${normal?}" SCM_GIT_AHEAD_CHAR="${bold_green}${normal}"
SCM_GIT_UNTRACKED_CHAR="⌀" SCM_GIT_UNTRACKED_CHAR="⌀"
SCM_GIT_UNSTAGED_CHAR="${bold_yellow?}${normal?}" SCM_GIT_UNSTAGED_CHAR="${bold_yellow}${normal}"
SCM_GIT_STAGED_CHAR="${bold_green?}+${normal?}" SCM_GIT_STAGED_CHAR="${bold_green}+${normal}"
GIT_THEME_PROMPT_DIRTY=" ${bold_red?}" GIT_THEME_PROMPT_DIRTY=" ${bold_red}"
GIT_THEME_PROMPT_CLEAN=" ${bold_green?}" GIT_THEME_PROMPT_CLEAN=" ${bold_green}"
GIT_THEME_PROMPT_PREFIX="${cyan?}" GIT_THEME_PROMPT_PREFIX="${cyan}"
GIT_THEME_PROMPT_SUFFIX="${cyan?}" GIT_THEME_PROMPT_SUFFIX="${cyan}"
SCM_THEME_BRANCH_TRACK_PREFIX="${normal?}${cyan?}" SCM_THEME_BRANCH_TRACK_PREFIX="${normal}${cyan}"
SCM_THEME_CURRENT_USER_PREFFIX='  ' SCM_THEME_CURRENT_USER_PREFFIX='  '
SCM_GIT_SHOW_CURRENT_USER=false SCM_GIT_SHOW_CURRENT_USER=false
NVM_THEME_PROMPT_PREFIX=''
NVM_THEME_PROMPT_SUFFIX=''
RVM_THEME_PROMPT_PREFIX=''
RVM_THEME_PROMPT_SUFFIX=''
RBENV_THEME_PROMPT_PREFIX=' '
RBENV_THEME_PROMPT_SUFFIX=''
RBFU_THEME_PROMPT_PREFIX=''
RBFU_THEME_PROMPT_SUFFIX=''
function __git-uptream-remote-logo_prompt() { function _git-uptream-remote-logo {
[[ "$(_git-upstream)" == "" ]] && SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT" [[ "$(_git-upstream)" == "" ]] && SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT"
local remote remote_domain local remote remote_domain
@ -75,72 +57,36 @@ function __git-uptream-remote-logo_prompt() {
bitbucket) SCM_GIT_CHAR="$SCM_GIT_CHAR_BITBUCKET" ;; bitbucket) SCM_GIT_CHAR="$SCM_GIT_CHAR_BITBUCKET" ;;
*) SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT" ;; *) SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT" ;;
esac esac
echo "${purple?}$(scm_char)"
} }
function git_prompt_info() { function git_prompt_info {
git_prompt_vars git_prompt_vars
echo -e "on $SCM_GIT_CHAR_ICON_BRANCH $SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_GIT_AHEAD$SCM_GIT_BEHIND$SCM_GIT_STASH$SCM_SUFFIX " echo -e " on $SCM_GIT_CHAR_ICON_BRANCH $SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_GIT_AHEAD$SCM_GIT_BEHIND$SCM_GIT_STASH$SCM_SUFFIX"
} }
function __exit_prompt() { function _exit-code {
if [[ "$exit_code" -ne 0 ]]; then if [[ "$1" -ne 0 ]]; then
echo "${purple?}${EXIT_CODE_ICON}${yellow?}${exit_code}${bold_orange?} " exit_code=" ${purple}${EXIT_CODE_ICON}${yellow}${exit_code}${bold_orange}"
else else
echo "${bold_green}" exit_code="${bold_green}"
fi fi
} }
function __aws_profile_prompt() { function _prompt {
if [[ -n "${AWS_PROFILE}" ]]; then local exit_code="$?" wrap_char=' ' dir_color=$green ssh_info='' python_venv='' host command_duration=
echo -n "${bold_purple?}${AWS_PROFILE_CHAR}${normal?}${AWS_PROFILE} "
command_duration=$(_command_duration)
_exit-code exit_code
_git-uptream-remote-logo
history -a
# Detect root shell
if [ "$(whoami)" = root ]; then
dir_color=$red
fi fi
}
function __scaleway_profile_prompt() {
if [[ -n "${SCW_PROFILE}" ]]; then
echo -n "${bold_purple?}${SCALEWAY_PROFILE_CHAR}${normal?}${SCW_PROFILE} "
fi
}
function __gcloud_prompt() {
local active_gcloud_account=""
active_gcloud_account="$(active_gcloud_account_prompt)"
[[ -n "${active_gcloud_account}" ]] && echo "${bold_purple?}${GCLOUD_CHAR}${normal?}${active_gcloud_account} "
}
function __cloud_prompt() {
__aws_profile_prompt
__scaleway_profile_prompt
__gcloud_prompt
}
function __terraform_prompt() {
local terraform_workspace=""
if [ -d .terraform ]; then
terraform_workspace="$(terraform_workspace_prompt)"
[[ -n "${terraform_workspace}" ]] && echo "${bold_purple?}${TERRAFORM_CHAR}${normal?}${terraform_workspace} "
fi
}
function __node_prompt() {
local node_version=""
node_version="$(node_version_prompt)"
[[ -n "${node_version}" ]] && echo "${bold_purple?}${NODE_CHAR}${normal?}${node_version} "
}
function __ruby_prompt() {
local ruby_version=""
ruby_version="$(ruby_version_prompt)"
[[ -n "${ruby_version}" ]] && echo "${bold_purple?}${RUBY_CHAR}${normal?}${ruby_version} "
}
function __ssh_prompt() {
# Detect ssh # Detect ssh
if [[ -n "${SSH_CONNECTION}" ]] && [ "$SSH_INFO" = true ]; then if [[ -n "${SSH_CONNECTION}" ]] && [ "$SSH_INFO" = true ]; then
if [ "$HOST_INFO" = long ]; then if [ "$HOST_INFO" = long ]; then
@ -148,56 +94,19 @@ function __ssh_prompt() {
else else
host="\h" host="\h"
fi fi
echo "${bold_blue?}\u${bold_orange?}@${cyan?}$host ${bold_orange?}in " ssh_info="${bold_blue}\u${bold_orange}@${cyan}$host ${bold_orange}in"
fi fi
}
function __python_venv_prompt() {
# Detect python venv # Detect python venv
if [[ -n "${CONDA_DEFAULT_ENV}" ]]; then if [[ -n "${CONDA_DEFAULT_ENV}" ]]; then
echo "${bold_purple?}$PYTHON_VENV_CHAR${normal?}${CONDA_DEFAULT_ENV} " python_venv="$PYTHON_VENV_CHAR${CONDA_DEFAULT_ENV} "
elif [[ -n "${VIRTUAL_ENV}" ]]; then elif [[ -n "${VIRTUAL_ENV}" ]]; then
echo "${bold_purple?}$PYTHON_VENV_CHAR${normal?}$(basename "${VIRTUAL_ENV}") " python_venv="$PYTHON_VENV_CHAR$(basename "${VIRTUAL_ENV}") "
fi
}
function __path_prompt() {
local dir_color=${green?}
# Detect root shell
if [ "$(whoami)" = root ]; then
dir_color=${red?}
fi
echo "${dir_color}\w${normal} "
}
function __scm_prompt() {
scm_prompt_info
}
function __duration_prompt() {
[[ -n "$command_duration" ]] && echo "${command_duration} "
}
function __prompt-command() {
exit_code="$?"
command_duration=$(_command_duration)
local wrap_char
# Generate prompt
PS1="\n "
for segment in $BARBUK_PROMPT; do
local info
info="$(__"${segment}"_prompt)"
[[ -n "${info}" ]] && PS1+="${info}"
done
# Cut prompt when it's too long
if [[ ${#PS1} -gt $((COLUMNS * 2)) ]]; then
wrap_char="\n"
fi fi
PS1="\\n${ssh_info} ${purple}$(scm_char)${python_venv}${dir_color}\\w${normal}$(scm_prompt_info)${command_duration}${exit_code}"
[[ ${#PS1} -gt $((COLUMNS * 2)) ]] && wrap_char="\\n"
PS1="${PS1}${wrap_char}${normal} " PS1="${PS1}${wrap_char}${normal} "
} }
safe_append_prompt_command __prompt-command safe_append_prompt_command _prompt

View File

@ -1,20 +1,16 @@
# shellcheck shell=bash # shellcheck shell=bash
# shellcheck disable=SC2034 # Expected behavior for themes. # shellcheck disable=SC2034 # Expected behavior for themes.
# Colors for listing files, using default color scheme.
# To customize color scheme by theme, check out https://geoff.greer.fm/lscolors/
export CLICOLOR LSCOLORS LS_COLORS
CLOCK_CHAR_THEME_PROMPT_PREFIX='' CLOCK_CHAR_THEME_PROMPT_PREFIX=''
CLOCK_CHAR_THEME_PROMPT_SUFFIX='' CLOCK_CHAR_THEME_PROMPT_SUFFIX=''
CLOCK_THEME_PROMPT_PREFIX='' CLOCK_THEME_PROMPT_PREFIX=''
CLOCK_THEME_PROMPT_SUFFIX='' CLOCK_THEME_PROMPT_SUFFIX=''
THEME_PROMPT_HOST='\h' THEME_PROMPT_HOST='\H'
SCM= SCM=
: "${SCM_CHECK:=true}" SCM_CHECK=${SCM_CHECK:=true}
SCM_THEME_PROMPT_DIRTY=' ✗' SCM_THEME_PROMPT_DIRTY=' ✗'
SCM_THEME_PROMPT_CLEAN=' ✓' SCM_THEME_PROMPT_CLEAN=' ✓'
@ -34,15 +30,15 @@ SCM_THEME_CHAR_SUFFIX=''
: "${THEME_CHECK_SUDO:=false}" : "${THEME_CHECK_SUDO:=false}"
: "${THEME_BATTERY_PERCENTAGE_CHECK:=true}" : "${THEME_BATTERY_PERCENTAGE_CHECK:=true}"
: "${SCM_GIT_SHOW_DETAILS:=true}" SCM_GIT_SHOW_DETAILS=${SCM_GIT_SHOW_DETAILS:=true}
: "${SCM_GIT_SHOW_REMOTE_INFO:=auto}" SCM_GIT_SHOW_REMOTE_INFO=${SCM_GIT_SHOW_REMOTE_INFO:=auto}
: "${SCM_GIT_IGNORE_UNTRACKED:=false}" SCM_GIT_IGNORE_UNTRACKED=${SCM_GIT_IGNORE_UNTRACKED:=false}
: "${SCM_GIT_SHOW_CURRENT_USER:=false}" SCM_GIT_SHOW_CURRENT_USER=${SCM_GIT_SHOW_CURRENT_USER:=false}
: "${SCM_GIT_SHOW_MINIMAL_INFO:=false}" SCM_GIT_SHOW_MINIMAL_INFO=${SCM_GIT_SHOW_MINIMAL_INFO:=false}
: "${SCM_GIT_SHOW_STASH_INFO:=true}" SCM_GIT_SHOW_STASH_INFO=${SCM_GIT_SHOW_STASH_INFO:=true}
: "${SCM_GIT_SHOW_COMMIT_COUNT:=true}" SCM_GIT_SHOW_COMMIT_COUNT=${SCM_GIT_SHOW_COMMIT_COUNT:=true}
: "${SCM_GIT_USE_GITSTATUS:=false}" SCM_GIT_USE_GITSTATUS=${SCM_GIT_USE_GITSTATUS:=false}
: "${SCM_GIT_GITSTATUS_RAN:=false}" SCM_GIT_GITSTATUS_RAN=${SCM_GIT_GITSTATUS_RAN:=false}
SCM_GIT='git' SCM_GIT='git'
SCM_GIT_CHAR='±' SCM_GIT_CHAR='±'
@ -77,9 +73,9 @@ NVM_THEME_PROMPT_SUFFIX='|'
RVM_THEME_PROMPT_PREFIX=' |' RVM_THEME_PROMPT_PREFIX=' |'
RVM_THEME_PROMPT_SUFFIX='|' RVM_THEME_PROMPT_SUFFIX='|'
: "${THEME_SHOW_RUBY_PROMPT:=true}" THEME_SHOW_RUBY_PROMPT=${THEME_SHOW_RUBY_PROMPT:=true}
: "${THEME_SHOW_USER_HOST:=false}" THEME_SHOW_USER_HOST=${THEME_SHOW_USER_HOST:=false}
USER_HOST_THEME_PROMPT_PREFIX='' USER_HOST_THEME_PROMPT_PREFIX=''
USER_HOST_THEME_PROMPT_SUFFIX='' USER_HOST_THEME_PROMPT_SUFFIX=''
@ -92,160 +88,154 @@ RBENV_THEME_PROMPT_SUFFIX='|'
RBFU_THEME_PROMPT_PREFIX=' |' RBFU_THEME_PROMPT_PREFIX=' |'
RBFU_THEME_PROMPT_SUFFIX='|' RBFU_THEME_PROMPT_SUFFIX='|'
: "${GIT_EXE:=${SCM_GIT?}}" : "${GIT_EXE:=$SCM_GIT}"
: "${HG_EXE:=${SCM_HG?}}" : "${P4_EXE:=$SCM_P4}"
: "${SVN_EXE:=${SCM_SVN?}}" : "${HG_EXE:=$SCM_HG}"
: "${P4_EXE:=${SCM_P4?}}" : "${SVN_EXE:=$SCM_SVN}"
function _bash_it_appearance_scm_init() { function _bash_it_appearance_scm_init() {
GIT_EXE="$(type -P "${SCM_GIT:-git}" || true)" GIT_EXE="$(type -P $SCM_GIT || true)"
HG_EXE="$(type -P "${SCM_HG:-hg}" || true)" P4_EXE="$(type -P $SCM_P4 || true)"
SVN_EXE="$(type -P "${SCM_SVN:-svn}" || true)" HG_EXE="$(type -P $SCM_HG || true)"
P4_EXE="$(type -P "${SCM_P4:-p4}" || true)" SVN_EXE="$(type -P $SCM_SVN || true)"
# Check for broken SVN exe that is caused by some versions of Xcode. # Check for broken SVN exe that is caused by some versions of Xcode.
# See https://github.com/Bash-it/bash-it/issues/1612 for more details. # See https://github.com/Bash-it/bash-it/issues/1612 for more details.
if [[ -x "${SVN_EXE-}" && -x "${SVN_EXE%/svn}/xcrun" ]]; then if [[ -x "$SVN_EXE" && -x "${SVN_EXE%/*}/xcrun" ]]; then
if ! "${SVN_EXE}" --version > /dev/null 2>&1; then if ! "$SVN_EXE" --version > /dev/null 2>&1; then
# Unset the SVN exe variable so that SVN commands are avoided. # Unset the SVN exe variable so that SVN commands are avoided.
SVN_EXE="" SVN_EXE=""
fi fi
fi fi
return 0
} }
_bash_it_library_finalize_hook+=('_bash_it_appearance_scm_init') _bash_it_library_finalize_hook+=('_bash_it_appearance_scm_init')
function scm() { function scm {
if [[ "${SCM_CHECK:-true}" == "false" ]]; then if [[ "$SCM_CHECK" = false ]]; then
SCM="${SCM_NONE-NONE}" SCM=$SCM_NONE
elif [[ -x "${GIT_EXE-}" ]] && _bash-it-find-in-ancestor '.git' > /dev/null; then elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then
SCM="${SCM_GIT?}" SCM=$SCM_GIT
elif [[ -x "${HG_EXE-}" ]] && _bash-it-find-in-ancestor '.hg' > /dev/null; then elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then
SCM="${SCM_HG?}" SCM=$SCM_HG
elif [[ -x "${SVN_EXE-}" ]] && _bash-it-find-in-ancestor '.svn' > /dev/null; then elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then
SCM="${SCM_SVN?}" SCM=$SCM_SVN
elif [[ -x "${P4_EXE-}" && -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then
SCM="${SCM_P4?}" SCM=$SCM_GIT
elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2> /dev/null)" ]]; then
SCM=$SCM_HG
elif [[ -x "$SVN_EXE" ]] && [[ -n "$(svn info --show-item wc-root 2> /dev/null)" ]]; then
SCM=$SCM_SVN
elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then
SCM=$SCM_P4
else else
SCM="${SCM_NONE-NONE}" SCM=$SCM_NONE
fi fi
} }
function scm_prompt() { scm_prompt() {
local format="${SCM_PROMPT_FORMAT-"[%s%s]"}" local CHAR
local scm_char scm_prompt_info CHAR="$(scm_char)"
scm_char="$(scm_char)" local format=${SCM_PROMPT_FORMAT:-'[%s%s]'}
scm_prompt_info="$(scm_prompt_info)"
if [[ "${scm_char}" != "${SCM_NONE_CHAR:-}" ]]; then if [[ "${CHAR}" != "$SCM_NONE_CHAR" ]]; then
# shellcheck disable=2059 # shellcheck disable=2059
printf "${format}" "${scm_char}" "${scm_prompt_info}" printf "$format\n" "$CHAR" "$(scm_prompt_info)"
fi fi
} }
function scm_prompt_char() { function scm_prompt_char {
if [[ -z "${SCM:-}" ]]; then if [[ -z $SCM ]]; then scm; fi
scm if [[ $SCM == "$SCM_GIT" ]]; then
SCM_CHAR=$SCM_GIT_CHAR
elif [[ $SCM == "$SCM_P4" ]]; then
SCM_CHAR=$SCM_P4_CHAR
elif [[ $SCM == "$SCM_HG" ]]; then
SCM_CHAR=$SCM_HG_CHAR
elif [[ $SCM == "$SCM_SVN" ]]; then
SCM_CHAR=$SCM_SVN_CHAR
else
SCM_CHAR=$SCM_NONE_CHAR
fi fi
case ${SCM?} in
"${SCM_GIT?}")
SCM_CHAR="${SCM_GIT_CHAR?}"
;;
"${SCM_HG?}")
SCM_CHAR="${SCM_HG_CHAR?}"
;;
"${SCM_SVN?}")
SCM_CHAR="${SCM_SVN_CHAR?}"
;;
"${SCM_P4?}")
SCM_CHAR="${SCM_P4_CHAR?}"
;;
*)
SCM_CHAR="${SCM_NONE_CHAR:-}"
;;
esac
} }
function scm_prompt_vars() { function scm_prompt_vars {
scm scm
scm_prompt_char scm_prompt_char
SCM_DIRTY=0 SCM_DIRTY=0
SCM_STATE='' SCM_STATE=''
[[ $SCM == "$SCM_GIT" ]] && git_prompt_vars && return
local prompt_vars="${SCM}_prompt_vars" [[ $SCM == "$SCM_P4" ]] && p4_prompt_vars && return
_is_function "${prompt_vars}" && "${prompt_vars}" [[ $SCM == "$SCM_HG" ]] && hg_prompt_vars && return
[[ $SCM == "$SCM_SVN" ]] && svn_prompt_vars && return
} }
function scm_prompt_info() { function scm_prompt_info {
scm scm
scm_prompt_char scm_prompt_char
scm_prompt_info_common scm_prompt_info_common
} }
function scm_prompt_char_info() { function scm_prompt_char_info {
scm_prompt_char scm_prompt_char
echo -ne "${SCM_THEME_CHAR_PREFIX-}${SCM_CHAR?}${SCM_THEME_CHAR_SUFFIX-}" echo -ne "${SCM_THEME_CHAR_PREFIX}${SCM_CHAR}${SCM_THEME_CHAR_SUFFIX}"
scm_prompt_info_common scm_prompt_info_common
} }
function scm_prompt_info_common() { function scm_prompt_info_common {
local prompt_info
SCM_DIRTY=0 SCM_DIRTY=0
SCM_STATE='' SCM_STATE=''
case ${SCM?} in if [[ ${SCM} == "${SCM_GIT}" ]]; then
"${SCM_GIT?}") if [[ ${SCM_GIT_SHOW_MINIMAL_INFO} == true ]]; then
if [[ ${SCM_GIT_SHOW_MINIMAL_INFO:-false} == "true" ]]; then # user requests minimal git status information
# user requests minimal git status information git_prompt_minimal_info
prompt_info="${SCM}_prompt_minimal_info" else
else # more detailed git status
# more detailed git status git_prompt_info
prompt_info="${SCM}_prompt_info" fi
fi return
;; fi
*)
# TODO: consider adding minimal status information for hg and svn # TODO: consider adding minimal status information for hg and svn
prompt_info="${SCM}_prompt_info" { [[ ${SCM} == "${SCM_P4}" ]] && p4_prompt_info && return; } || true
;; { [[ ${SCM} == "${SCM_HG}" ]] && hg_prompt_info && return; } || true
esac { [[ ${SCM} == "${SCM_SVN}" ]] && svn_prompt_info && return; } || true
_is_function "${prompt_info}" && "${prompt_info}"
} }
function terraform_workspace_prompt() { function terraform_workspace_prompt {
if _command_exists terraform; then if _command_exists terraform; then
if [[ -d .terraform ]]; then if [ -d .terraform ]; then
terraform workspace show 2> /dev/null echo -e "$(terraform workspace show 2> /dev/null)"
fi fi
fi fi
} }
function active_gcloud_account_prompt() { function active_gcloud_account_prompt {
if _command_exists gcloud; then if _command_exists gcloud; then
gcloud config list account --format "value(core.account)" 2> /dev/null echo -e "$(gcloud config list account --format "value(core.account)" 2> /dev/null)"
fi fi
} }
function git_prompt_minimal_info() { function git_prompt_minimal_info {
SCM_STATE="${SCM_THEME_PROMPT_CLEAN?}" SCM_STATE=${SCM_THEME_PROMPT_CLEAN}
_git-hide-status && return _git-hide-status && return
SCM_BRANCH="${SCM_THEME_BRANCH_PREFIX-}\$(_git-friendly-ref)" SCM_BRANCH="${SCM_THEME_BRANCH_PREFIX}\$(_git-friendly-ref)"
if [[ -n "$(_git-status | tail -n1)" ]]; then if [[ -n "$(_git-status | tail -n1)" ]]; then
SCM_DIRTY=1 SCM_DIRTY=1
SCM_STATE="${SCM_THEME_PROMPT_DIRTY?}" SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
fi fi
# Output the git prompt # Output the git prompt
SCM_PREFIX="${SCM_THEME_PROMPT_PREFIX-}" SCM_PREFIX=${SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX="${SCM_THEME_PROMPT_SUFFIX-}" SCM_SUFFIX=${SCM_THEME_PROMPT_SUFFIX}
echo -ne "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}" echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
} }
function git_prompt_vars() { function git_prompt_vars {
if [[ "${SCM_GIT_USE_GITSTATUS:-false}" != "false" ]] && _command_exists gitstatus_query && gitstatus_query && [[ "${VCS_STATUS_RESULT:-}" == "ok-sync" ]]; then if ${SCM_GIT_USE_GITSTATUS} && _command_exists gitstatus_query && gitstatus_query && [[ "${VCS_STATUS_RESULT}" == "ok-sync" ]]; then
# we can use faster gitstatus # we can use faster gitstatus
# use this variable in githelpers and below to choose gitstatus output # use this variable in githelpers and below to choose gitstatus output
SCM_GIT_GITSTATUS_RAN=true SCM_GIT_GITSTATUS_RAN=true
@ -261,174 +251,190 @@ function git_prompt_vars() {
local detached_prefix local detached_prefix
if _git-tag &> /dev/null; then if _git-tag &> /dev/null; then
detached_prefix="${SCM_THEME_TAG_PREFIX}" detached_prefix=${SCM_THEME_TAG_PREFIX}
else else
detached_prefix="${SCM_THEME_DETACHED_PREFIX}" detached_prefix=${SCM_THEME_DETACHED_PREFIX}
fi fi
SCM_BRANCH="${detached_prefix}\$(_git-friendly-ref)" SCM_BRANCH="${detached_prefix}\$(_git-friendly-ref)"
fi fi
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
commits_behind="${VCS_STATUS_COMMITS_BEHIND?}" commits_behind=${VCS_STATUS_COMMITS_BEHIND}
commits_ahead="${VCS_STATUS_COMMITS_AHEAD?}" commits_ahead=${VCS_STATUS_COMMITS_AHEAD}
else else
IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)" IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)"
fi fi
if [[ "${commits_ahead}" -gt 0 ]]; then if [[ "${commits_ahead}" -gt 0 ]]; then
SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_AHEAD_CHAR}" SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_AHEAD_CHAR}"
[[ "${SCM_GIT_SHOW_COMMIT_COUNT}" == "true" ]] && SCM_BRANCH+="${commits_ahead}" [[ "${SCM_GIT_SHOW_COMMIT_COUNT}" = "true" ]] && SCM_BRANCH+="${commits_ahead}"
fi fi
if [[ "${commits_behind}" -gt 0 ]]; then if [[ "${commits_behind}" -gt 0 ]]; then
SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_BEHIND_CHAR}" SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_BEHIND_CHAR}"
[[ "${SCM_GIT_SHOW_COMMIT_COUNT}" == "true" ]] && SCM_BRANCH+="${commits_behind}" [[ "${SCM_GIT_SHOW_COMMIT_COUNT}" = "true" ]] && SCM_BRANCH+="${commits_behind}"
fi fi
if [[ "${SCM_GIT_SHOW_STASH_INFO}" == "true" ]]; then if [[ "${SCM_GIT_SHOW_STASH_INFO}" = "true" ]]; then
local stash_count local stash_count
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
stash_count="${VCS_STATUS_STASHES?}" stash_count=${VCS_STATUS_STASHES}
else else
stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')" stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')"
fi fi
[[ "${stash_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STASH_CHAR_PREFIX}${stash_count}${SCM_GIT_STASH_CHAR_SUFFIX}" [[ "${stash_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STASH_CHAR_PREFIX}${stash_count}${SCM_GIT_STASH_CHAR_SUFFIX}"
fi fi
SCM_STATE="${GIT_THEME_PROMPT_CLEAN:-${SCM_THEME_PROMPT_CLEAN:-}}" SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
if ! _git-hide-status; then if ! _git-hide-status; then
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
untracked_count="${VCS_STATUS_NUM_UNTRACKED?}" untracked_count=${VCS_STATUS_NUM_UNTRACKED}
unstaged_count="${VCS_STATUS_NUM_UNSTAGED?}" unstaged_count=${VCS_STATUS_NUM_UNSTAGED}
staged_count="${VCS_STATUS_NUM_STAGED?}" staged_count=${VCS_STATUS_NUM_STAGED}
else else
IFS=$'\t' read -r untracked_count unstaged_count staged_count < <(_git-status-counts) IFS=$'\t' read -r untracked_count unstaged_count staged_count <<< "$(_git-status-counts)"
fi fi
if [[ "${untracked_count}" -gt 0 || "${unstaged_count}" -gt 0 || "${staged_count}" -gt 0 ]]; then if [[ "${untracked_count}" -gt 0 || "${unstaged_count}" -gt 0 || "${staged_count}" -gt 0 ]]; then
SCM_DIRTY=1 SCM_DIRTY=1
if [[ "${SCM_GIT_SHOW_DETAILS}" == "true" ]]; then if [[ "${SCM_GIT_SHOW_DETAILS}" = "true" ]]; then
[[ "${staged_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STAGED_CHAR}${staged_count}" && SCM_DIRTY=3 [[ "${staged_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STAGED_CHAR}${staged_count}" && SCM_DIRTY=3
[[ "${unstaged_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_UNSTAGED_CHAR}${unstaged_count}" && SCM_DIRTY=2 [[ "${unstaged_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_UNSTAGED_CHAR}${unstaged_count}" && SCM_DIRTY=2
[[ "${untracked_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_UNTRACKED_CHAR}${untracked_count}" && SCM_DIRTY=1 [[ "${untracked_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_UNTRACKED_CHAR}${untracked_count}" && SCM_DIRTY=1
fi fi
SCM_STATE="${GIT_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}" SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
fi fi
fi fi
# no if for gitstatus here, user extraction is not supported by it # no if for gitstatus here, user extraction is not supported by it
[[ "${SCM_GIT_SHOW_CURRENT_USER}" == "true" ]] && SCM_BRANCH+="$(git_user_info)" [[ "${SCM_GIT_SHOW_CURRENT_USER}" == "true" ]] && SCM_BRANCH+="$(git_user_info)"
SCM_PREFIX="${GIT_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}" SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX="${GIT_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}" SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
SCM_CHANGE=$(_git-short-sha 2> /dev/null || true) SCM_CHANGE=$(_git-short-sha 2> /dev/null || echo "")
} }
function p4_prompt_vars() { function p4_prompt_vars {
local opened_count non_default_changes default_count \
add_file_count edit_file_count delete_file_count
IFS=$'\t' read -r \ IFS=$'\t' read -r \
opened_count non_default_changes default_count \ opened_count non_default_changes default_count \
add_file_count edit_file_count delete_file_count \ add_file_count edit_file_count delete_file_count \
< <(_p4-opened-counts) <<< "$(_p4-opened-counts)"
if [[ "${opened_count}" -gt 0 ]]; then if [[ "${opened_count}" -gt 0 ]]; then
SCM_DIRTY=1 SCM_DIRTY=1
SCM_STATE="${SCM_THEME_PROMPT_DIRTY?}" SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
[[ "${opened_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_OPENED_CHAR?}${opened_count}" [[ "${opened_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_OPENED_CHAR}${opened_count}"
[[ "${non_default_changes}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_CHANGES_CHAR?}${non_default_changes}" [[ "${non_default_changes}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_CHANGES_CHAR}${non_default_changes}"
[[ "${default_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_DEFAULT_CHAR?}${default_count}" [[ "${default_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_DEFAULT_CHAR}${default_count}"
else else
SCM_DIRTY=0 SCM_DIRTY=0
SCM_STATE="${SCM_THEME_PROMPT_CLEAN?}" SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
fi fi
SCM_PREFIX="${P4_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}" SCM_PREFIX=${P4_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX="${P4_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}" SCM_SUFFIX=${P4_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
} }
function svn_prompt_vars() { function svn_prompt_vars {
if [[ -n "$(svn status | head -c1 2> /dev/null)" ]]; then if [[ -n $(svn status | head -c1 2> /dev/null) ]]; then
SCM_DIRTY=1 SCM_DIRTY=1
SCM_STATE="${SVN_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}" SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
else else
SCM_DIRTY=0 SCM_DIRTY=0
SCM_STATE="${SVN_THEME_PROMPT_CLEAN:-${SCM_THEME_PROMPT_CLEAN?}}" SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
fi fi
SCM_PREFIX="${SVN_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}" SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX="${SVN_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}" SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
SCM_BRANCH="$(svn info --show-item=url 2> /dev/null | awk -F/ '{ for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }')" || return SCM_BRANCH=$(svn info --show-item=url 2> /dev/null | awk -F/ '{ for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
SCM_CHANGE="$(svn info --show-item=revision 2> /dev/null)" SCM_CHANGE=$(svn info --show-item=revision 2> /dev/null)
} }
function hg_prompt_vars() { # this functions returns absolute location of .hg directory if one exists
local hg_root bookmark # It starts in the current directory and moves its way up until it hits /.
# If we get to / then no Mercurial repository was found.
# Example:
# - lets say we cd into ~/Projects/Foo/Bar
# - .hg is located in ~/Projects/Foo/.hg
# - get_hg_root starts at ~/Projects/Foo/Bar and sees that there is no .hg directory, so then it goes into ~/Projects/Foo
function get_hg_root {
local CURRENT_DIR="${PWD}"
while [[ "${CURRENT_DIR:-/}" != "/" ]]; do
if [[ -d "$CURRENT_DIR/.hg" ]]; then
echo "$CURRENT_DIR/.hg"
return
fi
CURRENT_DIR="${CURRENT_DIR%/*}"
done
}
function hg_prompt_vars {
if [[ -n $(hg status 2> /dev/null) ]]; then if [[ -n $(hg status 2> /dev/null) ]]; then
SCM_DIRTY=1 SCM_DIRTY=1
SCM_STATE="${HG_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}" SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
else else
SCM_DIRTY=0 SCM_DIRTY=0
SCM_STATE="${HG_THEME_PROMPT_CLEAN:-${SCM_THEME_PROMPT_CLEAN?}}" SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
fi fi
SCM_PREFIX="${HG_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}" SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX="${HG_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}" SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
hg_root="$(_bash-it-find-in-ancestor ".hg")/.hg" HG_ROOT=$(get_hg_root)
if [[ -f "$hg_root/branch" ]]; then if [ -f "$HG_ROOT/branch" ]; then
# Mercurial holds it's current branch in .hg/branch file # Mercurial holds it's current branch in .hg/branch file
SCM_BRANCH=$(< "${hg_root}/branch") SCM_BRANCH=$(< "${HG_ROOT}/branch")
bookmark="${hg_root}/bookmarks.current" local bookmark=${HG_ROOT}/bookmarks.current
[[ -f "${bookmark}" ]] && SCM_BRANCH+=:$(< "${bookmark}") [[ -f ${bookmark} ]] && SCM_BRANCH+=:$(< "${bookmark}")
else else
SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}') SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}')
fi fi
if [[ -f "$hg_root/dirstate" ]]; then if [ -f "$HG_ROOT/dirstate" ]; then
# Mercurial holds various information about the working directory in .hg/dirstate file. More on http://mercurial.selenic.com/wiki/DirState # Mercurial holds various information about the working directory in .hg/dirstate file. More on http://mercurial.selenic.com/wiki/DirState
SCM_CHANGE=$(hexdump -vn 10 -e '1/1 "%02x"' "$hg_root/dirstate" | cut -c-12) SCM_CHANGE=$(hexdump -vn 10 -e '1/1 "%02x"' "$HG_ROOT/dirstate" | cut -c-12)
else else
SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}') SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}')
fi fi
} }
function nvm_version_prompt() { function nvm_version_prompt {
local node local node
if _is_function nvm; then if _is_function nvm; then
node=$(nvm current 2> /dev/null) node=$(nvm current 2> /dev/null)
[[ "${node}" == "system" ]] && return [[ "${node}" == "system" ]] && return
echo -ne "${NVM_THEME_PROMPT_PREFIX-}${node}${NVM_THEME_PROMPT_SUFFIX-}" echo -e "${NVM_THEME_PROMPT_PREFIX}${node}${NVM_THEME_PROMPT_SUFFIX}"
fi fi
} }
function node_version_prompt() { function node_version_prompt {
nvm_version_prompt echo -e "$(nvm_version_prompt)"
} }
function rvm_version_prompt() { function rvm_version_prompt {
if _command_exists rvm; then if which rvm &> /dev/null; then
rvm="$(rvm-prompt)" || return rvm=$(rvm-prompt) || return
if [[ -n "$rvm" ]]; then if [ -n "$rvm" ]; then
echo -ne "${RVM_THEME_PROMPT_PREFIX-}${rvm}${RVM_THEME_PROMPT_SUFFIX-}" echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX"
fi fi
fi fi
} }
function rbenv_version_prompt() { function rbenv_version_prompt {
if _command_exists rbenv; then if which rbenv &> /dev/null; then
rbenv=$(rbenv version-name) || return rbenv=$(rbenv version-name) || return
rbenv commands | grep -q gemset && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}" rbenv commands | grep -q gemset && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}"
if [[ "$rbenv" != "system" ]]; then if [ "$rbenv" != "system" ]; then
echo -ne "${RBENV_THEME_PROMPT_PREFIX-}${rbenv}${RBENV_THEME_PROMPT_SUFFIX-}" echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX"
fi fi
fi fi
} }
function rbfu_version_prompt() { function rbfu_version_prompt {
if [[ -n "${RBFU_RUBY_VERSION:-}" ]]; then if [[ $RBFU_RUBY_VERSION ]]; then
echo -ne "${RBFU_THEME_PROMPT_PREFIX-}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX-}" echo -e "${RBFU_THEME_PROMPT_PREFIX}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX}"
fi fi
} }
function chruby_version_prompt() { function chruby_version_prompt {
if _is_function chruby; then if _is_function chruby; then
if _is_function chruby_auto; then if _is_function chruby_auto; then
chruby_auto chruby_auto
@ -439,142 +445,141 @@ function chruby_version_prompt() {
if ! chruby | grep -q '\*'; then if ! chruby | grep -q '\*'; then
ruby_version="${ruby_version} (system)" ruby_version="${ruby_version} (system)"
fi fi
echo -ne "${CHRUBY_THEME_PROMPT_PREFIX-}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX-}" echo -e "${CHRUBY_THEME_PROMPT_PREFIX}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX}"
fi fi
} }
function ruby_version_prompt() { function ruby_version_prompt {
if [[ "${THEME_SHOW_RUBY_PROMPT:-}" == "true" ]]; then if [[ "${THEME_SHOW_RUBY_PROMPT}" = "true" ]]; then
rbfu_version_prompt echo -e "$(rbfu_version_prompt)$(rbenv_version_prompt)$(rvm_version_prompt)$(chruby_version_prompt)"
rbenv_version_prompt
rvm_version_prompt
chruby_version_prompt
fi fi
} }
function k8s_context_prompt() { function k8s_context_prompt {
kubectl config current-context 2> /dev/null echo -e "$(kubectl config current-context 2> /dev/null)"
} }
function k8s_namespace_prompt() { function k8s_namespace_prompt {
kubectl config view --minify --output 'jsonpath={..namespace}' 2> /dev/null echo -e "$(kubectl config view --minify --output 'jsonpath={..namespace}' 2> /dev/null)"
} }
function virtualenv_prompt() { function virtualenv_prompt {
local virtualenv if [[ -n "$VIRTUAL_ENV" ]]; then
if [[ -n "${VIRTUAL_ENV:-}" ]]; then virtualenv=$(basename "$VIRTUAL_ENV")
virtualenv="${VIRTUAL_ENV##*/}" echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX"
echo -ne "${VIRTUALENV_THEME_PROMPT_PREFIX-}${virtualenv}${VIRTUALENV_THEME_PROMPT_SUFFIX-}"
fi fi
} }
function condaenv_prompt() { function condaenv_prompt {
if [[ -n "${CONDA_DEFAULT_ENV:-}" ]]; then if [[ $CONDA_DEFAULT_ENV ]]; then
echo -ne "${CONDAENV_THEME_PROMPT_PREFIX-}${CONDA_DEFAULT_ENV}${CONDAENV_THEME_PROMPT_SUFFIX-}" echo -e "${CONDAENV_THEME_PROMPT_PREFIX}${CONDA_DEFAULT_ENV}${CONDAENV_THEME_PROMPT_SUFFIX}"
fi fi
} }
function py_interp_prompt() { function py_interp_prompt {
local py_version py_version=$(python --version 2>&1 | awk 'NR==1{print "py-"$2;}') || return
py_version="$(python --version 2>&1 | awk 'NR==1{print "py-"$2;}')" || return echo -e "${PYTHON_THEME_PROMPT_PREFIX}${py_version}${PYTHON_THEME_PROMPT_SUFFIX}"
echo -ne "${PYTHON_THEME_PROMPT_PREFIX-}${py_version}${PYTHON_THEME_PROMPT_SUFFIX-}"
} }
function python_version_prompt() { function python_version_prompt {
virtualenv_prompt echo -e "$(virtualenv_prompt)$(condaenv_prompt)$(py_interp_prompt)"
condaenv_prompt
py_interp_prompt
} }
function git_user_info() { function git_user_info {
local current_user
# support two or more initials, set by 'git pair' plugin # support two or more initials, set by 'git pair' plugin
current_user="$(git config user.initials | sed 's% %+%')" SCM_CURRENT_USER=$(git config user.initials | sed 's% %+%')
# if `user.initials` weren't set, attempt to extract initials from `user.name` # if `user.initials` weren't set, attempt to extract initials from `user.name`
[[ -z "${current_user}" ]] && current_user=$(printf "%s" "$(for word in $(git config user.name | PERLIO=:utf8 perl -pe '$_=lc'); do printf "%s" "${word:0:1}"; done)") [[ -z "${SCM_CURRENT_USER}" ]] && SCM_CURRENT_USER=$(printf "%s" "$(for word in $(git config user.name | PERLIO=:utf8 perl -pe '$_=lc'); do printf "%s" "${word:0:1}"; done)")
[[ -n "${current_user}" ]] && printf "%s" "${SCM_THEME_CURRENT_USER_PREFFIX-}${current_user}${SCM_THEME_CURRENT_USER_SUFFIX-}" [[ -n "${SCM_CURRENT_USER}" ]] && printf "%s" "$SCM_THEME_CURRENT_USER_PREFFIX$SCM_CURRENT_USER$SCM_THEME_CURRENT_USER_SUFFIX"
} }
function clock_char() { function clock_char {
local clock_char clock_char_color show_clock_char CLOCK_CHAR=${THEME_CLOCK_CHAR:-"⌚"}
clock_char="${THEME_CLOCK_CHAR:-}" CLOCK_CHAR_COLOR=${THEME_CLOCK_CHAR_COLOR:-"$normal"}
clock_char_color="${THEME_CLOCK_CHAR_COLOR:-${normal:-}}" SHOW_CLOCK_CHAR=${THEME_SHOW_CLOCK_CHAR:-"true"}
show_clock_char="${THEME_SHOW_CLOCK_CHAR:-"true"}"
if [[ "${show_clock_char}" == "true" ]]; then if [[ "${SHOW_CLOCK_CHAR}" = "true" ]]; then
echo -ne "${clock_char_color}${CLOCK_CHAR_THEME_PROMPT_PREFIX-}${clock_char}${CLOCK_CHAR_THEME_PROMPT_SUFFIX-}" echo -e "${CLOCK_CHAR_COLOR}${CLOCK_CHAR_THEME_PROMPT_PREFIX}${CLOCK_CHAR}${CLOCK_CHAR_THEME_PROMPT_SUFFIX}"
fi fi
} }
function clock_prompt() { function clock_prompt {
local clock_color="${THEME_CLOCK_COLOR:-${normal?}}" CLOCK_COLOR=${THEME_CLOCK_COLOR:-"$normal"}
local clock_format="${THEME_CLOCK_FORMAT:-"%H:%M:%S"}" CLOCK_FORMAT=${THEME_CLOCK_FORMAT:-"%H:%M:%S"}
local show_clock="${THEME_SHOW_CLOCK:-${THEME_CLOCK_CHECK:-true}}" [ -z "$THEME_SHOW_CLOCK" ] && THEME_SHOW_CLOCK=${THEME_CLOCK_CHECK:-"true"}
local clock_string="\D{${clock_format}}" SHOW_CLOCK=$THEME_SHOW_CLOCK
if [[ "${show_clock}" == "true" ]]; then if [[ "${SHOW_CLOCK}" = "true" ]]; then
echo -ne "${clock_color}${CLOCK_THEME_PROMPT_PREFIX-}${clock_string}${CLOCK_THEME_PROMPT_SUFFIX-}" CLOCK_STRING=$(date +"${CLOCK_FORMAT}")
echo -e "${CLOCK_COLOR}${CLOCK_THEME_PROMPT_PREFIX}${CLOCK_STRING}${CLOCK_THEME_PROMPT_SUFFIX}"
fi fi
} }
function user_host_prompt() { function user_host_prompt {
if [[ "${THEME_SHOW_USER_HOST:-false}" == "true" ]]; then if [[ "${THEME_SHOW_USER_HOST}" = "true" ]]; then
echo -ne "${USER_HOST_THEME_PROMPT_PREFIX-}\u@${THEME_PROMPT_HOST:-\h}${USER_HOST_THEME_PROMPT_SUFFIX-}" echo -e "${USER_HOST_THEME_PROMPT_PREFIX}\u@\h${USER_HOST_THEME_PROMPT_SUFFIX}"
fi fi
} }
# backwards-compatibility # backwards-compatibility
function git_prompt_info() { function git_prompt_info {
_git-hide-status && return _git-hide-status && return
git_prompt_vars git_prompt_vars
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}${SCM_STATE?}${SCM_SUFFIX?}" echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
} }
function p4_prompt_info() { function p4_prompt_info() {
p4_prompt_vars p4_prompt_vars
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}:${SCM_CHANGE?}${SCM_STATE?}${SCM_SUFFIX?}" echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE}${SCM_STATE}${SCM_SUFFIX}"
} }
function svn_prompt_info() { function svn_prompt_info {
svn_prompt_vars svn_prompt_vars
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}${SCM_STATE?}${SCM_SUFFIX?}" echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
} }
function hg_prompt_info() { function hg_prompt_info() {
hg_prompt_vars hg_prompt_vars
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}:${SCM_CHANGE#*:}${SCM_STATE?}${SCM_SUFFIX?}" echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE#*:}${SCM_STATE}${SCM_SUFFIX}"
} }
function scm_char() { function scm_char {
scm_prompt_char scm_prompt_char
echo -ne "${SCM_THEME_CHAR_PREFIX?}${SCM_CHAR?}${SCM_THEME_CHAR_SUFFIX?}" echo -e "${SCM_THEME_CHAR_PREFIX}${SCM_CHAR}${SCM_THEME_CHAR_SUFFIX}"
} }
function prompt_char() { function prompt_char {
scm_char scm_char
} }
function battery_char() { function battery_char {
# The battery_char function depends on the presence of the battery_percentage function. if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" = true ]]; then
if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" == true ]] && _command_exists battery_percentage; then echo -e "${bold_red:-}$(battery_percentage)%"
echo -ne "${bold_red?}$(battery_percentage)%"
else
false
fi fi
} }
if ! _command_exists battery_charge; then if ! _command_exists battery_charge; then
# if user has installed battery plugin, skip this... # if user has installed battery plugin, skip this...
function battery_charge() { function battery_charge() {
: # no op # no op
echo -n
} }
fi fi
function aws_profile() { # The battery_char function depends on the presence of the battery_percentage function.
if [[ -n "${AWS_DEFAULT_PROFILE:-}" ]]; then # If battery_percentage is not defined, then define battery_char as a no-op.
echo -ne "${AWS_DEFAULT_PROFILE}" if ! _command_exists battery_percentage; then
function battery_char() {
# no op
echo -n
}
fi
function aws_profile {
if [[ $AWS_DEFAULT_PROFILE ]]; then
echo -e "${AWS_DEFAULT_PROFILE}"
else else
echo -ne "default" echo -e "default"
fi fi
} }

View File

@ -0,0 +1,69 @@
# shellcheck shell=bash
if [ -z "$BASH_IT_COMMAND_DURATION" ] || [ "$BASH_IT_COMMAND_DURATION" != true ]; then
_command_duration() {
echo -n
}
return
fi
# Define tmp dir and file
COMMAND_DURATION_TMPDIR="${TMPDIR:-/tmp}"
COMMAND_DURATION_FILE="${COMMAND_DURATION_FILE:-$COMMAND_DURATION_TMPDIR/bashit_theme_execution_$BASHPID}"
COMMAND_DURATION_ICON=${COMMAND_DURATION_ICON:-'  '}
COMMAND_DURATION_MIN_SECONDS=${COMMAND_DURATION_MIN_SECONDS:-'1'}
trap _command_duration_delete_temp_file EXIT HUP INT TERM
_command_duration_delete_temp_file() {
if [[ -f "$COMMAND_DURATION_FILE" ]]; then
rm -f "$COMMAND_DURATION_FILE"
fi
}
_command_duration_pre_exec() {
date +%s.%1N > "$COMMAND_DURATION_FILE"
}
_command_duration() {
local command_duration command_start current_time
local minutes seconds deciseconds
local command_start_sseconds current_time_seconds command_start_deciseconds current_time_deciseconds
current_time=$(date +%s.%1N)
if [[ -f "$COMMAND_DURATION_FILE" ]]; then
command_start=$(< "$COMMAND_DURATION_FILE")
command_start_sseconds=${command_start%.*}
current_time_seconds=${current_time%.*}
command_start_deciseconds=$((10#${command_start#*.}))
current_time_deciseconds=$((10#${current_time#*.}))
# seconds
command_duration=$((current_time_seconds - command_start_sseconds))
if ((current_time_deciseconds >= command_start_deciseconds)); then
deciseconds=$(((current_time_deciseconds - command_start_deciseconds)))
else
((command_duration -= 1))
deciseconds=$((10 - ((command_start_deciseconds - current_time_deciseconds))))
fi
command rm "$COMMAND_DURATION_FILE"
else
command_duration=0
fi
if ((command_duration > 0)); then
minutes=$((command_duration / 60))
seconds=$((command_duration % 60))
fi
if ((minutes > 0)); then
printf "%s%s%dm %ds" "$COMMAND_DURATION_ICON" "$COMMAND_DURATION_COLOR" "$minutes" "$seconds"
elif ((seconds >= COMMAND_DURATION_MIN_SECONDS)); then
printf "%s%s%d.%01ds" "$COMMAND_DURATION_ICON" "$COMMAND_DURATION_COLOR" "$seconds" "$deciseconds"
fi
}
preexec_functions+=(_command_duration_pre_exec)

View File

@ -1,106 +1,99 @@
# shellcheck shell=bash #!/usr/bin/env bash
function _git-symbolic-ref() { function _git-symbolic-ref {
git symbolic-ref -q HEAD 2> /dev/null git symbolic-ref -q HEAD 2> /dev/null
} }
# When on a branch, this is often the same as _git-commit-description, # When on a branch, this is often the same as _git-commit-description,
# but this can be different when two branches are pointing to the # but this can be different when two branches are pointing to the
# same commit. _git-branch is used to explicitly choose the checked-out # same commit. _git-branch is used to explicitly choose the checked-out
# branch. # branch.
function _git-branch() { function _git-branch {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
if [[ -n "${VCS_STATUS_LOCAL_BRANCH:-}" ]]; then test -n "${VCS_STATUS_LOCAL_BRANCH}" && echo "${VCS_STATUS_LOCAL_BRANCH}" || return 1
echo "${VCS_STATUS_LOCAL_BRANCH}" else
else git symbolic-ref -q --short HEAD 2> /dev/null || return 1
return 1 fi
fi
else
git symbolic-ref -q --short HEAD 2> /dev/null || return 1
fi
} }
function _git-tag() { function _git-tag {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
if [[ -n "${VCS_STATUS_TAG:-}" ]]; then test -n "${VCS_STATUS_TAG}" && echo "${VCS_STATUS_TAG}"
echo "${VCS_STATUS_TAG}" else
fi git describe --tags --exact-match 2> /dev/null
else fi
git describe --tags --exact-match 2> /dev/null
fi
} }
function _git-commit-description() { function _git-commit-description {
git describe --contains --all 2> /dev/null git describe --contains --all 2> /dev/null
} }
function _git-short-sha() { function _git-short-sha {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
echo "${VCS_STATUS_COMMIT:0:7}" echo ${VCS_STATUS_COMMIT:0:7}
else else
git rev-parse --short HEAD git rev-parse --short HEAD
fi fi
} }
# Try the checked-out branch first to avoid collision with branches pointing to the same ref. # Try the checked-out branch first to avoid collision with branches pointing to the same ref.
function _git-friendly-ref() { function _git-friendly-ref {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
_git-branch || _git-tag || _git-short-sha # there is no tag based describe output in gitstatus _git-branch || _git-tag || _git-short-sha # there is no tag based describe output in gitstatus
else else
_git-branch || _git-tag || _git-commit-description || _git-short-sha _git-branch || _git-tag || _git-commit-description || _git-short-sha
fi fi
} }
function _git-num-remotes() { function _git-num-remotes {
git remote | wc -l git remote | wc -l
} }
function _git-upstream() { function _git-upstream {
local ref local ref
ref="$(_git-symbolic-ref)" || return 1 ref="$(_git-symbolic-ref)" || return 1
git for-each-ref --format="%(upstream:short)" "${ref}" git for-each-ref --format="%(upstream:short)" "${ref}"
} }
function _git-upstream-remote() { function _git-upstream-remote {
local upstream branch local upstream
upstream="$(_git-upstream)" || return 1 upstream="$(_git-upstream)" || return 1
branch="$(_git-upstream-branch)" || return 1 local branch
echo "${upstream%"/${branch}"}" branch="$(_git-upstream-branch)" || return 1
echo "${upstream%"/${branch}"}"
} }
function _git-upstream-branch() { function _git-upstream-branch {
local ref local ref
ref="$(_git-symbolic-ref)" || return 1 ref="$(_git-symbolic-ref)" || return 1
# git versions < 2.13.0 do not support "strip" for upstream format # git versions < 2.13.0 do not support "strip" for upstream format
# regex replacement gives the wrong result for any remotes with slashes in the name, # regex replacement gives the wrong result for any remotes with slashes in the name,
# so only use when the strip format fails. # so only use when the strip format fails.
git for-each-ref --format="%(upstream:strip=3)" "${ref}" 2> /dev/null || git for-each-ref --format="%(upstream)" "${ref}" | sed -e "s/.*\/.*\/.*\///" git for-each-ref --format="%(upstream:strip=3)" "${ref}" 2> /dev/null || git for-each-ref --format="%(upstream)" "${ref}" | sed -e "s/.*\/.*\/.*\///"
} }
function _git-upstream-behind-ahead() { function _git-upstream-behind-ahead {
git rev-list --left-right --count "$(_git-upstream)...HEAD" 2> /dev/null git rev-list --left-right --count "$(_git-upstream)...HEAD" 2> /dev/null
} }
function _git-upstream-branch-gone() { function _git-upstream-branch-gone {
[[ "$(git status -s -b | sed -e 's/.* //')" == "[gone]" ]] [[ "$(git status -s -b | sed -e 's/.* //')" == "[gone]" ]]
} }
function _git-hide-status() { function _git-hide-status {
[[ "$(git config --get bash-it.hide-status)" == "1" ]] [[ "$(git config --get bash-it.hide-status)" == "1" ]]
} }
function _git-status() { function _git-status {
local git_status_flags= local git_status_flags=
if [[ "${SCM_GIT_IGNORE_UNTRACKED:-}" == "true" ]]; then [[ "${SCM_GIT_IGNORE_UNTRACKED}" = "true" ]] && git_status_flags='-uno' || true
git_status_flags='-uno' git status --porcelain ${git_status_flags} 2> /dev/null
fi
git status --porcelain "${git_status_flags:---}" 2> /dev/null
} }
function _git-status-counts() { function _git-status-counts {
_git-status | awk ' _git-status | awk '
BEGIN { BEGIN {
untracked=0; untracked=0;
unstaged=0; unstaged=0;
@ -123,51 +116,85 @@ function _git-status-counts() {
}' }'
} }
function _git-remote-info() { function _git-remote-info {
local same_branch_name="" branch_prefix
# prompt handling only, reimplement because patching the routine below gets ugly
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
[[ "${VCS_STATUS_REMOTE_NAME?}" == "" ]] && return
[[ "${VCS_STATUS_LOCAL_BRANCH?}" == "${VCS_STATUS_REMOTE_BRANCH?}" ]] && same_branch_name=true
# no multiple remote support in gitstatusd
if [[ "${SCM_GIT_SHOW_REMOTE_INFO:-}" == "true" || "${SCM_GIT_SHOW_REMOTE_INFO:-}" == "auto" ]]; then
if [[ ${same_branch_name:-} != "true" ]]; then
remote_info="${VCS_STATUS_REMOTE_NAME?}/${VCS_STATUS_REMOTE_BRANCH?}"
else
remote_info="${VCS_STATUS_REMOTE_NAME?}"
fi
elif [[ ${same_branch_name:-} != "true" ]]; then
remote_info="${VCS_STATUS_REMOTE_BRANCH?}"
fi
if [[ -n "${remote_info:-}" ]]; then
# no support for gone remote branches in gitstatusd
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX:-}"
echo "${branch_prefix}${remote_info:-}"
fi
else
[[ "$(_git-upstream)" == "" ]] && return
[[ "$(_git-branch)" == "$(_git-upstream-branch)" ]] && same_branch_name=true # prompt handling only, reimplement because patching the routine below gets ugly
if [[ ("${SCM_GIT_SHOW_REMOTE_INFO}" == "auto" && "$(_git-num-remotes)" -ge 2) || if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
"${SCM_GIT_SHOW_REMOTE_INFO}" == "true" ]]; then [[ "${VCS_STATUS_REMOTE_NAME}" == "" ]] && return
if [[ ${same_branch_name:-} != "true" ]]; then [[ "${VCS_STATUS_LOCAL_BRANCH}" == "${VCS_STATUS_REMOTE_BRANCH}" ]] && local same_branch_name=true
# shellcheck disable=SC2016 local same_branch_name=
remote_info='$(_git-upstream)' [[ "${VCS_STATUS_LOCAL_BRANCH}" == "${VCS_STATUS_REMOTE_BRANCH}" ]] && same_branch_name=true
else # no multiple remote support in gitstatusd
remote_info="$(_git-upstream-remote)" if [[ "${SCM_GIT_SHOW_REMOTE_INFO}" = "true" || "${SCM_GIT_SHOW_REMOTE_INFO}" = "auto" ]]; then
fi if [[ "${same_branch_name}" != "true" ]]; then
elif [[ ${same_branch_name:-} != "true" ]]; then remote_info="${VCS_STATUS_REMOTE_NAME}/${VCS_STATUS_REMOTE_BRANCH}"
# shellcheck disable=SC2016 else
remote_info='$(_git-upstream-branch)' remote_info="${VCS_STATUS_REMOTE_NAME}"
fi fi
if [[ -n "${remote_info:-}" ]]; then elif [[ ${same_branch_name} != "true" ]]; then
local branch_prefix remote_info="${VCS_STATUS_REMOTE_BRANCH}"
if _git-upstream-branch-gone; then fi
branch_prefix="${SCM_THEME_BRANCH_GONE_PREFIX:-}" if [[ -n "${remote_info:-}" ]];then
else # no support for gone remote branches in gitstatusd
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX:-}" local branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX}"
fi echo "${branch_prefix}${remote_info}"
echo "${branch_prefix}${remote_info:-}" fi
fi else
fi [[ "$(_git-upstream)" == "" ]] && return
[[ "$(_git-branch)" == "$(_git-upstream-branch)" ]] && local same_branch_name=true
local same_branch_name=
[[ "$(_git-branch)" == "$(_git-upstream-branch)" ]] && same_branch_name=true
if [[ ("${SCM_GIT_SHOW_REMOTE_INFO}" = "auto" && "$(_git-num-remotes)" -ge 2) ||
"${SCM_GIT_SHOW_REMOTE_INFO}" = "true" ]]; then
if [[ "${same_branch_name}" != "true" ]]; then
remote_info="\$(_git-upstream)"
else
remote_info="$(_git-upstream-remote)"
fi
elif [[ ${same_branch_name} != "true" ]]; then
remote_info="\$(_git-upstream-branch)"
fi
if [[ -n "${remote_info:-}" ]];then
local branch_prefix
if _git-upstream-branch-gone; then
branch_prefix="${SCM_THEME_BRANCH_GONE_PREFIX}"
else
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX}"
fi
echo "${branch_prefix}${remote_info}"
fi
fi
}
# Unused by bash-it, present for API compatibility
function git_status_summary {
awk '
BEGIN {
untracked=0;
unstaged=0;
staged=0;
}
{
if (!after_first && $0 ~ /^##.+/) {
print $0
seen_header = 1
} else if ($0 ~ /^\?\? .+/) {
untracked += 1
} else {
if ($0 ~ /^.[^ ] .+/) {
unstaged += 1
}
if ($0 ~ /^[^ ]. .+/) {
staged += 1
}
}
after_first = 1
}
END {
if (!seen_header) {
print
}
print untracked "\t" unstaged "\t" staged
}'
} }

View File

@ -1,8 +0,0 @@
# shellcheck shell=bash
if _command_exists oh-my-posh; then
export POSH_THEME=${POSH_THEME:-https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/v$(oh-my-posh --version)/themes/jandedobbeleer.omp.json}
eval "$(oh-my-posh --init --shell bash --config "${POSH_THEME}")"
else
_log_warning "The oh-my-posh binary was not found on your PATH. Falling back to your existing PS1, please see the docs for more info."
fi

View File

@ -1,18 +1,18 @@
# shellcheck shell=bash #!/usr/bin/env bash
function _p4-opened { function _p4-opened {
timeout 2.0s p4 opened -s 2> /dev/null timeout 2.0s p4 opened -s 2> /dev/null
} }
function _p4-opened-counts { function _p4-opened-counts {
# Return the following counts seperated by tabs: # Return the following counts seperated by tabs:
# - count of opened files # - count of opened files
# - count of pending changesets (other than defaults) # - count of pending changesets (other than defaults)
# - count of files in the default changeset # - count of files in the default changeset
# - count of opened files in add mode # - count of opened files in add mode
# - count of opened files in edit mode # - count of opened files in edit mode
# - count of opened files in delete mode # - count of opened files in delete mode
_p4-opened | awk ' _p4-opened | awk '
BEGIN { BEGIN {
opened=0; opened=0;
type_array["edit"]=0; type_array["edit"]=0;

View File

@ -2,7 +2,7 @@
# git branch parser # git branch parser
function parse_git_branch() { function parse_git_branch() {
echo -e "\[\033[1;34m\]$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/')\[\033[0m\]" echo -e "\033[1;34m$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/')\033[0m"
} }
function parse_git_branch_no_color() { function parse_git_branch_no_color() {

View File

@ -1,5 +1,3 @@
# shellcheck shell=bash
# port of zork theme # port of zork theme
# set colors for use throughout the prompt # set colors for use throughout the prompt
@ -52,7 +50,7 @@ function is_integer() { # helper function for todo-txt-count
todo_txt_count() { todo_txt_count() {
if `hash todo.sh 2>&-`; then # is todo.sh installed if `hash todo.sh 2>&-`; then # is todo.sh installed
count=`todo.sh ls | grep -E "TODO: [0-9]+ of ([0-9]+) tasks shown" | awk '{ print $4 }'` count=`todo.sh ls | egrep "TODO: [0-9]+ of ([0-9]+) tasks shown" | awk '{ print $4 }'`
if is_integer $count; then # did we get a sane answer back if is_integer $count; then # did we get a sane answer back
echo "${BRACKET_COLOR}[${STRING_COLOR}T:$count${BRACKET_COLOR}]$normal" echo "${BRACKET_COLOR}[${STRING_COLOR}T:$count${BRACKET_COLOR}]$normal"
fi fi

File diff suppressed because it is too large Load Diff