Petit tour du propriétaire
Ma config Zsh n'est pas parfaite, elle peut même paraître trop lourde pour certains, mais avant de tourner la page, laissez-moi le temps de vous présenter ses avantages.
Dans la liste des inconvénients :
- Prompt parfois pas très très réactif (ce n'est vrai que dans les dossiers gérés avec .git − comme c'est le cas de mon $HOME ..), mais c'est désactivable..
- Beaucoup de fichiers éclatés un peu partout (mais en fait, c'est un avantage..)
- Les goûts et les couleurs
Quant aux avantages :
- Les goûts et les couleurs !
- Personnalisation à différents niveaux : selon le réseau, selon la machine, selon le compte utilisateur ; permettant de partager la même configuration entre différents comptes
- Statut git en temps réel :
- Le nom de la branche dans laquelle on travaille, ou à défaut, le nom le plus lisible possible, entre parenthèses, pour bien montrer qu'on n'est PAS dans une branche...
- La couleur permet de connaître d'un coup d'oeil le statut du
dépôt :
- Pas de couleur = dépôt clean
- vert : dépôt pas clean
- vert gras : différences prêtes à être committées, mais dépôt pas complètement clean
- jaune gras : toutes les différences sont prêtes à être committées
- noir : dépôt à peine initialisé, sans commits
- rouge : hum.. vous n'avez rien à faire ici ! ;)
- Aide lors des rebases : affichage du commit de base -> commit courant, ainsi que du nom de la branche en cours de rebase, et le nombre de commits rebasés/total...
- Gestion des agents SSH (avec affichage du statut : clef présente ou non) et GnuPG
- Affichage de la date d'exécution de la commande, et non d'affichage du prompt...
Git rebase in progress...
get_git_branch ()
{
local my_git_branch checkouted_branch="yes"
if [ ! -z "$DO_NOT_CHECK_GIT_BRANCH" ]
then
return
fi
[ "$( ( git-ls-files ; git-ls-tree HEAD . ) 2>&- | head -n1)" = ""
-a \( ! -d .git -o "$(git-rev-parse --git-dir 2>&-)" != ".git" \)
-a "$(git-rev-parse --is-inside-git-dir 2>&-)" != "true" ] && return
GIT_DIR=$(git-rev-parse --git-dir)
# Get current working GIT branch
my_git_branch="$(git-branch 2>&- | grep -E '^\* ' | cut -c3-)"
if [ "$my_git_branch" != "" ]
then
# If not on a working GIT branch,
# get the named current commit-ish inside parenthesis
[ "$my_git_branch" = "(no branch)" ] &&\
checkouted_branch="" && \
my_git_branch="$(git-name-rev --name-only HEAD 2>&- |
sed 's,^tags/,,;s,^remotes/,,;s,\^0$,,')"
# If neither on a named commit-ish, show commit-id
if [ "$my_git_branch" = "undefined" ]
then
my_git_branch="$(git-rev-parse --verify HEAD 2>&-)"
fi
else
# Initial commit
if [ -L $GIT_DIR/HEAD -a ! -f $GIT_DIR/HEAD ]
then
my_git_branch="$(basename $GIT_DIR/$(
stat --printf="%N\n" $GIT_DIR/HEAD |
tr '`' "'" | cut -d\' -f4))"
else
my_git_branch="$(basename $GIT_DIR/$(
cat $GIT_DIR/HEAD |
sed 's/^\([0-9a-f]\{2\}\)\([0-9a-f]\{38\}\)$/¬
objects\/\1\/\2/;s/^ref: //'))"
fi
fi
# Rebase in progress ?
if [ -d $GIT_DIR/rebase-merge -o -d $GIT_DIR/rebase-apply ]
then
local rebase current last
local REBASE_DIR
if [ -d $GIT_DIR/rebase-merge ]
then
REBASE_DIR=$GIT_DIR/rebase-merge
else
REBASE_DIR=$GIT_DIR/rebase-apply
fi
if [ "$REBASE_DIR" = "$GIT_DIR/rebase-merge" ]
then
current=$(< $REBASE_DIR/done wc -l)
last=$(( $current + $(
< $REBASE_DIR/git-rebase-todo \
grep -v "^#\|^[[:blank:]]*$" | wc -l) ))
rebase=$rebase$rebase_in_progress": "
else
current=$(cat $REBASE_DIR/next)
last=$(cat $REBASE_DIR/last)
fi
# Then the result
my_git_branch="[rebase $current/$last: "$(
git-name-rev --name-only $(
cat $REBASE_DIR/onto))".."$my_git_branch"] "$(
< $REBASE_DIR/head-name sed 's/^refs\///;s/^heads\///')
else
# No rebase in progress, put '(' ')' if needed
[ ! "$checkouted_branch" ] && my_git_branch="($my_git_branch)"
fi
if [ "$(git-status 2>&- | grep "new file" | head -n1)" != "" ] ; then
# ADDED FILES
my_git_branch=$my_git_branch
fi
echo $my_git_branch
}
Git status : up-to-date ? added files ? clean ?
# We *must* have previously checked that
# we obtained a correct GIT branch with
# a call to `get_git_branch`
get_git_status ()
{
local my_git_status cached not_up_to_date managment_folder
if [ ! -z "$DO_NOT_CHECK_GIT_STATUS" ]
then return
fi
if [ "$(git-rev-parse --is-inside-git-dir)" = "true"
-o "$(git-config --get core.bare)" = "true" ] ; then
echo "$git_colors[managment_folder]"
return
fi
if [ "$(git-diff --cached 2>&- | grep '^diff ' | head -n1 )" != "" ] ; then
cached="yes"
fi
if [ "$(git-ls-files -m 2>&- | head -n1)" != "" ] ; then
not_up_to_date="yes"
fi
GIT_DIR=$(git-rev-parse --git-dir 2>/dev/null)
if [ "$cached" != "" -a "$not_up_to_date" != "" ] ; then
my_git_status="$git_colors[cached_and_not_up_to_date]"
elif [ "$cached" != "" ] ; then
my_git_status="$git_colors[cached]"
elif [ "$not_up_to_date" != "" ] ; then
my_git_status="$git_colors[not_up_to_date]"
elif [ "$(git-cat-file -t HEAD 2>/dev/null)" != "commit" ] ; then
if [ ! -z "$(git-ls-files)" ] ; then
my_git_status="$git_colors[cached]"
else
my_git_status="$git_colors[init_in_progress]"
fi
else
my_git_status="$git_colors[up_to_date]"
fi
echo $my_git_status
}
