From 0b8a9d1de27a4bc9ec615e99cefdf57b3b9cd41f Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 11 May 2020 12:15:19 -0400 Subject: [PATCH] Added git_files_changed function This patch adds the git library function for building a short string that represents the output of git diff --numstat. This gives theme designers the ability to add the Number of files changed, number of lines added and number of lines removed in their prompt for a git repository, while the user's current working directory is in the git repo. The new function supports prefix and suffix for each of the options, files changed, lines added and lines removed. To colorize the output, you can do something like this in your theme file ZSH_THEME_GIT_FILES_CHANGED_PREFIX="%{$fg[yellow]%}" ZSH_THEME_GIT_FILES_CHANGED_SUFFIX="%{$reset_color%}" ZSH_THEME_GIT_LINES_ADDED_PREFIX="%{$fg[green]%}" ZSH_THEME_GIT_LINES_ADDED_SUFFIX="%{$reset_color%}" ZSH_THEME_GIT_LINES_REMOVED_PREFIX="%{$fg[red]%}" ZSH_THEME_GIT_LINES_REMOVED_SUFFIX="%{$fg[blue]%}" For example, if there are 3 files changed, 10 lines added and no lines removed you will get 3f:10+ 1 files changed, 20 lines added and 6 lines removed: 1f:20+:6- --- lib/git.zsh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/git.zsh b/lib/git.zsh index c9363274c..5d8d0d421 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -278,3 +278,34 @@ function git_repo_name() { echo ${repo_path:t} fi } + +# Outputs 3 stats for git repo +# 1) number of files changed, +# 2) the total number of lines added +# 3) total number of lines removed +# +# Example +# 3f:69+:6- +function git_files_changed() { + local -i files=0 + local -i insertions=0 + local -i deletions=0 + local raw=$(command git diff --numstat 2>/dev/null) || return 0 + if [[ -n $raw ]]; then + echo $raw | while IFS= read -r line; do + local -i d=$line[(w)2] + local -i i=$line[(w)1] + insertions+=i + deletions+=d + files+=1 + done + local output="$ZSH_THEME_GIT_FILES_CHANGED_PREFIX${files}f$ZSH_THEME_GIT_FILES_CHANGED_SUFFIX" + if (( $insertions > 0 )); then + output="$output:$ZSH_THEME_GIT_LINES_ADDED_PREFIX${insertions}+$ZSH_THEME_GIT_LINES_ADDED_SUFFIX" + fi + if (( $deletions > 0 )); then + output="$output:$ZSH_THEME_GIT_LINES_REMOVED_PREFIX${deletions}-$ZSH_THEME_GIT_LINES_REMOVED_SUFFIX" + fi + echo $output + fi +}