tmux-kanagawa/scripts/git.sh
Nuno Sá 135637745d scripts: git: add option for untracked files
By default 'git status' will look for untracked files and the script will
always detect that the local tree has changes if untracked files are
present. That is not always optimal since sometimes we might have, for
example, some custom build scripts (for some project) that is always
present and we don't want the status bar to always indicate changes.

Hence, add an option to disable this behavior by adding the '-uno' flag
to 'git status'. The default behavior is still maintained.

Signed-off-by: Nuno Sá <noname.nuno@gmail.com>
2022-09-05 16:07:43 +02:00

156 lines
3.6 KiB
Bash
Executable file

#!/usr/bin/env bash
current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $current_dir/utils.sh
IFS=' ' read -r -a hide_status <<< $(get_tmux_option "@dracula-git-disable-status" "false")
IFS=' ' read -r -a current_symbol <<< $(get_tmux_option "@dracula-git-show-current-symbol" "✓")
IFS=' ' read -r -a diff_symbol <<< $(get_tmux_option "@dracula-git-show-diff-symbol" "!")
IFS=' ' read -r -a no_repo_message <<< $(get_tmux_option "@dracula-git-no-repo-message" "")
IFS=' ' read -r -a no_untracked_files <<< $(get_tmux_option "@dracula-git-no-untracked-files" "false")
# Get added, modified, updated and deleted files from git status
getChanges()
{
declare -i added=0;
declare -i modified=0;
declare -i updated=0;
declare -i deleted=0;
for i in $(git -C $path status -s)
do
case $i in
'A')
added+=1
;;
'M')
modified+=1
;;
'U')
updated+=1
;;
'D')
deleted+=1
;;
esac
done
output=""
[ $added -gt 0 ] && output+="${added}A"
[ $modified -gt 0 ] && output+=" ${modified}M"
[ $updated -gt 0 ] && output+=" ${updated}U"
[ $deleted -gt 0 ] && output+=" ${deleted}D"
echo $output
}
# getting the #{pane_current_path} from dracula.sh is no longer possible
getPaneDir()
{
nextone="false"
for i in $(tmux list-panes -F "#{pane_active} #{pane_current_path}");
do
if [ "$nextone" == "true" ]; then
echo $i
return
fi
if [ "$i" == "1" ]; then
nextone="true"
fi
done
}
# check if the current or diff symbol is empty to remove ugly padding
checkEmptySymbol()
{
symbol=$1
if [ "$symbol" == "" ]; then
echo "true"
else
echo "false"
fi
}
# check to see if the current repo is not up to date with HEAD
checkForChanges()
{
[ $no_untracked_files == "false" ] && no_untracked="" || no_untracked="-uno"
if [ "$(checkForGitDir)" == "true" ]; then
if [ "$(git -C $path status -s $no_untracked)" != "" ]; then
echo "true"
else
echo "false"
fi
else
echo "false"
fi
}
# check if a git repo exists in the directory
checkForGitDir()
{
if [ "$(git -C $path rev-parse --abbrev-ref HEAD)" != "" ]; then
echo "true"
else
echo "false"
fi
}
# return branch name if there is one
getBranch()
{
if [ $(checkForGitDir) == "true" ]; then
echo $(git -C $path rev-parse --abbrev-ref HEAD)
else
echo $no_repo_message
fi
}
# return the final message for the status bar
getMessage()
{
if [ $(checkForGitDir) == "true" ]; then
branch="$(getBranch)"
if [ $(checkForChanges) == "true" ]; then
changes="$(getChanges)"
if [ "${hide_status}" == "false" ]; then
if [ $(checkEmptySymbol $diff_symbol) == "true" ]; then
echo "${changes} $branch"
else
echo "$diff_symbol ${changes} $branch"
fi
else
if [ $(checkEmptySymbol $diff_symbol) == "true" ]; then
echo "$branch"
else
echo "$diff_symbol $branch"
fi
fi
else
if [ $(checkEmptySymbol $current_symbol) == "true" ]; then
echo "$branch"
else
echo "$current_symbol $branch"
fi
fi
else
echo $no_repo_message
fi
}
main()
{
path=$(getPaneDir)
getMessage
}
#run main driver program
main