Compare commits

...

128 Commits

Author SHA1 Message Date
Gurkirat Singh e38696a0ac
fix (completion): suppress 1091 in brew (#2130) 2023-02-23 10:38:04 -08:00
OMEGA_RAZER af11a50854
Allow for longer command min duration (#2198)
Allows for setting "COMMAND_DURATION_MIN_SECONDS" to more than 60 seconds without adding to prompt. Previously always showed with lengths over 60 seconds regardless of setting.
2023-02-22 08:24:30 -08:00
Gurkirat Singh 05ef68acbc
Implement yarn completion (#2190)
* feat (completion): add yarn completion
2023-02-22 08:20:45 -08:00
Gurkirat Singh 78f88406cf
Fix lint errors in multiple files (#2192)
* fix (plugins): enable interpretation of backslash escapes in colors
* fix (lint): disable SC2317 in install.sh
* fix (lint): SC2086 in agnoster theme
* fix (lint): remove exit from install.sh as it is already implemented in the calling function
2023-02-22 08:19:12 -08:00
BF feb468b517
bug: Use C style strings when checking for invalid alias characters (#2188)
* Use C style strings when checking for invalid alias characters

Before, the '\n' would be interpreted as 'n' meaning that any alias
who's command contained the letter 'n' would incorrect be skipped.

* No need to escape characters in this context

Escaping was just adding \ to the list multiple times

Co-authored-by: David Farrell <davidpfarrell+github@gmail.com>
2023-01-25 15:56:14 -08:00
Noah Gorny 66ae9b0de8
Remove libra chat reference
We will try to use Github Discussions now.
2022-12-06 00:22:27 +02:00
Noah Gorny 2e52d2a77c
Merge pull request #2109 from tbhaxor/feature/terraform-alias
Add terraform init alias
2022-12-06 00:15:40 +02:00
Noah Gorny 4c2e644db1
Merge pull request #2159 from bittner/patch-3
Add more aliases for `git branch`, use long form
2022-12-05 23:15:13 +02:00
Peter Bittner f0941e9ba2 Add more aliases for `git branch`, use long form
Git can list local branches, remote branches, and both of them together.
Let's use the long form of the options to make the aliases quicker to understand.

As agreed in PR #2159, we introduce gbl and replace gba/gbr by gbla/gblr.
gbl/gbla/gblr allow wildcard arguments for filtering branch names.
2022-12-05 11:01:57 +01:00
Noah Gorny ad2b55804e
Merge pull request #2172 from davidpfarrell/bug/duration_locale
bug: Use en_US when fetching EPOCHREALTIME
2022-12-04 00:42:05 +02:00
Noah Gorny ec3c06fa33
Merge pull request #2166 from cornfeedhobo/rename-kubectl-alias-func
remove function wrapper around kubectl aliases
2022-12-04 00:39:49 +02:00
Noah Gorny 686a5e45cb
Merge pull request #2146 from dylanjtuttle/update_bash_branch
Added update-bash section in README
2022-12-04 00:39:17 +02:00
Noah Gorny cfe46e3d36
Merge pull request #2170 from Royalsspirit/fix/parrot-theme-escape-sequence
fix(theme): use correct escape sequence to avoid weird text overwriting
2022-12-04 00:37:47 +02:00
cornfeedhobo 5f59cb5438
remove function wrapper around kubectl alias registration 2022-10-31 08:08:10 -05:00
David Farrell 7c7e4f90ec
bug: Use en_US when fetching EPOCHREALTIME
Isolates fetching of EPOCHREALTIME to a function which sets LC_ALL=en_US.UTF-8.
This ensures that the value is in decimal format, regardless of runtime locale.

bug: Hide duration when no command executed
2022-10-30 15:18:09 -07:00
David Farrell 1c9cfd056b
bug:Install shellcheck wget (#2173)
Installs shellcheck via wget of github release for 'stable' linux version
2022-10-30 15:15:28 -07:00
gmajkic 7c77223b15 fix(theme): use correct escape sequence to avoid weird text overwriting 2022-10-14 09:43:51 +02:00
David Farrell 00062bfcb6
chore: Use grep -E / grep -F instead of egrep / fgrep (#2164)
Ensures that the -E or -F option, when used, is the first option
* i.e. grep -oE => grep -E -o

Updates _bash-it-grep to invoke grep with just the provided arguments
* This function was (and still is) unused, but decided this new functionality was actually more useful

Introduces _bash-it-fgrep to invoke grep -F

Removes type -P egrep from the _bash-it-*grep functions

For usages that were already going to be modified, use -F if appropriate
* Does not touch grep usages that may have benefited from -F, but were not otherwise considered for this PR

Adds shellcheck header to modified .bash files that didn't already have it
2022-10-13 10:34:57 -07:00
Noah Gorny bf2034d13d
Merge pull request #2158 from bittner/patch-2
Verbose version of `git add` (gav)
2022-09-28 12:04:38 +03:00
Dylan Tuttle c222e5001c Merge branch 'update_bash_branch' of github.com:dylanjtuttle/bash-it into update_bash_branch 2022-09-22 16:52:05 -06:00
Dylan Tuttle 606272ac23 Fixed broken code blocks in troubleshooting.rst 2022-09-22 16:49:26 -06:00
Dylan Tuttle d237ab9aa4
Merge branch 'master' into update_bash_branch 2022-09-22 16:30:51 -06:00
Dylan Tuttle 0ab80429ce Removed Bash Dependency section from README and added it to troubleshooting.rst 2022-09-22 16:27:52 -06:00
Noah Gorny 8bedbe47a7
Merge pull request #2161 from brianphillips/patch-2
Update variable name to match projects.plugin.bash
2022-09-13 20:08:18 +03:00
Brian Phillips e5e7785c96
Update variable name to match projects.plugin.bash
The projects plugin was changed to reference `BASH_IT_PROJECT_PATHS` but the completion was still using `PROJECT_PATHS`
2022-08-30 13:21:03 -05:00
Peter Bittner 3294df5d3e
Verbose version of `git add` (gav) 2022-08-26 07:04:07 +02:00
Noah Gorny d770030513
Merge pull request #2154 from jakebman/gitlab-runner-deprecation
Update Gitlab Runner images
2022-08-17 07:17:42 +03:00
Jake Boeckerman 407f2f5b5f Update github runner images
Github deprecated and will remove two runner images

macos-10.15 will be removed on 2022-08-30
macos-12 is available
https://github.blog/changelog/2022-07-20-github-actions-the-macos-10-15-actions-runner-image-is-being-deprecated-and-will-be-removed-by-8-30-22/

ubuntu-18.04 will be removed on 2022-12-01
ubuntu-22.04 is available
https://github.blog/changelog/2022-08-09-github-actions-the-ubuntu-18-04-actions-runner-image-is-being-deprecated-and-will-be-removed-by-12-1-22/
2022-08-12 11:39:22 -06:00
John D Pell 5a62acd253
Merge pull request #2152 from thomasmerz/issue_2151 2022-08-11 09:08:37 -07:00
Thomas Merz 129340d24d
Issue 2151 🛂 do not give users a root shell by executing arbitrary shell commands by 'vim'
also by removing 'sudo' aliases because bash-it should not be
              the business of mucking about with sudo at all
2022-08-11 17:22:57 +02:00
Noah Gorny 2ef5d483e3
Merge pull request #2135 from tbhaxor/improve/flutter-completion
Clean flutter completions
2022-05-19 00:11:54 +03:00
Noah Gorny 03b3a977aa
Merge pull request #2147 from davidpfarrell/dirs-bks
plugin(dirs): Create backup file parent directory
2022-05-19 00:01:58 +03:00
David Farrell c0dc83edfc
plugin(dirs): Create backup file parent directory 2022-05-09 13:08:52 -07:00
Dylan Tuttle f2bc6c4e6d Added update-bash section in README 2022-05-08 00:49:27 -06:00
Noah Gorny 4dddba3bc6
Merge pull request #2145 from tbhaxor/bugfix/docs
Upgrade the sphinx version
2022-05-07 23:29:43 +03:00
Gurkirat Singh c2698882e4
fix (docs): ugraded sphinx version 2022-05-07 00:32:15 +05:30
Gurkirat Singh 135d480c7d
improve (docs): exclude venv pattern in build 2022-05-07 00:31:21 +05:30
Gurkirat Singh e11576f260
fix (completion): shfmt format flutter.completion.bash 2022-05-06 23:32:47 +05:30
Gurkirat Singh d7fb6b3235
improve (lint): add completion/available/flutter.completion.bash entry 2022-05-06 23:32:45 +05:30
Noah Gorny 35334cdcb0
Merge pull request #2121 from BarbUk/update/theme_barbuk
Update of barbuk theme (add modular blocks)
2022-04-13 00:22:04 +03:00
Noah Gorny b95094153f
Merge pull request #2139 from tbhaxor/patch-3
Improve bashit upgrade function git log and add missing popd
2022-04-06 23:06:52 +03:00
Gurkirat Singh 6ccd9f5adf
fix (helpers): bashit_update function return to source path and --no-merges in log 2022-03-21 08:52:46 +05:30
Noah Gorny 1ffbc85a62
Merge pull request #2138 from eviweb/fix-projects-plugin-regression
fix projects plugin regression
2022-03-16 21:54:51 +02:00
Noah Gorny 60c4c0b598
Merge pull request #2132 from NoahGorny/add-default-editor-nano
general: Add default nano editor for the edit alias
2022-03-16 21:47:02 +02:00
Eric Villard 088212fd32 fix projects plugin regression
This regression was introduced in ea2002a.

Before this commit, when the provided project was unique under all the
project paths, the command automatically change the directory to it.
Currently this is no more the case.
If there are many project paths set, then the project path menu is shown
at every call.
This PR solves this issue.

Signed-off-by: Eric Villard <dev@eviweb.fr>
2022-03-16 08:43:52 +01:00
Noah Gorny d1b831a92d
Merge pull request #2119 from BarbUk/fix/command_duration_precision
Fix/command duration precision
2022-03-14 11:59:27 +02:00
Noah Gorny 69407018a7
Merge pull request #2129 from tbhaxor/fix/awscli-completion
Clean awscli completion
2022-03-14 11:55:44 +02:00
Noah Gorny a481ff41ab general: Add default nano editor for the edit alias 2022-03-14 11:20:40 +02:00
Noah Gorny 7cc2ced3b9
Merge pull request #2122 from BarbUk/fix/grep_path
Fix grep path when a grep alias exists
2022-03-14 10:58:48 +02:00
Gurkirat Singh 66fbed7f6f
fix (completion): format awscli 2022-03-13 05:21:13 +05:30
Gurkirat Singh 6b0ca17df0
improve (lint): add awscli.completion.bash in clean_files.txt 2022-03-13 05:20:57 +05:30
BarbUk 23efb39fb0
Fix grep path when a grep alias exists 2022-03-11 09:08:58 +01:00
BarbUk 9a71556b99
shfmt needs more spaces 2022-03-09 22:04:18 +01:00
BarbUk e1ddf6e311
Fix dynamic clock icon (#2120)
* Fix dynamic clock icon

* Use printf variable scope

* shfmt do not like spaces
2022-03-09 22:59:48 +02:00
BarbUk 0068315c35
Update documentation 2022-03-09 21:38:03 +01:00
BarbUk b839294827
Complete rework 2022-03-09 21:29:51 +01:00
BarbUk 634c1f8c18
Fix spacing in string output 2022-03-09 11:01:53 +01:00
BarbUk 4686ce1f12
Fix precision to use deciseconds instead of nanoseconds 2022-03-09 09:38:16 +01:00
Noah Gorny a6fd93076d
Merge pull request #2114 from NoahGorny/fix-preview
Fix bash-it preview
2022-03-08 16:59:02 +02:00
Noah Gorny 13531c9534 lib: search: Increase delay in _bash-it-flash-term to 0.2 secs 2022-03-08 00:02:23 +02:00
Noah Gorny 77c135956d lib: preview: Load only bash-it.sh when previewing
Otherwise you change your theme to your default...
2022-03-08 00:01:37 +02:00
Noah Gorny 23ac376f10
Merge pull request #2110 from tbhaxor/feature/osx-alias
Add open brave browser alias
2022-03-07 00:25:36 +02:00
Ira Abramov ec6d371db8
Add a 'theme' for OMP, so the internal themes don't clash with it. (#2100)
* Add a 'theme' for OMP, so the internal themes don't clash with it.

* Add theme to clean_files

* Add screenshot to the docs

* Correct the name of the default theme in the docs.

* keeping it cleaner

Co-authored-by: Ira Abramov <github@ira.abramov.org>
2022-03-07 00:23:49 +02:00
John D Pell db6fd42104
Merge pull request #2108 from tbhaxor/patch-3
fix test file path in `clean_files.txt` from the 7fcad6e commit
2022-03-06 12:17:25 -08:00
Gurkirat Singh f2b4d82527 feature (alias): add open brave browser 2022-03-06 12:00:23 +05:30
Gurkirat Singh 6ba527ff98 feature (alias): add terraform init alias 2022-03-06 11:41:27 +05:30
Gurkirat Singh 55e698a737
fix test file path from the 7fcad6ed0d commit 2022-03-06 04:25:33 +05:30
John D Pell 3a778072db
Merge pull request #1906 from gaelicWizard/command_duration
Revamp command duration helper/plugin
2022-03-04 13:00:05 -08:00
John D Pell 866e5be86b lib/command_duration: tests & whitespace 2022-03-04 12:58:07 -08:00
John D Pell 1c2fc2837f lib/command_duration: adopt `_bash_it_library_finalize_hook` 2022-03-04 12:58:07 -08:00
John D Pell 4e0e59230b lib/command_duration: rename `theme/command_duration.theme`
Rename the `theme/command_duration.theme` file as it's not really got anything to do with theming or SCM.
2022-03-04 12:58:07 -08:00
John D Pell 6ca10cf84c plugin/cmd-returned-notify: Rewrite to match/use `lib/command_duration`
Use `$EPOCHREALTIME` (or `$SECONDS`) built-in variable provided by Bash instead of `date +%s`. We're only measuing the difference in seconds, so avoid both the binary invocation as well as the subshell.

Alsö, Reduce environmental pollution by not exporting every variable, and unsetting when done.

Change variable names to match lib/command-duration

Remove `preexec_return_notification()` in favor of `lib/command-duration`'s `_command_duration_pre_exec()`.

This should now use the same preexec hook and variables as the theme library `command_duration`.

tests: handle nanoseconds
2022-03-04 12:58:07 -08:00
John D Pell 33505d4db1 lib/command_duration: Refactor using `$EPOCHREALTIME`
Fallback to `$SECONDS` for older versions of _Bash_.

Instead of shortcircuiting the definition, just short-circuit the function. This allows the variable to be set later, e.g. on theme change.
2022-03-04 12:58:07 -08:00
John D Pell 09e8c25b64 lib/command_duration: dynamic clock hand
Calculate the position (from 1 to 12) of the hour hand on the clock emoji used for the _command_duration string.

Expressly handle COMMAND_DURATION_COLOR as blank when undefined.
2022-03-04 12:39:58 -08:00
John D Pell ad1d73aaa1 lib/command_duration: remove temporary files 2022-03-04 12:39:02 -08:00
John D Pell ca8101b34a
Merge pull request #2031 from gaelicWizard/bats-cleanup 2022-03-04 11:25:06 -08:00
Noah Gorny 9dece7fe58
Merge pull request #2105 from gaelicWizard/bats/upower
plugin/battery: fix handling of multiple batteries with `upower`
2022-03-04 20:58:17 +02:00
Noah Gorny 49649c5f0c
Merge pull request #2028 from gaelicWizard/plugin/base
lib/appearance: export `$CLICOLOR` instead of `$LSCOLOR`
2022-03-04 20:50:33 +02:00
Noah Gorny 6a53066b05
Merge pull request #2077 from Console-Utils/feature/issue-forms
Upgrade to GitHub issue forms
2022-03-04 20:49:54 +02:00
Noah Gorny 53e5965f2d
Merge pull request #2038 from gaelicWizard/theme/base
lib/theme: `shfmt`, `shellcheck`, and some cleanup
2022-03-04 20:49:24 +02:00
John D Pell 999b787c92 Close #2082 2022-03-04 00:07:35 -08:00
John D Pell 0286a50fcd lib/appearance: export `$CLICOLOR` instead of `$LSCOLOR`
Alsö, since the *value* of `$CLICOLOR` is not used anywhere, overload it to count the number of colors available for use elsewhere.
2022-03-03 23:58:55 -08:00
John D Pell f7cba27f10 lib/appearance: `shellcheck` && `shfmt` 2022-03-03 23:58:55 -08:00
John D Pell 029e53a433 plugin/battery: fix handling of multiple batteries with `upower` 2022-03-03 23:45:40 -08:00
John D Pell 6d422f17e4 Revert dc380e9ed6 2022-03-03 23:33:05 -08:00
John D Pell dc380e9ed6 test/battery: fix tests… 2022-03-03 23:14:33 -08:00
John D Pell 6734baf950 test/base: lose old TravisCS skip 2022-03-03 23:02:29 -08:00
John D Pell df87b41635 lib/theme: use `_command_exists()` in `rbenv_version_prompt()` 2022-03-03 22:54:09 -08:00
John D Pell 7762aa687a lib/theme: `local hg_root` in `hg_prompt_vars()` 2022-03-03 22:54:09 -08:00
John D Pell c9efc161ff lib/theme: improve performance of `scm()`
- Don't invoke the source control utility when all we want to know is if we're somewhere inside the repository; use `_bash-it-find-in-ancestor()`.
2022-03-03 22:54:09 -08:00
John D Pell d86a182b6e lib/theme: export `$LS_COLORS` et al 2022-03-03 22:54:09 -08:00
John D Pell c6ac9109d7 lib/theme: parameter cleanup
Improve handling of parameters by adding defaults (often blank).

Alsö, eliminate newlines from `echo` in many places.
2022-03-03 22:54:09 -08:00
John D Pell 2b3af0d8c9 lib/theme: eliminate a lot of subshells
A lot of useless `echo`s in here.
2022-03-03 22:54:09 -08:00
John D Pell ac0d91b682 lib/theme.githelpers: remove dead code
Five years deprecation is plenty warning.
2022-03-03 22:54:09 -08:00
John D Pell 1d73537dbf lib/theme: `shfmt` && `shellcheck`
My apologies to future `git blame` hunters ♥

Use the "short" host name by default (`\h`), not the fully qualified domain name (`\H`)...

lib/theme: don't redefine battery_char()

Combine the two definitions for `battery_char()` so the second one doesn't just overwrite the first one. Do one or the other, not both.

Don't evaluate if `battery_percentage()` is available at load time, evaluate it at run time.

Don't run `date` for `$THEME_TIME_FORMAT`, use `\D{fmt}`.
2022-03-03 22:54:09 -08:00
John D Pell 6bacd5fb1c lib/githelpers: `shfmt` && `shellcheck`
My apologies to future `git blame` hunters ♥
2022-03-03 22:54:08 -08:00
John D Pell fbc5d0a5af lib/p4helpers: `shfmt`
My apologies to future `git blame` hunters ♥
2022-03-03 22:53:13 -08:00
John D Pell 0e0e0d3035 lib/theme: Fix a *few* SC2154
These variables are referenced by themes already linted.
2022-03-03 22:53:13 -08:00
John D Pell a9dda3d358 test/preexec: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 0d55a2406c test/base: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell f0dfe1a67f test/theme: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell b686515877 test/xterm: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell a36a4c4038 test/ruby: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell fbf7efa1b8 test/go: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 4a9df8ec88 test/cmd-returned-notify: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 6e2e0af7f9 test/battery: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell beac9c430a test/aliases: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell fd91211704 test/utilities: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 629a1b0c0d test/search: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell e5cd10112c test/log: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 1ddec65d56 test/helpers: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 425ef3e10a test/composure: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell 2a95e983d0 test/install: adopt newly revamped `setup()`
test/uninstall: adopt newly revamped `setup()`

test/install: `local_setup_file()`
2022-03-03 22:43:17 -08:00
John D Pell c837232643 test/bash-it: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell de31a308f9 test/bash_it: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell fd1771d45c test/base: adopt newly revamped `setup()` 2022-03-03 22:43:17 -08:00
John D Pell cb9b999f06 BATS: de-parallelize
Run the test *files* in parallel, but not the tests *within* the files. This can be reverted after configuration (i.e., `$BASH_IT/enabled` et al) lives *outside* the repo.
2022-03-03 22:43:17 -08:00
John D Pell 014c102b71 BATS: revamp test `setup()` and `setup_test_fixture()` 2022-03-03 22:43:17 -08:00
Noah Gorny fdff1d81cd
Merge pull request #2103 from Bash-it/revert-2101-add-bashcov-report
Revert "ci: Add bashcov codecov report"
2022-03-03 22:39:47 +02:00
Noah Gorny 5c592c9a6f
Revert "ci: Add bashcov codecov report" 2022-03-03 22:37:39 +02:00
Noah Gorny 1722ea963e
ci: Add bashcov codecov report (#2101) 2022-03-03 21:37:34 +02:00
Noah Gorny be755d63af ci: Add bashcov codecov report 2022-03-02 23:44:42 +02:00
EmilySeville7cfg df1881acfa Room for extra details for:
- bug report
- feature request
2022-02-20 18:47:44 +10:00
EmilySeville7cfg 2927f672fd More user-friendly hints in bug report 2022-02-20 18:45:08 +10:00
Gurkirat Singh 2b8928f2bd
Make the ls color available for macos 2022-02-08 14:27:48 +05:30
EmilySeville7cfg dfe681d223 Add config for issue forms 2022-02-07 10:51:40 +10:00
EmilySeville7cfg eb91f4ec69 Refresh feature request:
- use issue forms
2022-02-07 10:47:42 +10:00
EmilySeville7cfg a4e41badf1 Refresh bug report:
- use issue forms
2022-02-07 10:43:23 +10:00
79 changed files with 2473 additions and 1068 deletions

View File

@ -1,46 +0,0 @@
---
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

@ -0,0 +1,85 @@
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

@ -0,0 +1,5 @@
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

@ -1,23 +0,0 @@
---
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

@ -0,0 +1,34 @@
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:
strategy:
matrix:
os: [ubuntu-20.04, ubuntu-18.04, macos-10.15, macos-11]
os: [ubuntu-20.04, ubuntu-22.04, macos-12, macos-11]
runs-on: ${{ matrix.os }}
@ -49,10 +49,17 @@ jobs:
uses: actions/setup-python@v2
with:
python-version: 3.8
# - name: Update APT Package Lists
# run: sudo apt-get update
- name: Install shfmt
run: GO111MODULE=on go get mvdan.cc/sh/v3/cmd/shfmt
- name: Install shellcheck
run: brew install shellcheck
env:
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
run: python3 -m pip install -r test/lint-requirements.txt
- name: Run lint

View File

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

View File

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

View File

@ -1,7 +1,6 @@
# shellcheck shell=bash
about-alias 'kubectl aliases'
function _set_pkg_aliases() {
if _command_exists kubectl; then
alias kc='kubectl'
alias kcgp='kubectl get pods'
@ -15,6 +14,3 @@ function _set_pkg_aliases() {
# launches a disposable netshoot pod in the k8s cluster
alias kcnetshoot='kubectl run netshoot-$(date +%s) --rm -i --tty --image nicolaka/netshoot -- /bin/bash'
fi
}
_set_pkg_aliases

View File

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

View File

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

View File

@ -51,8 +51,6 @@ if [[ -n "${BASH_IT_THEME:-}" ]]; then
source "${BASH_IT}/themes/githelpers.theme.bash"
BASH_IT_LOG_PREFIX="themes: p4helpers: "
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: "
source "${BASH_IT}/themes/base.theme.bash"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,5 @@
# 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,7 +4,6 @@
![Docs Status](https://readthedocs.org/projects/bash-it/badge/)
![License](https://img.shields.io/github/license/Bash-it/bash-it)
![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+.
(And a shameless ripoff of [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) :smiley:)

View File

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

View File

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

View File

@ -8,13 +8,35 @@ A minimal theme with a clean git prompt
Provided Information
--------------------
* Current git remote tool logo (support: github, gitlab, bitbucket)
* Current path (red when user is root)
* Current git info
* Last command exit code (only shown when the exit code is greater than 0)
* 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
----------------
@ -39,6 +61,12 @@ Default theme glyphs
BARBUK_EXIT_CODE_ICON=' '
BARBUK_PYTHON_VENV_CHAR=' '
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
^^^^^^^^^^^^^^^^

View File

@ -346,6 +346,19 @@ NWinkler
: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

View File

@ -0,0 +1,15 @@
.. _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,9 +8,38 @@ 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 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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**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.
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,7 +12,6 @@ function _bash-it_show_usage() {
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 "--overwrite-backup (-f): Overwrite existing backup"
exit 0
}
# enable a thing

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -60,15 +60,21 @@ function _bash-it-array-dedup() {
printf '%s\n' "$@" | sort -u
}
# Outputs a full path of the grep found on the filesystem
# Runs `grep` with *just* the provided arguments
function _bash-it-grep() {
: "${BASH_IT_GREP:=$(type -p egrep || type -p grep)}"
printf "%s" "${BASH_IT_GREP:-/usr/bin/grep}"
: "${BASH_IT_GREP:=$(type -P grep)}"
"${BASH_IT_GREP:-/usr/bin/grep}" "$@"
}
# Runs `grep` with extended regular expressions
# Runs `grep` with fixed-string expressions (-F)
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() {
: "${BASH_IT_GREP:=$(type -p egrep || type -p grep)}"
: "${BASH_IT_GREP:=$(type -P grep)}"
"${BASH_IT_GREP:-/usr/bin/grep}" -E "$@"
}
@ -150,12 +156,12 @@ function _bash-it-component-list-matching() {
function _bash-it-component-list-enabled() {
local IFS=$'\n' component="$1"
_bash-it-component-help "${component}" | _bash-it-egrep '\[x\]' | awk '{print $1}' | sort -u
_bash-it-component-help "${component}" | _bash-it-fgrep '[x]' | awk '{print $1}' | sort -u
}
function _bash-it-component-list-disabled() {
local IFS=$'\n' component="$1"
_bash-it-component-help "${component}" | _bash-it-egrep -v '\[x\]' | awk '{print $1}' | sort -u
_bash-it-component-help "${component}" | _bash-it-fgrep -v '[x]' | awk '{print $1}' | sort -u
}
# 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
mapfile -t FILES < <(
cat clean_files.txt \
| grep -v -E '^\s*$' \
| grep -v -E '^\s*#' \
| grep -E -v '^\s*$' \
| grep -E -v '^\s*#' \
| xargs -n1 -I{} find "{}" -type f
)

View File

@ -1,3 +1,4 @@
# shellcheck shell=bash
cite about-plugin
about-plugin 'AWS helper functions'
@ -40,13 +41,13 @@ function __awskeys_help {
function __awskeys_get {
local ln=$(grep -n "\[ *$1 *\]" "${AWS_SHARED_CREDENTIALS_FILE}" | cut -d ":" -f 1)
if [[ -n "${ln}" ]]; then
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}" | egrep -m 1 "aws_session_token"
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}" | grep -F -m 1 "aws_session_token"
fi
}
function __awskeys_list {
local credentials_list="$((egrep '^\[ *[a-zA-Z0-9_-]+ *\]$' "${AWS_SHARED_CREDENTIALS_FILE}"; grep "\[profile" "${AWS_CONFIG_FILE}" | sed "s|\[profile |\[|g") | sort | uniq)"
local credentials_list="$((grep -E '^\[ *[a-zA-Z0-9_-]+ *\]$' "${AWS_SHARED_CREDENTIALS_FILE}"; grep "\[profile" "${AWS_CONFIG_FILE}" | sed "s|\[profile |\[|g") | sort | uniq)"
if [[ -n $"{credentials_list}" ]]; then
echo -e "Available credentials profiles:\n"
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() {
local batteries
if _command_exists upower; then
batteries="$(upower -e | grep --max-count=1 -i BAT)"
upower -i "${batteries}" | grep 'state' | grep -q 'charging\|fully-charged'
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT)
upower -i "${batteries[0]:-}" | grep 'state' | grep -q 'charging\|fully-charged'
elif _command_exists acpi; then
acpi -a | grep -q "on-line"
elif _command_exists pmset; then
@ -20,8 +20,8 @@ function ac_adapter_connected() {
function ac_adapter_disconnected() {
local batteries
if _command_exists upower; then
batteries="$(upower -e | grep --max-count=1 -i BAT)"
upower -i "${batteries}" | grep 'state' | grep -q 'discharging'
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT)
upower -i "${batteries[0]:-}" | grep 'state' | grep -q 'discharging'
elif _command_exists acpi; then
acpi -a | grep -q "off-line"
elif _command_exists pmset; then
@ -40,8 +40,8 @@ function battery_percentage() {
local command_output batteries
if _command_exists upower; then
batteries="$(upower --enumerate | grep --max-count=1 -i BAT)"
command_output="$(upower --show-info "${batteries:-}" | grep percentage | grep -o '[0-9]\+' | head -1)"
IFS=$'\n' read -d '' -ra batteries < <(upower -e | grep -i BAT)
command_output="$(upower --show-info "${batteries[0]:-}" | grep percentage | grep -o '[0-9]\+' | head -1)"
elif _command_exists acpi; then
command_output=$(acpi -b | awk -F, '/,/{gsub(/ /, "", $0); gsub(/%/,"", $0); print $2}')
elif _command_exists pmset; then

View File

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

View File

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

View File

@ -63,13 +63,16 @@ function dirs-help() {
if [[ -f "${BASH_IT_DIRS_BKS?}" ]]; then
# shellcheck disable=SC1090
source "${BASH_IT_DIRS_BKS?}"
elif [[ -f ~/.dirs ]]; then
else
mkdir -p "${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
alias L='cat "${BASH_IT_DIRS_BKS?}"'

View File

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

View File

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

View File

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

View File

@ -1,19 +1,11 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
function local_setup {
setup_test_fixture
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
function local_setup_file() {
# 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
cp -fRP "${BASH_IT?}/test/fixtures/bash_it"/* "${BASH_IT?}/" || true
# don't load any libraries as the tests here test the *whole* kit
}
@test "bash-it: verify that the test fixture is available" {

View File

@ -1,28 +1,30 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
function local_setup_file() {
setup_libs "helpers"
# Load something, anything...
load ../../completion/available/capistrano.completion
}
@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"
run load ../../completion/available/aliases.completion
run load "${BASH_IT?}/completion/available/aliases.completion.bash"
assert_success
}
@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'
run load ../../completion/available/aliases.completion
run load "${BASH_IT?}/completion/available/aliases.completion.bash"
assert_success
}
@test "alias-completion: See that having aliased rm command does not output unnecessary output" {
alias rm='rm -v'
run load ../../completion/available/aliases.completion
run load "${BASH_IT?}/completion/available/aliases.completion.bash"
refute_output
}

View File

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

View File

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

View File

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

View File

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

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

@ -1,21 +1,15 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load ../../plugins/available/base.plugin
load ../../lib/colors
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
function local_setup {
setup_test_fixture
function local_setup_file() {
setup_libs "colors"
load "${BASH_IT?}/plugins/available/base.plugin.bash"
}
function local_setup() {
# 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
cp -RP "$BASH_IT/test/fixtures/bash_it"/* "$BASH_IT/"
}
# TODO Create global __is_enabled function

View File

@ -1,11 +1,10 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../../lib/colors
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
load ../../lib/log
load ../../lib/helpers
load ../../plugins/available/base.plugin
function local_setup_file() {
setup_libs "log"
}
@test "lib log: basic debug logging with 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_precmd_function_name="test"
load ../test_helper_libs
setup_libs "preexec"
run __check_precmd_conflict "$test_precmd_function_name"
assert_failure
@ -124,7 +124,7 @@ function local_setup {
@test "lib preexec: __check_preexec_conflict()" {
test_preexec_function_name="test"
load ../test_helper_libs
setup_libs "preexec"
run __check_preexec_conflict "$test_preexec_function_name"
assert_failure
@ -137,7 +137,7 @@ function local_setup {
@test "lib preexec: safe_append_prompt_command()" {
test_precmd_function_name="test"
load ../test_helper_libs
setup_libs "preexec"
export precmd_functions=()
assert_equal "${precmd_functions[*]}" ""
@ -151,7 +151,7 @@ function local_setup {
@test "lib preexec: safe_append_preexec()" {
test_preexec_function_name="test"
load ../test_helper_libs
setup_libs "preexec"
export preexec_functions=()
assert_equal "${preexec_functions[*]}" ""

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

@ -1,28 +1,14 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
load ../../plugins/available/base.plugin
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_file() {
setup_libs "search"
}
function local_teardown {
export PATH="$OLD_PATH"
unset OLD_PATH
function local_setup() {
# shellcheck disable=SC2034
BASH_IT_SEARCH_USE_COLOR=false
}
@test "search: plugin base" {

View File

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

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

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

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

@ -1,9 +1,11 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
load ../../plugins/available/battery.plugin
function local_setup_file() {
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
# the name of the function that was passed in as an argument to `setup_command_exists`.
@ -199,8 +201,7 @@ function setup_upower {
function upower {
case $1 in
'-e'|'--enumerate')
# 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"
printf '%s\n' "$BAT0" "/org/freedesktop/UPower/devices/mouse_hid_${RANDOM}_battery"
;;
'-i'|'--show-info')
if [[ $2 == "$BAT0" ]]

View File

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

View File

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

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

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

View File

@ -1,21 +1,10 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
load ../../plugins/available/xterm.plugin
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
function local_setup_file() {
setup_libs "helpers"
load "${BASH_IT?}/plugins/available/xterm.plugin.bash"
}
@test "plugins xterm: shorten command output" {

View File

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

178
test/test_helper.bash 100755 → 100644
View File

@ -1,105 +1,117 @@
#!/usr/bin/env bats
load "${BASH_IT}/vendor/github.com/erichs/composure/composure.sh"
# shellcheck shell=bash
unset BASH_IT_THEME
unset GIT_HOSTING
unset NGINX_PATH
unset IRC_CLIENT
unset TODO
unset SCM_CHECK
unset BASH_IT_AUTOMATIC_RELOAD_AFTER_CONFIG_CHANGE
function setup_file() {
common_setup_file
}
export TEST_MAIN_DIR="${BATS_TEST_DIRNAME}/.."
export TEST_DEPS_DIR="${TEST_DEPS_DIR-${TEST_MAIN_DIR}/../test_lib}"
function common_setup_file() {
# export *everything* to subshells, needed to support tests
set -a
# be independent of git's system configuration
export GIT_CONFIG_NOSYSTEM
# Locate ourselves for easy reference.
TEST_MAIN_DIR="${MAIN_BASH_IT_DIR:-${BATS_TEST_DIRNAME?}/../..}/test"
TEST_DEPS_DIR="${MAIN_BASH_IT_DIR:-${TEST_MAIN_DIR}/..}/test_lib"
# Load the BATS modules we use:
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
}
local_teardown() {
true
}
# This function 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.
# 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/../../../.."
if command -v rsync &> /dev/null; then
# Use rsync to copy Bash-it to the temp folder
rsync -qavrKL -d --delete-excluded --exclude=.git --exclude=helper.bash --exclude=enabled "$src_topdir" "$BASH_IT"
else
rm -rf "$BASH_IT"
mkdir -p "$BASH_IT"
find "$src_topdir" \
-mindepth 1 -maxdepth 1 \
-not -name .git \
-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}"
# shellcheck disable=SC2034 # Clear any inherited environment:
XDG_DUMMY="" BASH_IT_DUMMY="" # avoid possible invalid reference:
unset "${!XDG_@}" "${!BASH_IT@}" # unset all BASH_IT* and XDG_* variables
unset GIT_HOSTING NGINX_PATH IRC_CLIENT TODO SCM_CHECK
# 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 this
# seems to set HOME explicitly to a separate location.
# which interferes with our tests. The only way to keep `git` from doing
# this seems to set HOME explicitly to a separate location.
# Refer to https://git-scm.com/docs/git-config#FILES.
unset XDG_CONFIG_HOME
export HOME="${TEST_TEMP_DIR}"
readonly HOME="${BATS_SUITE_TMPDIR?}"
mkdir -p "${HOME}"
# 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.
# This goes to the test-specific config, due to the $HOME overridden above.
git config --global user.name "John Doe"
git config --global user.email "johndoe@example.com"
git config --global user.name "Bash It BATS Runner"
git config --global user.email "bats@bash.it"
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
}
teardown() {
function teardown() {
unset GIT_CONFIG_NOSYSTEM
local_teardown
rm -rf "${BASH_IT_TEST_DIR}"
temp_del "${TEST_TEMP_DIR}"
clean_test_fixture
}
function teardown_file() {
# This only serves to clean metadata from the real git repo.
git --git-dir="${MAIN_BASH_IT_GITDIR?}" worktree remove -f "${BASH_IT?}"
}

View File

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

View File

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

View File

@ -1,29 +1,10 @@
#!/usr/bin/env bats
# shellcheck shell=bats
load ../test_helper
load ../test_helper_libs
load "${MAIN_BASH_IT_DIR?}/test/test_helper.bash"
function local_setup {
setup_test_fixture
# 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 local_setup_file() {
setup_libs "colors" #"theme"
load "${BASH_IT?}/themes/base.theme.bash"
}
function setup_repo {

View File

@ -182,7 +182,7 @@ prompt_segment() {
# declare -p codes
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[@])"
PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR"
debug "post prompt " "$(ansi codes[@])"

View File

@ -1,8 +1,11 @@
# shellcheck shell=bash
# 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
# SCM
SCM_GIT_CHAR_GITLAB=${BARBUK_GITLAB_CHAR:=' '}
SCM_GIT_CHAR_BITBUCKET=${BARBUK_BITBUCKET_CHAR:=' '}
SCM_GIT_CHAR_GITHUB=${BARBUK_GITHUB_CHAR:=' '}
@ -10,13 +13,20 @@ SCM_GIT_CHAR_DEFAULT=${BARBUK_GIT_DEFAULT_CHAR:=' '}
SCM_GIT_CHAR_ICON_BRANCH=${BARBUK_GIT_BRANCH_ICON:=''}
SCM_HG_CHAR=${BARBUK_HG_CHAR:='☿ '}
SCM_SVN_CHAR=${BARBUK_SVN_CHAR:='⑆ '}
# Exit code
EXIT_CODE_ICON=${BARBUK_EXIT_CODE_ICON:=' '}
# Programming and tools
PYTHON_VENV_CHAR=${BARBUK_PYTHON_VENV_CHAR:=' '}
COMMAND_DURATION_ICON=${BARBUK_COMMAND_DURATION_ICON:-"$bold_blue"}
RUBY_CHAR=${BARBUK_RUBY_CHAR:=' '}
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_MIN_SECONDS=${COMMAND_DURATION_MIN_SECONDS:-1}
COMMAND_DURATION_COLOR="$normal"
# Ssh user and hostname display
SSH_INFO=${BARBUK_SSH_INFO:=true}
@ -24,24 +34,32 @@ HOST_INFO=${BARBUK_HOST_INFO:=long}
# Bash-it default glyphs customization
SCM_NONE_CHAR=
SCM_THEME_PROMPT_DIRTY=" ${bold_red}"
SCM_THEME_PROMPT_CLEAN=" ${bold_green}"
SCM_THEME_PROMPT_DIRTY=" ${bold_red?}"
SCM_THEME_PROMPT_CLEAN=" ${bold_green?}"
SCM_THEME_PROMPT_PREFIX="|"
SCM_THEME_PROMPT_SUFFIX="${green}| "
SCM_GIT_BEHIND_CHAR="${bold_red}${normal}"
SCM_GIT_AHEAD_CHAR="${bold_green}${normal}"
SCM_THEME_PROMPT_SUFFIX="${green?}| "
SCM_GIT_BEHIND_CHAR="${bold_red?}${normal?}"
SCM_GIT_AHEAD_CHAR="${bold_green?}${normal?}"
SCM_GIT_UNTRACKED_CHAR="⌀"
SCM_GIT_UNSTAGED_CHAR="${bold_yellow}${normal}"
SCM_GIT_STAGED_CHAR="${bold_green}+${normal}"
GIT_THEME_PROMPT_DIRTY=" ${bold_red}"
GIT_THEME_PROMPT_CLEAN=" ${bold_green}"
GIT_THEME_PROMPT_PREFIX="${cyan}"
GIT_THEME_PROMPT_SUFFIX="${cyan}"
SCM_THEME_BRANCH_TRACK_PREFIX="${normal}${cyan}"
SCM_GIT_UNSTAGED_CHAR="${bold_yellow?}${normal?}"
SCM_GIT_STAGED_CHAR="${bold_green?}+${normal?}"
GIT_THEME_PROMPT_DIRTY=" ${bold_red?}"
GIT_THEME_PROMPT_CLEAN=" ${bold_green?}"
GIT_THEME_PROMPT_PREFIX="${cyan?}"
GIT_THEME_PROMPT_SUFFIX="${cyan?}"
SCM_THEME_BRANCH_TRACK_PREFIX="${normal?}${cyan?}"
SCM_THEME_CURRENT_USER_PREFFIX='  '
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 {
function __git-uptream-remote-logo_prompt() {
[[ "$(_git-upstream)" == "" ]] && SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT"
local remote remote_domain
@ -57,36 +75,72 @@ function _git-uptream-remote-logo {
bitbucket) SCM_GIT_CHAR="$SCM_GIT_CHAR_BITBUCKET" ;;
*) SCM_GIT_CHAR="$SCM_GIT_CHAR_DEFAULT" ;;
esac
echo "${purple?}$(scm_char)"
}
function git_prompt_info {
function git_prompt_info() {
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 "
}
function _exit-code {
if [[ "$1" -ne 0 ]]; then
exit_code=" ${purple}${EXIT_CODE_ICON}${yellow}${exit_code}${bold_orange}"
function __exit_prompt() {
if [[ "$exit_code" -ne 0 ]]; then
echo "${purple?}${EXIT_CODE_ICON}${yellow?}${exit_code}${bold_orange?} "
else
exit_code="${bold_green}"
echo "${bold_green}"
fi
}
function _prompt {
local exit_code="$?" wrap_char=' ' dir_color=$green ssh_info='' python_venv='' host command_duration=
command_duration=$(_command_duration)
_exit-code exit_code
_git-uptream-remote-logo
history -a
# Detect root shell
if [ "$(whoami)" = root ]; then
dir_color=$red
function __aws_profile_prompt() {
if [[ -n "${AWS_PROFILE}" ]]; then
echo -n "${bold_purple?}${AWS_PROFILE_CHAR}${normal?}${AWS_PROFILE} "
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
if [[ -n "${SSH_CONNECTION}" ]] && [ "$SSH_INFO" = true ]; then
if [ "$HOST_INFO" = long ]; then
@ -94,19 +148,56 @@ function _prompt {
else
host="\h"
fi
ssh_info="${bold_blue}\u${bold_orange}@${cyan}$host ${bold_orange}in"
echo "${bold_blue?}\u${bold_orange?}@${cyan?}$host ${bold_orange?}in "
fi
}
function __python_venv_prompt() {
# Detect python venv
if [[ -n "${CONDA_DEFAULT_ENV}" ]]; then
python_venv="$PYTHON_VENV_CHAR${CONDA_DEFAULT_ENV} "
echo "${bold_purple?}$PYTHON_VENV_CHAR${normal?}${CONDA_DEFAULT_ENV} "
elif [[ -n "${VIRTUAL_ENV}" ]]; then
python_venv="$PYTHON_VENV_CHAR$(basename "${VIRTUAL_ENV}") "
echo "${bold_purple?}$PYTHON_VENV_CHAR${normal?}$(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
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} "
}
safe_append_prompt_command _prompt
safe_append_prompt_command __prompt-command

View File

@ -1,16 +1,20 @@
# shellcheck shell=bash
# 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_SUFFIX=''
CLOCK_THEME_PROMPT_PREFIX=''
CLOCK_THEME_PROMPT_SUFFIX=''
THEME_PROMPT_HOST='\H'
THEME_PROMPT_HOST='\h'
SCM=
SCM_CHECK=${SCM_CHECK:=true}
: "${SCM_CHECK:=true}"
SCM_THEME_PROMPT_DIRTY=' ✗'
SCM_THEME_PROMPT_CLEAN=' ✓'
@ -30,15 +34,15 @@ SCM_THEME_CHAR_SUFFIX=''
: "${THEME_CHECK_SUDO:=false}"
: "${THEME_BATTERY_PERCENTAGE_CHECK:=true}"
SCM_GIT_SHOW_DETAILS=${SCM_GIT_SHOW_DETAILS:=true}
SCM_GIT_SHOW_REMOTE_INFO=${SCM_GIT_SHOW_REMOTE_INFO:=auto}
SCM_GIT_IGNORE_UNTRACKED=${SCM_GIT_IGNORE_UNTRACKED:=false}
SCM_GIT_SHOW_CURRENT_USER=${SCM_GIT_SHOW_CURRENT_USER:=false}
SCM_GIT_SHOW_MINIMAL_INFO=${SCM_GIT_SHOW_MINIMAL_INFO:=false}
SCM_GIT_SHOW_STASH_INFO=${SCM_GIT_SHOW_STASH_INFO:=true}
SCM_GIT_SHOW_COMMIT_COUNT=${SCM_GIT_SHOW_COMMIT_COUNT:=true}
SCM_GIT_USE_GITSTATUS=${SCM_GIT_USE_GITSTATUS:=false}
SCM_GIT_GITSTATUS_RAN=${SCM_GIT_GITSTATUS_RAN:=false}
: "${SCM_GIT_SHOW_DETAILS:=true}"
: "${SCM_GIT_SHOW_REMOTE_INFO:=auto}"
: "${SCM_GIT_IGNORE_UNTRACKED:=false}"
: "${SCM_GIT_SHOW_CURRENT_USER:=false}"
: "${SCM_GIT_SHOW_MINIMAL_INFO:=false}"
: "${SCM_GIT_SHOW_STASH_INFO:=true}"
: "${SCM_GIT_SHOW_COMMIT_COUNT:=true}"
: "${SCM_GIT_USE_GITSTATUS:=false}"
: "${SCM_GIT_GITSTATUS_RAN:=false}"
SCM_GIT='git'
SCM_GIT_CHAR='±'
@ -73,9 +77,9 @@ NVM_THEME_PROMPT_SUFFIX='|'
RVM_THEME_PROMPT_PREFIX=' |'
RVM_THEME_PROMPT_SUFFIX='|'
THEME_SHOW_RUBY_PROMPT=${THEME_SHOW_RUBY_PROMPT:=true}
: "${THEME_SHOW_RUBY_PROMPT:=true}"
THEME_SHOW_USER_HOST=${THEME_SHOW_USER_HOST:=false}
: "${THEME_SHOW_USER_HOST:=false}"
USER_HOST_THEME_PROMPT_PREFIX=''
USER_HOST_THEME_PROMPT_SUFFIX=''
@ -88,154 +92,160 @@ RBENV_THEME_PROMPT_SUFFIX='|'
RBFU_THEME_PROMPT_PREFIX=' |'
RBFU_THEME_PROMPT_SUFFIX='|'
: "${GIT_EXE:=$SCM_GIT}"
: "${P4_EXE:=$SCM_P4}"
: "${HG_EXE:=$SCM_HG}"
: "${SVN_EXE:=$SCM_SVN}"
: "${GIT_EXE:=${SCM_GIT?}}"
: "${HG_EXE:=${SCM_HG?}}"
: "${SVN_EXE:=${SCM_SVN?}}"
: "${P4_EXE:=${SCM_P4?}}"
function _bash_it_appearance_scm_init() {
GIT_EXE="$(type -P $SCM_GIT || true)"
P4_EXE="$(type -P $SCM_P4 || true)"
HG_EXE="$(type -P $SCM_HG || true)"
SVN_EXE="$(type -P $SCM_SVN || true)"
GIT_EXE="$(type -P "${SCM_GIT:-git}" || true)"
HG_EXE="$(type -P "${SCM_HG:-hg}" || true)"
SVN_EXE="$(type -P "${SCM_SVN:-svn}" || true)"
P4_EXE="$(type -P "${SCM_P4:-p4}" || true)"
# 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.
if [[ -x "$SVN_EXE" && -x "${SVN_EXE%/*}/xcrun" ]]; then
if ! "$SVN_EXE" --version > /dev/null 2>&1; then
if [[ -x "${SVN_EXE-}" && -x "${SVN_EXE%/svn}/xcrun" ]]; then
if ! "${SVN_EXE}" --version > /dev/null 2>&1; then
# Unset the SVN exe variable so that SVN commands are avoided.
SVN_EXE=""
fi
fi
return 0
}
_bash_it_library_finalize_hook+=('_bash_it_appearance_scm_init')
function scm {
if [[ "$SCM_CHECK" = false ]]; then
SCM=$SCM_NONE
elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then
SCM=$SCM_GIT
elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then
SCM=$SCM_HG
elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then
SCM=$SCM_SVN
elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then
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
function scm() {
if [[ "${SCM_CHECK:-true}" == "false" ]]; then
SCM="${SCM_NONE-NONE}"
elif [[ -x "${GIT_EXE-}" ]] && _bash-it-find-in-ancestor '.git' > /dev/null; then
SCM="${SCM_GIT?}"
elif [[ -x "${HG_EXE-}" ]] && _bash-it-find-in-ancestor '.hg' > /dev/null; then
SCM="${SCM_HG?}"
elif [[ -x "${SVN_EXE-}" ]] && _bash-it-find-in-ancestor '.svn' > /dev/null; then
SCM="${SCM_SVN?}"
elif [[ -x "${P4_EXE-}" && -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then
SCM="${SCM_P4?}"
else
SCM=$SCM_NONE
SCM="${SCM_NONE-NONE}"
fi
}
scm_prompt() {
local CHAR
CHAR="$(scm_char)"
local format=${SCM_PROMPT_FORMAT:-'[%s%s]'}
function scm_prompt() {
local format="${SCM_PROMPT_FORMAT-"[%s%s]"}"
local scm_char scm_prompt_info
scm_char="$(scm_char)"
scm_prompt_info="$(scm_prompt_info)"
if [[ "${CHAR}" != "$SCM_NONE_CHAR" ]]; then
if [[ "${scm_char}" != "${SCM_NONE_CHAR:-}" ]]; then
# shellcheck disable=2059
printf "$format\n" "$CHAR" "$(scm_prompt_info)"
printf "${format}" "${scm_char}" "${scm_prompt_info}"
fi
}
function scm_prompt_char {
if [[ -z $SCM ]]; then scm; fi
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
function scm_prompt_char() {
if [[ -z "${SCM:-}" ]]; then
scm
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_prompt_char
SCM_DIRTY=0
SCM_STATE=''
[[ $SCM == "$SCM_GIT" ]] && git_prompt_vars && return
[[ $SCM == "$SCM_P4" ]] && p4_prompt_vars && return
[[ $SCM == "$SCM_HG" ]] && hg_prompt_vars && return
[[ $SCM == "$SCM_SVN" ]] && svn_prompt_vars && return
local prompt_vars="${SCM}_prompt_vars"
_is_function "${prompt_vars}" && "${prompt_vars}"
}
function scm_prompt_info {
function scm_prompt_info() {
scm
scm_prompt_char
scm_prompt_info_common
}
function scm_prompt_char_info {
function scm_prompt_char_info() {
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
}
function scm_prompt_info_common {
function scm_prompt_info_common() {
local prompt_info
SCM_DIRTY=0
SCM_STATE=''
if [[ ${SCM} == "${SCM_GIT}" ]]; then
if [[ ${SCM_GIT_SHOW_MINIMAL_INFO} == true ]]; then
case ${SCM?} in
"${SCM_GIT?}")
if [[ ${SCM_GIT_SHOW_MINIMAL_INFO:-false} == "true" ]]; then
# user requests minimal git status information
git_prompt_minimal_info
prompt_info="${SCM}_prompt_minimal_info"
else
# more detailed git status
git_prompt_info
prompt_info="${SCM}_prompt_info"
fi
return
fi
;;
*)
# TODO: consider adding minimal status information for hg and svn
{ [[ ${SCM} == "${SCM_P4}" ]] && p4_prompt_info && return; } || true
{ [[ ${SCM} == "${SCM_HG}" ]] && hg_prompt_info && return; } || true
{ [[ ${SCM} == "${SCM_SVN}" ]] && svn_prompt_info && return; } || true
prompt_info="${SCM}_prompt_info"
;;
esac
_is_function "${prompt_info}" && "${prompt_info}"
}
function terraform_workspace_prompt {
function terraform_workspace_prompt() {
if _command_exists terraform; then
if [ -d .terraform ]; then
echo -e "$(terraform workspace show 2> /dev/null)"
if [[ -d .terraform ]]; then
terraform workspace show 2> /dev/null
fi
fi
}
function active_gcloud_account_prompt {
function active_gcloud_account_prompt() {
if _command_exists gcloud; then
echo -e "$(gcloud config list account --format "value(core.account)" 2> /dev/null)"
gcloud config list account --format "value(core.account)" 2> /dev/null
fi
}
function git_prompt_minimal_info {
SCM_STATE=${SCM_THEME_PROMPT_CLEAN}
function git_prompt_minimal_info() {
SCM_STATE="${SCM_THEME_PROMPT_CLEAN?}"
_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
SCM_DIRTY=1
SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
SCM_STATE="${SCM_THEME_PROMPT_DIRTY?}"
fi
# Output the git prompt
SCM_PREFIX=${SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX=${SCM_THEME_PROMPT_SUFFIX}
echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
SCM_PREFIX="${SCM_THEME_PROMPT_PREFIX-}"
SCM_SUFFIX="${SCM_THEME_PROMPT_SUFFIX-}"
echo -ne "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
}
function git_prompt_vars {
if ${SCM_GIT_USE_GITSTATUS} && _command_exists gitstatus_query && gitstatus_query && [[ "${VCS_STATUS_RESULT}" == "ok-sync" ]]; then
function git_prompt_vars() {
if [[ "${SCM_GIT_USE_GITSTATUS:-false}" != "false" ]] && _command_exists gitstatus_query && gitstatus_query && [[ "${VCS_STATUS_RESULT:-}" == "ok-sync" ]]; then
# we can use faster gitstatus
# use this variable in githelpers and below to choose gitstatus output
SCM_GIT_GITSTATUS_RAN=true
@ -251,190 +261,174 @@ function git_prompt_vars {
local detached_prefix
if _git-tag &> /dev/null; then
detached_prefix=${SCM_THEME_TAG_PREFIX}
detached_prefix="${SCM_THEME_TAG_PREFIX}"
else
detached_prefix=${SCM_THEME_DETACHED_PREFIX}
detached_prefix="${SCM_THEME_DETACHED_PREFIX}"
fi
SCM_BRANCH="${detached_prefix}\$(_git-friendly-ref)"
fi
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
commits_behind=${VCS_STATUS_COMMITS_BEHIND}
commits_ahead=${VCS_STATUS_COMMITS_AHEAD}
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
commits_behind="${VCS_STATUS_COMMITS_BEHIND?}"
commits_ahead="${VCS_STATUS_COMMITS_AHEAD?}"
else
IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)"
fi
if [[ "${commits_ahead}" -gt 0 ]]; then
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
if [[ "${commits_behind}" -gt 0 ]]; then
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
if [[ "${SCM_GIT_SHOW_STASH_INFO}" = "true" ]]; then
if [[ "${SCM_GIT_SHOW_STASH_INFO}" == "true" ]]; then
local stash_count
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
stash_count=${VCS_STATUS_STASHES}
stash_count="${VCS_STATUS_STASHES?}"
else
stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')"
fi
[[ "${stash_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_GIT_STASH_CHAR_PREFIX}${stash_count}${SCM_GIT_STASH_CHAR_SUFFIX}"
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 [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
untracked_count=${VCS_STATUS_NUM_UNTRACKED}
unstaged_count=${VCS_STATUS_NUM_UNSTAGED}
staged_count=${VCS_STATUS_NUM_STAGED}
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
untracked_count="${VCS_STATUS_NUM_UNTRACKED?}"
unstaged_count="${VCS_STATUS_NUM_UNSTAGED?}"
staged_count="${VCS_STATUS_NUM_STAGED?}"
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
if [[ "${untracked_count}" -gt 0 || "${unstaged_count}" -gt 0 || "${staged_count}" -gt 0 ]]; then
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
[[ "${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
fi
SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
SCM_STATE="${GIT_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}"
fi
fi
# no if for gitstatus here, user extraction is not supported by it
[[ "${SCM_GIT_SHOW_CURRENT_USER}" == "true" ]] && SCM_BRANCH+="$(git_user_info)"
SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
SCM_PREFIX="${GIT_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}"
SCM_SUFFIX="${GIT_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}"
SCM_CHANGE=$(_git-short-sha 2> /dev/null || echo "")
SCM_CHANGE=$(_git-short-sha 2> /dev/null || true)
}
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 \
opened_count non_default_changes default_count \
add_file_count edit_file_count delete_file_count \
<<< "$(_p4-opened-counts)"
< <(_p4-opened-counts)
if [[ "${opened_count}" -gt 0 ]]; then
SCM_DIRTY=1
SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
[[ "${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}"
[[ "${default_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_DEFAULT_CHAR}${default_count}"
SCM_STATE="${SCM_THEME_PROMPT_DIRTY?}"
[[ "${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}"
[[ "${default_count}" -gt 0 ]] && SCM_BRANCH+=" ${SCM_P4_DEFAULT_CHAR?}${default_count}"
else
SCM_DIRTY=0
SCM_STATE=${SCM_THEME_PROMPT_DIRTY}
SCM_STATE="${SCM_THEME_PROMPT_CLEAN?}"
fi
SCM_PREFIX=${P4_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX=${P4_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
SCM_PREFIX="${P4_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}"
SCM_SUFFIX="${P4_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}"
}
function svn_prompt_vars {
if [[ -n $(svn status | head -c1 2> /dev/null) ]]; then
function svn_prompt_vars() {
if [[ -n "$(svn status | head -c1 2> /dev/null)" ]]; then
SCM_DIRTY=1
SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
SCM_STATE="${SVN_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}"
else
SCM_DIRTY=0
SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
SCM_STATE="${SVN_THEME_PROMPT_CLEAN:-${SCM_THEME_PROMPT_CLEAN?}}"
fi
SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
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_CHANGE=$(svn info --show-item=revision 2> /dev/null)
SCM_PREFIX="${SVN_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}"
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_CHANGE="$(svn info --show-item=revision 2> /dev/null)"
}
# this functions returns absolute location of .hg directory if one exists
# 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 {
function hg_prompt_vars() {
local hg_root bookmark
if [[ -n $(hg status 2> /dev/null) ]]; then
SCM_DIRTY=1
SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
SCM_STATE="${HG_THEME_PROMPT_DIRTY:-${SCM_THEME_PROMPT_DIRTY?}}"
else
SCM_DIRTY=0
SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
SCM_STATE="${HG_THEME_PROMPT_CLEAN:-${SCM_THEME_PROMPT_CLEAN?}}"
fi
SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
SCM_PREFIX="${HG_THEME_PROMPT_PREFIX:-${SCM_THEME_PROMPT_PREFIX-}}"
SCM_SUFFIX="${HG_THEME_PROMPT_SUFFIX:-${SCM_THEME_PROMPT_SUFFIX-}}"
HG_ROOT=$(get_hg_root)
hg_root="$(_bash-it-find-in-ancestor ".hg")/.hg"
if [ -f "$HG_ROOT/branch" ]; then
if [[ -f "$hg_root/branch" ]]; then
# Mercurial holds it's current branch in .hg/branch file
SCM_BRANCH=$(< "${HG_ROOT}/branch")
local bookmark=${HG_ROOT}/bookmarks.current
[[ -f ${bookmark} ]] && SCM_BRANCH+=:$(< "${bookmark}")
SCM_BRANCH=$(< "${hg_root}/branch")
bookmark="${hg_root}/bookmarks.current"
[[ -f "${bookmark}" ]] && SCM_BRANCH+=:$(< "${bookmark}")
else
SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}')
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
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
SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}')
fi
}
function nvm_version_prompt {
function nvm_version_prompt() {
local node
if _is_function nvm; then
node=$(nvm current 2> /dev/null)
[[ "${node}" == "system" ]] && return
echo -e "${NVM_THEME_PROMPT_PREFIX}${node}${NVM_THEME_PROMPT_SUFFIX}"
echo -ne "${NVM_THEME_PROMPT_PREFIX-}${node}${NVM_THEME_PROMPT_SUFFIX-}"
fi
}
function node_version_prompt {
echo -e "$(nvm_version_prompt)"
function node_version_prompt() {
nvm_version_prompt
}
function rvm_version_prompt {
if which rvm &> /dev/null; then
rvm=$(rvm-prompt) || return
if [ -n "$rvm" ]; then
echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX"
function rvm_version_prompt() {
if _command_exists rvm; then
rvm="$(rvm-prompt)" || return
if [[ -n "$rvm" ]]; then
echo -ne "${RVM_THEME_PROMPT_PREFIX-}${rvm}${RVM_THEME_PROMPT_SUFFIX-}"
fi
fi
}
function rbenv_version_prompt {
if which rbenv &> /dev/null; then
function rbenv_version_prompt() {
if _command_exists rbenv; then
rbenv=$(rbenv version-name) || return
rbenv commands | grep -q gemset && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}"
if [ "$rbenv" != "system" ]; then
echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX"
if [[ "$rbenv" != "system" ]]; then
echo -ne "${RBENV_THEME_PROMPT_PREFIX-}${rbenv}${RBENV_THEME_PROMPT_SUFFIX-}"
fi
fi
}
function rbfu_version_prompt {
if [[ $RBFU_RUBY_VERSION ]]; then
echo -e "${RBFU_THEME_PROMPT_PREFIX}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX}"
function rbfu_version_prompt() {
if [[ -n "${RBFU_RUBY_VERSION:-}" ]]; then
echo -ne "${RBFU_THEME_PROMPT_PREFIX-}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX-}"
fi
}
function chruby_version_prompt {
function chruby_version_prompt() {
if _is_function chruby; then
if _is_function chruby_auto; then
chruby_auto
@ -445,141 +439,142 @@ function chruby_version_prompt {
if ! chruby | grep -q '\*'; then
ruby_version="${ruby_version} (system)"
fi
echo -e "${CHRUBY_THEME_PROMPT_PREFIX}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX}"
echo -ne "${CHRUBY_THEME_PROMPT_PREFIX-}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX-}"
fi
}
function ruby_version_prompt {
if [[ "${THEME_SHOW_RUBY_PROMPT}" = "true" ]]; then
echo -e "$(rbfu_version_prompt)$(rbenv_version_prompt)$(rvm_version_prompt)$(chruby_version_prompt)"
function ruby_version_prompt() {
if [[ "${THEME_SHOW_RUBY_PROMPT:-}" == "true" ]]; then
rbfu_version_prompt
rbenv_version_prompt
rvm_version_prompt
chruby_version_prompt
fi
}
function k8s_context_prompt {
echo -e "$(kubectl config current-context 2> /dev/null)"
function k8s_context_prompt() {
kubectl config current-context 2> /dev/null
}
function k8s_namespace_prompt {
echo -e "$(kubectl config view --minify --output 'jsonpath={..namespace}' 2> /dev/null)"
function k8s_namespace_prompt() {
kubectl config view --minify --output 'jsonpath={..namespace}' 2> /dev/null
}
function virtualenv_prompt {
if [[ -n "$VIRTUAL_ENV" ]]; then
virtualenv=$(basename "$VIRTUAL_ENV")
echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX"
function virtualenv_prompt() {
local virtualenv
if [[ -n "${VIRTUAL_ENV:-}" ]]; then
virtualenv="${VIRTUAL_ENV##*/}"
echo -ne "${VIRTUALENV_THEME_PROMPT_PREFIX-}${virtualenv}${VIRTUALENV_THEME_PROMPT_SUFFIX-}"
fi
}
function condaenv_prompt {
if [[ $CONDA_DEFAULT_ENV ]]; then
echo -e "${CONDAENV_THEME_PROMPT_PREFIX}${CONDA_DEFAULT_ENV}${CONDAENV_THEME_PROMPT_SUFFIX}"
function condaenv_prompt() {
if [[ -n "${CONDA_DEFAULT_ENV:-}" ]]; then
echo -ne "${CONDAENV_THEME_PROMPT_PREFIX-}${CONDA_DEFAULT_ENV}${CONDAENV_THEME_PROMPT_SUFFIX-}"
fi
}
function py_interp_prompt {
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}"
function py_interp_prompt() {
local py_version
py_version="$(python --version 2>&1 | awk 'NR==1{print "py-"$2;}')" || return
echo -ne "${PYTHON_THEME_PROMPT_PREFIX-}${py_version}${PYTHON_THEME_PROMPT_SUFFIX-}"
}
function python_version_prompt {
echo -e "$(virtualenv_prompt)$(condaenv_prompt)$(py_interp_prompt)"
function python_version_prompt() {
virtualenv_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
SCM_CURRENT_USER=$(git config user.initials | sed 's% %+%')
current_user="$(git config user.initials | sed 's% %+%')"
# if `user.initials` weren't set, attempt to extract initials from `user.name`
[[ -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 "${SCM_CURRENT_USER}" ]] && printf "%s" "$SCM_THEME_CURRENT_USER_PREFFIX$SCM_CURRENT_USER$SCM_THEME_CURRENT_USER_SUFFIX"
[[ -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)")
[[ -n "${current_user}" ]] && printf "%s" "${SCM_THEME_CURRENT_USER_PREFFIX-}${current_user}${SCM_THEME_CURRENT_USER_SUFFIX-}"
}
function clock_char {
CLOCK_CHAR=${THEME_CLOCK_CHAR:-"⌚"}
CLOCK_CHAR_COLOR=${THEME_CLOCK_CHAR_COLOR:-"$normal"}
SHOW_CLOCK_CHAR=${THEME_SHOW_CLOCK_CHAR:-"true"}
function clock_char() {
local clock_char clock_char_color show_clock_char
clock_char="${THEME_CLOCK_CHAR:-}"
clock_char_color="${THEME_CLOCK_CHAR_COLOR:-${normal:-}}"
show_clock_char="${THEME_SHOW_CLOCK_CHAR:-"true"}"
if [[ "${SHOW_CLOCK_CHAR}" = "true" ]]; then
echo -e "${CLOCK_CHAR_COLOR}${CLOCK_CHAR_THEME_PROMPT_PREFIX}${CLOCK_CHAR}${CLOCK_CHAR_THEME_PROMPT_SUFFIX}"
if [[ "${show_clock_char}" == "true" ]]; then
echo -ne "${clock_char_color}${CLOCK_CHAR_THEME_PROMPT_PREFIX-}${clock_char}${CLOCK_CHAR_THEME_PROMPT_SUFFIX-}"
fi
}
function clock_prompt {
CLOCK_COLOR=${THEME_CLOCK_COLOR:-"$normal"}
CLOCK_FORMAT=${THEME_CLOCK_FORMAT:-"%H:%M:%S"}
[ -z "$THEME_SHOW_CLOCK" ] && THEME_SHOW_CLOCK=${THEME_CLOCK_CHECK:-"true"}
SHOW_CLOCK=$THEME_SHOW_CLOCK
function clock_prompt() {
local clock_color="${THEME_CLOCK_COLOR:-${normal?}}"
local clock_format="${THEME_CLOCK_FORMAT:-"%H:%M:%S"}"
local show_clock="${THEME_SHOW_CLOCK:-${THEME_CLOCK_CHECK:-true}}"
local clock_string="\D{${clock_format}}"
if [[ "${SHOW_CLOCK}" = "true" ]]; then
CLOCK_STRING=$(date +"${CLOCK_FORMAT}")
echo -e "${CLOCK_COLOR}${CLOCK_THEME_PROMPT_PREFIX}${CLOCK_STRING}${CLOCK_THEME_PROMPT_SUFFIX}"
if [[ "${show_clock}" == "true" ]]; then
echo -ne "${clock_color}${CLOCK_THEME_PROMPT_PREFIX-}${clock_string}${CLOCK_THEME_PROMPT_SUFFIX-}"
fi
}
function user_host_prompt {
if [[ "${THEME_SHOW_USER_HOST}" = "true" ]]; then
echo -e "${USER_HOST_THEME_PROMPT_PREFIX}\u@\h${USER_HOST_THEME_PROMPT_SUFFIX}"
function user_host_prompt() {
if [[ "${THEME_SHOW_USER_HOST:-false}" == "true" ]]; then
echo -ne "${USER_HOST_THEME_PROMPT_PREFIX-}\u@${THEME_PROMPT_HOST:-\h}${USER_HOST_THEME_PROMPT_SUFFIX-}"
fi
}
# backwards-compatibility
function git_prompt_info {
function git_prompt_info() {
_git-hide-status && return
git_prompt_vars
echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}${SCM_STATE?}${SCM_SUFFIX?}"
}
function p4_prompt_info() {
p4_prompt_vars
echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE}${SCM_STATE}${SCM_SUFFIX}"
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}:${SCM_CHANGE?}${SCM_STATE?}${SCM_SUFFIX?}"
}
function svn_prompt_info {
function svn_prompt_info() {
svn_prompt_vars
echo -e "${SCM_PREFIX}${SCM_BRANCH}${SCM_STATE}${SCM_SUFFIX}"
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}${SCM_STATE?}${SCM_SUFFIX?}"
}
function hg_prompt_info() {
hg_prompt_vars
echo -e "${SCM_PREFIX}${SCM_BRANCH}:${SCM_CHANGE#*:}${SCM_STATE}${SCM_SUFFIX}"
echo -ne "${SCM_PREFIX?}${SCM_BRANCH?}:${SCM_CHANGE#*:}${SCM_STATE?}${SCM_SUFFIX?}"
}
function scm_char {
function scm_char() {
scm_prompt_char
echo -e "${SCM_THEME_CHAR_PREFIX}${SCM_CHAR}${SCM_THEME_CHAR_SUFFIX}"
echo -ne "${SCM_THEME_CHAR_PREFIX?}${SCM_CHAR?}${SCM_THEME_CHAR_SUFFIX?}"
}
function prompt_char {
function prompt_char() {
scm_char
}
function battery_char {
if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" = true ]]; then
echo -e "${bold_red:-}$(battery_percentage)%"
function battery_char() {
# The battery_char function depends on the presence of the battery_percentage function.
if [[ "${THEME_BATTERY_PERCENTAGE_CHECK}" == true ]] && _command_exists battery_percentage; then
echo -ne "${bold_red?}$(battery_percentage)%"
else
false
fi
}
if ! _command_exists battery_charge; then
# if user has installed battery plugin, skip this...
function battery_charge() {
# no op
echo -n
: # no op
}
fi
# The battery_char function depends on the presence of the battery_percentage function.
# If battery_percentage is not defined, then define battery_char as a no-op.
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}"
function aws_profile() {
if [[ -n "${AWS_DEFAULT_PROFILE:-}" ]]; then
echo -ne "${AWS_DEFAULT_PROFILE}"
else
echo -e "default"
echo -ne "default"
fi
}

View File

@ -1,69 +0,0 @@
# 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,6 +1,6 @@
#!/usr/bin/env bash
# shellcheck shell=bash
function _git-symbolic-ref {
function _git-symbolic-ref() {
git symbolic-ref -q HEAD 2> /dev/null
}
@ -8,63 +8,68 @@ function _git-symbolic-ref {
# but this can be different when two branches are pointing to the
# same commit. _git-branch is used to explicitly choose the checked-out
# branch.
function _git-branch {
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
test -n "${VCS_STATUS_LOCAL_BRANCH}" && echo "${VCS_STATUS_LOCAL_BRANCH}" || return 1
function _git-branch() {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
if [[ -n "${VCS_STATUS_LOCAL_BRANCH:-}" ]]; then
echo "${VCS_STATUS_LOCAL_BRANCH}"
else
return 1
fi
else
git symbolic-ref -q --short HEAD 2> /dev/null || return 1
fi
}
function _git-tag {
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
test -n "${VCS_STATUS_TAG}" && echo "${VCS_STATUS_TAG}"
function _git-tag() {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
if [[ -n "${VCS_STATUS_TAG:-}" ]]; then
echo "${VCS_STATUS_TAG}"
fi
else
git describe --tags --exact-match 2> /dev/null
fi
}
function _git-commit-description {
function _git-commit-description() {
git describe --contains --all 2> /dev/null
}
function _git-short-sha {
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
echo ${VCS_STATUS_COMMIT:0:7}
function _git-short-sha() {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
echo "${VCS_STATUS_COMMIT:0:7}"
else
git rev-parse --short HEAD
fi
}
# Try the checked-out branch first to avoid collision with branches pointing to the same ref.
function _git-friendly-ref {
if [[ "${SCM_GIT_GITSTATUS_RAN}" == "true" ]]; then
function _git-friendly-ref() {
if [[ "${SCM_GIT_GITSTATUS_RAN:-}" == "true" ]]; then
_git-branch || _git-tag || _git-short-sha # there is no tag based describe output in gitstatus
else
_git-branch || _git-tag || _git-commit-description || _git-short-sha
fi
}
function _git-num-remotes {
function _git-num-remotes() {
git remote | wc -l
}
function _git-upstream {
function _git-upstream() {
local ref
ref="$(_git-symbolic-ref)" || return 1
git for-each-ref --format="%(upstream:short)" "${ref}"
}
function _git-upstream-remote {
local upstream
function _git-upstream-remote() {
local upstream branch
upstream="$(_git-upstream)" || return 1
local branch
branch="$(_git-upstream-branch)" || return 1
echo "${upstream%"/${branch}"}"
}
function _git-upstream-branch {
function _git-upstream-branch() {
local ref
ref="$(_git-symbolic-ref)" || return 1
@ -74,25 +79,27 @@ function _git-upstream-branch {
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
}
function _git-upstream-branch-gone {
function _git-upstream-branch-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" ]]
}
function _git-status {
function _git-status() {
local git_status_flags=
[[ "${SCM_GIT_IGNORE_UNTRACKED}" = "true" ]] && git_status_flags='-uno' || true
git status --porcelain ${git_status_flags} 2> /dev/null
if [[ "${SCM_GIT_IGNORE_UNTRACKED:-}" == "true" ]]; then
git_status_flags='-uno'
fi
git status --porcelain "${git_status_flags:---}" 2> /dev/null
}
function _git-status-counts {
function _git-status-counts() {
_git-status | awk '
BEGIN {
untracked=0;
@ -116,85 +123,51 @@ 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}" ]] && local same_branch_name=true
local same_branch_name=
[[ "${VCS_STATUS_LOCAL_BRANCH}" == "${VCS_STATUS_REMOTE_BRANCH}" ]] && same_branch_name=true
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}"
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}"
remote_info="${VCS_STATUS_REMOTE_NAME?}"
fi
elif [[ ${same_branch_name} != "true" ]]; then
remote_info="${VCS_STATUS_REMOTE_BRANCH}"
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
local branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX}"
echo "${branch_prefix}${remote_info}"
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX:-}"
echo "${branch_prefix}${remote_info:-}"
fi
else
[[ "$(_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)"
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
# shellcheck disable=SC2016
remote_info='$(_git-upstream)'
else
remote_info="$(_git-upstream-remote)"
fi
elif [[ ${same_branch_name} != "true" ]]; then
remote_info="\$(_git-upstream-branch)"
elif [[ ${same_branch_name:-} != "true" ]]; then
# shellcheck disable=SC2016
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}"
branch_prefix="${SCM_THEME_BRANCH_GONE_PREFIX:-}"
else
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX}"
branch_prefix="${SCM_THEME_BRANCH_TRACK_PREFIX:-}"
fi
echo "${branch_prefix}${remote_info}"
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

@ -0,0 +1,8 @@
# 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,4 +1,4 @@
#!/usr/bin/env bash
# shellcheck shell=bash
function _p4-opened {
timeout 2.0s p4 opened -s 2> /dev/null

View File

@ -2,7 +2,7 @@
# git branch parser
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() {

View File

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

1208
vendor/github.com/dsifford/yarn-completion/yarn generated vendored 100644

File diff suppressed because it is too large Load Diff