diff --git a/gitstatus.sh b/gitstatus.sh index df90245..bb98436 100755 --- a/gitstatus.sh +++ b/gitstatus.sh @@ -5,9 +5,6 @@ # # Alan K. Stebbens [http://github.com/aks] -# helper functions -count_lines() { echo "$1" | egrep -c $3 "^$2" ; } - if [ -z "${__GIT_PROMPT_DIR}" ]; then SOURCE="${BASH_SOURCE[0]}" while [ -h "${SOURCE}" ]; do @@ -23,17 +20,27 @@ gitstatus=`LC_ALL=C git status --porcelain --branch` # if the status is fatal, exit now [[ "$?" -ne 0 ]] && exit 0 -num_staged=`count_lines "$gitstatus" "(\?\?|##| )" "-v"` -num_changed=`count_lines "$gitstatus" ".M"` -num_conflicts=`count_lines "$gitstatus" "U"` -num_untracked=`count_lines "$gitstatus" "\?\?"` +num_staged=0 +num_changed=0 +num_conflicts=0 +num_untracked=0 +while IFS='' read -r line || [[ -n "$line" ]]; do + status=${line:0:2} + case "$status" in + \#\#) branch_line="$line" ;; + *M) ((num_changed++)) ;; + U*) ((num_conflicts++)) ;; + \?\?) ((num_untracked++)) ;; + *) ((num_staged++)) ;; + esac +done <<< "$gitstatus" if [[ "$__GIT_PROMPT_IGNORE_STASH" = "1" ]]; then num_stashed=0 else stash_file="`git rev-parse --git-dir`/logs/refs/stash" if [[ -e "${stash_file}" ]]; then - num_stashed=`wc -l "${stash_file}" | cut -d' ' -f 1` + num_stashed=`cat "${stash_file} | wc -l` else num_stashed=0 fi @@ -46,7 +53,6 @@ fi remote= -branch_line=`echo "$gitstatus" | grep "^##"` IFS="." read -ra line <<< "${branch_line/\#\# }" branch="${line[0]}"