From 1c67c47c3026083a4cd7ff1b71771535ed7d370d Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Sat, 21 Jun 2025 23:48:12 +0200 Subject: [PATCH] rework of giti --- giti | 222 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 131 insertions(+), 91 deletions(-) diff --git a/giti b/giti index a47b3cd..ce2232d 100755 --- a/giti +++ b/giti @@ -1,9 +1,43 @@ #!/bin/bash # -# -# command line arguments -# +# DEFINITIONS ##################################################################################### +COLOR_WHITE="\033[00m" +COLOR_CYAN="\033[1;36m" +COLOR_RED="\033[1;31m" +COLOR_YELLOW="\033[1;33m" +COLOR_DARKYELLOW="\033[0;33m" +COLOR_GREEN="\033[1;32m" +COLOR_DARKGREEN="\033[0;32m" +COLOR_OCHRE="\033[38;5;95m" +COLOR_BLUE="\033[34m" + +SYMBOL_SPLIT=" " +SYMBOL_BRANCH="" +SYMBOL_NEW="…" +SYMBOL_AHEAD="↑" +SYMBOL_BEHIND="↓" +SYMBOL_CHANGED="✚" +SYMBOL_COMMITED="●" +SYMBOL_STASH="⚑" + +COLOR_BRANCH="$COLOR_GREEN" +COLOR_NEW="$COLOR_DARKYELLOW" +COLOR_AHEAD="$COLOR_WHITE" +COLOR_BEHIND="$COLOR_WHITE" +COLOR_CHANGED="$COLOR_RED" +COLOR_COMMITED="$COLOR_GREEN" +COLOR_STASH="$COLOR_BLUE" + +BRANCH_VAL="unknown" +AHEAD_VAL="0" +BEHIND_VAL="0" +NEW_VAL="0" +CHANGED_VAL="0" +COMMITED_VAL="0" + + +# COMMAND LINE ARGUMENTS ########################################################################## usage="Usage: $0 [-p | output for prompt] [-s | short output]" while getopts "hps" options; do case $options in @@ -18,102 +52,108 @@ while getopts "hps" options; do esac done -# -# color definitions -# -COLOR_WHITE="\033[00m" -COLOR_CYAN="\033[1;36m" -COLOR_RED="\033[1;31m" -COLOR_YELLOW="\033[1;33m" -COLOR_DARKYELLOW="\033[0;33m" -COLOR_GREEN="\033[1;32m" -COLOR_DARKGREEN="\033[0;32m" -COLOR_OCHRE="\033[38;5;95m" +# GIT COMMANDS #################################################################################### +GIT_URL="$(git config --get remote.origin.url 2> /dev/null)" +GIT_STATUS="$(LANGUAGE='en_US.UTF-8 git' git status -sb 2> /dev/null)" +GIT_FILES="$(git status -s 2> /dev/null)" +BRANCH_VAL="$(git branch 2> /dev/null | sed --quiet 's/* \(.*\)/\1/p')" +STASH_VAL=$(git stash list 2> /dev/null | wc -l) -# -# git information storage -# -git_status="$(LANGUAGE='en_US.UTF-8 git' git status 2> /dev/null)" -git_diff="$(git status -s 2> /dev/null)" - - -# # decision for git output (path is repository) -# -if [ -z "$git_status" ]; then +if [ -z "$GIT_STATUS" ]; then # No GIT repository exit fi -# -# git preparations -# -git_branch="$(git branch 2> /dev/null | sed --quiet 's/* \(.*\)/\1/p')" -git_url="$(git config --get remote.origin.url 2> /dev/null)" -if [[ ! $git_status =~ "working tree clean" ]] && [[ ! $git_status =~ "working directory clean" ]]; then - git_status_color="$COLOR_RED" - git_status_text="local changes" -elif [[ $git_status =~ "Your branch is behind" ]]; then - git_status_color="$COLOR_YELLOW" - git_status_text="pull required" -elif [[ $git_status =~ "Your branch is ahead of" ]]; then - git_status_color="$COLOR_YELLOW" - git_status_text="push required" -elif [[ $git_status =~ "nothing to commit" ]]; then - git_status_color="$COLOR_DARKGREEN" - git_status_text="clean " -else - git_status_color="$COLOR_OCHRE" - git_status_text="unknown " -fi +# GIT MAGIC ####################################################################################### +# BEHIND_VAL, AHEAD_VAL +BEHIND_VAL=$(echo $GIT_STATUS | grep -Po "behind\s+\K\w+") +AHEAD_VAL=$(echo $GIT_STATUS | grep -Po "ahead\s+\K\w+") - -# -# Start of console output -# - -## STATUS AND INFO ###### -if [[ $PROMPT ]]; then - # print status - echo -e "$git_status_color├──$COLOR_GREEN($git_branch)$git_status_color - $git_status_text - $COLOR_CYAN$git_url$COLOR_WHITE" -elif [[ $SHORT ]]; then - echo -n -e "$COLOR_GREEN($git_branch)$git_status_color - $git_status_text $COLOR_WHITE" - exit 0 -else - # print status and - echo -e "$git_status_color┌───┤ $git_status_text ├────────────────────────────────────────────────────────────────" - echo -e "$git_status_color│ $COLOR_GREEN($git_branch) $COLOR_CYAN$git_url" - - if [[ ! $git_diff == "" ]]; then - echo -e "$git_status_color├────────────────────────────────────────────────────────────────────────────────────" - fi -fi - -## FILE INFO ############ -if [[ ! $git_diff == "" ]]; then - if [[ ! $PROMPT || "$GIT_PROMPT_DETAILS" == "on" ]]; then - IFS=$'\n' - NEW_FILES=0 - for ENTRY in $git_diff; do - if [[ $ENTRY != "??"* ]]; then - if [[ $ENTRY = "D "* ]] || [[ $ENTRY = "A "* ]] || [[ $ENTRY = "M "* ]] || [[ $ENTRY = "R "* ]]; then - echo -e "$git_status_color│ $COLOR_DARKYELLOW$ENTRY" - else - echo -e "$git_status_color│ $COLOR_YELLOW$ENTRY" +# NEW_VAL, MODIFIED_VAL, COMMITED_VAL +GIT_STATUS_DETAILS="" +if [[ ! -z "$GIT_FILES" ]]; then + while IFS= read -r line ;do + FILES_STATUS=${line:0:2} + FILES_STATUS_COMMITED=${FILES_STATUS:0:1} + FILES_STATUS_CHANGED=${FILES_STATUS:1:1} + FILES_NAME=$(echo $line | awk '{print $2}') + # NEW FILE increase + if [[ $FILES_STATUS == "??" ]]; then + ((NEW_VAL++)) fi - else - NEW_FILES=1 - fi - done - if [[ $NEW_FILES != 0 ]]; then - echo -e "$git_status_color│ $COLOR_YELLOW N ..." - fi - fi + + # CHANGED + if [[ $FILES_STATUS_CHANGED != "?" && $FILES_STATUS_CHANGED != " " && $FILES_STATUS_CHANGED != "" ]]; then + ((CHANGED_VAL++)) + fi + + # COMMITED + if [[ $FILES_STATUS_COMMITED != "?" && $FILES_STATUS_COMMITED != " " && $FILES_STATUS_COMMITED != "" ]]; then + ((COMMITED_VAL++)) + fi + + done <<< "$GIT_FILES" fi -## CLOSING ############## -if [[ $PROMPT ]]; then - echo -e " \b" -else - echo -e "$git_status_color└────────────────────────────────────────────────────────────────────────────────────$COLOR_WHITE\n \b" +# GIT STATUS COLOR ################################################################################ +if [[ $COMMITED_VAL > 0 || $CHANGED_VAL > 0 || $NEW_VAL > 0 ]]; then + COLOR_BRANCH="$COLOR_YELLOW" +elif [[ $BEHIND_VAL > 0 || $AHEAD_VAL > 0 ]]; then + COLOR_BRANCH="$COLOR_YELLOW" +fi + +# GIT GATHERING ################################################################################### +BRANCH="$COLOR_BRANCH$SYMBOL_BRANCH$BRANCH_VAL" +BEHIND="$COLOR_BEHIND$SYMBOL_BEHIND$BEHIND_VAL" +AHEAD="$COLOR_AHEAD$SYMBOL_AHEAD$AHEAD_VAL" +NEW="$COLOR_NEW$SYMBOL_NEW$NEW_VAL" +CHANGED="$COLOR_CHANGED$SYMBOL_CHANGED$CHANGED_VAL" +COMMITED="$COLOR_COMMITED$SYMBOL_COMMITED$COMMITED_VAL" +STASH="$COLOR_STASH$SYMBOL_STASH$STASH_VAL" + +# GIT OUTPUT ###################################################################################### +GIT_STATUS_SUMMARY="$BRANCH" +if [[ $BEHIND_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$BEHIND +fi +if [[ $AHEAD_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$AHEAD +fi +if [[ $COMMITED_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$COMMITED +fi +if [[ $CHANGED_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$CHANGED +fi +if [[ $NEW_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$NEW +fi +if [[ $STASH_VAL > 0 ]]; then + GIT_STATUS_SUMMARY=$GIT_STATUS_SUMMARY$SYMBOL_SPLIT$STASH +fi + +if [[ $PROMPT == "True" ]]; then + if [[ $SHORT == "True" ]]; then + echo -ne "$COLOR_WHITE($GIT_STATUS_SUMMARY$COLOR_WHITE)" + else + echo -e "$COLOR_DARKGREEN├──($GIT_STATUS_SUMMARY$COLOR_DARKGREEN) - $COLOR_CYAN$GIT_URL" + if [[ $GIT_PROMPT_DETAILS == "on" && ! -z "$GIT_FILES" ]]; then + while IFS= read -r line ;do + if [[ $line != "??"* ]]; then + echo -e "$COLOR_DARKGREEN│ $COLOR_BRANCH$line" + fi + done <<< "$GIT_FILES" + fi + echo -ne "\b" + fi +else + echo -e " $GIT_STATUS_SUMMARY$COLOR_DARKGREEN - $COLOR_CYAN$GIT_URL\n" + if [[ ! -z "$GIT_FILES" ]]; then + while IFS= read -r line ;do + if [[ $line != "??"* ]]; then + echo -e " $COLOR_BRANCH$line" + fi + done <<< "$GIT_FILES" + fi fi