zsh-config/zsh/apps/gitinfo.app.zsh

175 lines
6.2 KiB
Bash

GITINFO_BRANCH=""
GITINFO_COMMIT_ID=""
GITINFO_COMMIT_SHORTID=""
GITINFO_COMMIT_COUNT=0
GITINFO_DELETED_FILES=""
GITINFO_MODIFIED_FILES=""
GITINFO_NEW_FILES=""
GITINFO_RECHECK=0
GITINFO_REMOTES=""
GITINFO_STASHES_COUNT=0
GITINFO_TOPLEVEL_DIR=""
GITINFO_UNTRACKED_COUNT=0
######################################################################
# Main function.
######################################################################
function gitinfo()
{
GITINFO_RECHECK=1
gitinfo_internal_checks
if [ $? -eq 1 ]; then
echo "This is not a git repository."
return 1
fi
gitinfo_get_info
if [ $? -eq 0 ]; then
echo "Git repository information:"
echo "======================================================================"
echo "| Branch | $fg[yellow]${GITINFO_BRANCH}$reset_color"
echo "| Commit | $fg[green]${GITINFO_COMMIT_ID}$reset_color"
echo "| Commits count | ${GITINFO_COMMIT_COUNT}"
echo "| Changes | $fg[green]${GITINFO_NEW_FILES}$reset_color new, $fg[yellow]${GITINFO_MODIFIED_FILES}$reset_color modified, $fg[red]${GITINFO_DELETED_FILES}$reset_color deleted, $fg[gray]${GITINFO_UNTRACKED_COUNT}$reset_color untracked"
echo "| Stashes | ${GITINFO_STASHES_COUNT}"
echo "======================================================================"
else
echo "This is not a git repository. But you seeing this message. So it's a bug in 'gitinfo' application. Please, report to developer!"
fi
}
######################################################################
# Adds some of gitinfo's functions into chpwd array.
######################################################################
function gitinfo_chpwd()
{
emulate -L zsh
precmd_functions=(${precmd_functions[@]} "gitinfo_get_info")
}
######################################################################
# Checks if variables was set.
# Useful to call if we're using this app in prompt configuration.
######################################################################
function gitinfo_check()
{
curdir=`pwd`
GITINFO_TOPLEVEL_DIR=`git rev-parse --show-toplevel 2>/dev/null`
if [ $? -ne 0 ]; then
GITINFO_TOPLEVEL_DIR=""
log 1 "Failed to get git toplevel directory! (command 'git rev-parse --show-toplevel 2>/dev/null' failed)"
return 1
fi
log 1 "Git top directory: ${GITINFO_TOPLEVEL_DIR}"
}
######################################################################
# Gets current repo branch.
######################################################################
function gitinfo_get_branch()
{
GITINFO_BRANCH=`git branch | grep "*" | cut -d " " -f 2`
}
######################################################################
# Gets current changes, if any.
######################################################################
function gitinfo_get_changes()
{
GITINFO_NEW_FILES=`LC_ALL=C git status | grep "new" | wc -l | sed "s/ //g"`
GITINFO_MODIFIED_FILES=`LC_ALL=C git status | grep "modified" | wc -l | sed "s/ //g"`
GITINFO_DELETED_FILES=`LC_ALL=C git status | grep "deleted" | wc -l | sed "s/ //g"`
}
######################################################################
# Gets current repo commit info, like long hash, short hash,
# commits count.
######################################################################
function gitinfo_get_commit_data()
{
GITINFO_COMMIT_SHORTID=`git rev-parse --short HEAD 2>/dev/null | sed "s/ //g"`
GITINFO_COMMIT_ID=`git log 2>/dev/null | head -n 1 | cut -d " " -f 2 | sed "s/ //g"`
GITINFO_COMMIT_COUNT=`git log 2>/dev/null | grep "commit " | wc -l | sed "s/ //g"`
}
######################################################################
# This function should be called to obtain neccessary data.
######################################################################
function gitinfo_get_info()
{
gitinfo_check
if [ $? -eq 0 ]; then
gitinfo_get_branch
gitinfo_get_changes
gitinfo_get_commit_data
gitinfo_get_remotes
gitinfo_get_stashes
gitinfo_get_untracked
else
GITINFO_BRANCH=""
GITINFO_COMMIT_ID=""
GITINFO_COMMIT_SHORTID=""
GITINFO_COMMIT_COUNT=0
GITINFO_DELETED_FILES=""
GITINFO_MODIFIED_FILES=""
GITINFO_NEW_FILES=""
GITINFO_RECHECK=0
GITINFO_REMOTES=""
GITINFO_STASHES_COUNT=0
GITINFO_TOPLEVEL_DIR=""
GITINFO_UNTRACKED_COUNT=0
fi
}
######################################################################
# Gets remotes
######################################################################
function gitinfo_get_remotes()
{
GITINFO_REMOTES=$(git remote -v | awk {' print $2 '} | uniq | wc -l | sed "s/ //g")
}
######################################################################
# Gets current repo stashes count.
######################################################################
function gitinfo_get_stashes()
{
GITINFO_STASHES_COUNT=`git stash list 2>/dev/null | wc -l | sed "s/ //g"`
}
######################################################################
# Gets current repo untracked files and directories count.
######################################################################
function gitinfo_get_untracked()
{
GITINFO_UNTRACKED_COUNT=`LC_ALL=C git status | grep -v "be committed|On branch|nothing added|Untracked files|git add|Your branch|new file|git reset|nothing to commit|not staged|git checkout|modified:" | sed '/^$/d' | wc -l | sed "s/ //g"`
}
######################################################################
# Some common checks that is used everywhere.
######################################################################
function gitinfo_internal_checks()
{
if [ ${GITINFO_RECHECK} -eq 0 ]; then
error 1 "gitinfo_internal_checks() called without GITINFO_RECHECK=1, aborting"
return 1
fi
if [ ${#GITINFO_TOPLEVEL_DIR} -ne 0 ]; then
objects=`ls ${GITINFO_TOPLEVEL_DIR}/.git/objects | grep -v "info\|index" | wc -l`
if [ ${objects} -lt 1 ]; then
error 1 "Failed to get git objects directory members count!"
return 1
fi
else
log 1 "GITINFO_TOPLEVEL_DIR isn't specified."
return 1
fi
GITINFO_RECHECK=0
}