Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Add options to disable tracking and local counts #43

Merged
merged 2 commits into from
Feb 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,15 +144,21 @@ The `symbol` option prints only `ZSH_THEME_GIT_PROMPT_UPSTREAM_SYMBOL`.
Furthermore, a warning symbol can be configured through `ZSH_THEME_GIT_PROMPT_UPSTREAM_NO_TRACKING` for the case where no remote is available.
`ZSH_THEME_GIT_PROMPT_UPSTREAM_NO_TRACKING` can be set independently of `ZSH_GIT_PROMPT_SHOW_UPSTREAM`.

### Show number of stash entries
The number of stash entries will be shown if `ZSH_GIT_PROMPT_SHOW_STASH` is set.
### Show stash entries
If `ZSH_GIT_PROMPT_SHOW_STASH` is set, the prompt will display a symbol and the number of stash entries when there are entries in the stash.
On Git versions older than 2.35.0 this will execute another Git command every time a new prompt is shown!
To enable stash entries add the following line to your `.zshrc`:

```bash
ZSH_GIT_PROMPT_SHOW_STASH=1
```

### Disable display of numbers
By default, the prompt will show counts for each item in the tracking status and local status sections (see [Prompt Structure](#prompt-structure) for details about these sections).
However, you can disable the display of counts for either or both sections of the prompt using `ZSH_GIT_PROMPT_SHOW_TRACKING_COUNTS` and `ZSH_GIT_PROMPT_SHOW_LOCAL_COUNTS`.
If you unset these variables or set them to `0`, then only the symbols will be shown but not the counts.
For example, a prompt such as `[master|✚2]` will become `[master|✚]` instead.

### Force blank
Since the prompt is asynchronous by default, the Git status updates slightly delayed.
This has the benefit that the prompt will always be responsive even if the repository is huge and/or your disk is slow.
Expand Down
50 changes: 30 additions & 20 deletions git-prompt.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ autoload -U colors && colors
# Settings
: "${ZSH_GIT_PROMPT_SHOW_UPSTREAM=""}"
: "${ZSH_GIT_PROMPT_SHOW_STASH=""}"
: "${ZSH_GIT_PROMPT_SHOW_TRACKING_COUNTS="1"}"
: "${ZSH_GIT_PROMPT_SHOW_LOCAL_COUNTS="1"}"
: "${ZSH_GIT_PROMPT_ENABLE_SECONDARY=""}"
: "${ZSH_GIT_PROMPT_NO_ASYNC=""}"
: "${ZSH_GIT_PROMPT_FORCE_BLANK=""}"
Expand Down Expand Up @@ -100,6 +102,8 @@ function _zsh_git_prompt_git_status() {
-v DETACHED="$ZSH_THEME_GIT_PROMPT_DETACHED" \
-v BRANCH="$ZSH_THEME_GIT_PROMPT_BRANCH" \
-v UPSTREAM_TYPE="$ZSH_GIT_PROMPT_SHOW_UPSTREAM" \
-v SHOW_TRACKING_COUNTS="$ZSH_GIT_PROMPT_SHOW_TRACKING_COUNTS" \
-v SHOW_LOCAL_COUNTS="$ZSH_GIT_PROMPT_SHOW_LOCAL_COUNTS" \
-v UPSTREAM_SYMBOL="$ZSH_THEME_GIT_PROMPT_UPSTREAM_SYMBOL" \
-v UPSTREAM_NO_TRACKING="$ZSH_THEME_GIT_PROMPT_UPSTREAM_NO_TRACKING" \
-v UPSTREAM_PREFIX="$ZSH_THEME_GIT_PROMPT_UPSTREAM_PREFIX" \
Expand Down Expand Up @@ -139,6 +143,24 @@ function _zsh_git_prompt_git_status() {
print(RC);
}

function count_element(prefix, count, show_count) {
content = "";
if (show_count) {
content = count;
}
if (count > 0) {
prompt_element(prefix, content);
}
}

function local_element(prefix, count) {
count_element(prefix, count, SHOW_LOCAL_COUNTS)
}

function tracking_element(prefix, count) {
count_element(prefix, count, SHOW_TRACKING_COUNTS)
}

$1 == "fatal:" {
fatal = 1;
}
Expand Down Expand Up @@ -203,34 +225,22 @@ function _zsh_git_prompt_git_status() {
prompt_element(UPSTREAM_PREFIX, upstream, UPSTREAM_SUFFIX);
}

if (behind < 0) {
prompt_element(BEHIND, behind * -1);
}
tracking_element(BEHIND, behind * -1);

if (ahead > 0) {
prompt_element(AHEAD, ahead * 1);
}
tracking_element(AHEAD, ahead * 1);

prompt_element(SEPARATOR);

if (unmerged > 0) {
prompt_element(UNMERGED, unmerged);
}
local_element(UNMERGED, unmerged);

if (staged > 0) {
prompt_element(STAGED, staged);
}
local_element(STAGED, staged);

if (unstaged > 0) {
prompt_element(UNSTAGED, unstaged);
}
local_element(UNSTAGED, unstaged);

if (untracked > 0) {
prompt_element(UNTRACKED, untracked);
}
local_element(UNTRACKED, untracked);

if (stashed > 0 && SHOW_STASH != "") {
prompt_element(STASHED, stashed);
if (SHOW_STASH) {
local_element(STASHED, stashed);
}

if (unmerged == 0 && staged == 0 && unstaged == 0 && untracked == 0) {
Expand Down
Loading