#!/bin/sh
# gitstat -- quick git project health overview
# Usage: gitstat [path]
dir="${1:-.}"
cd "$dir" 2>/dev/null || { echo "Not a directory: $dir"; exit 1; }
git rev-parse --git-dir >/dev/null 2>&1 || { echo "Not a git repo: $dir"; exit 1; }
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
remote=$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null || echo "none")
ahead=$(git rev-list --count '@{upstream}'..HEAD 2>/dev/null || echo "?")
behind=$(git rev-list --count 'HEAD..@{upstream}' 2>/dev/null || echo "?")
staged=$(git diff --cached --numstat 2>/dev/null | wc -l)
unstaged=$(git diff --numstat 2>/dev/null | wc -l)
untracked=$(git ls-files --others --exclude-standard 2>/dev/null | wc -l)
last_commit=$(git log -1 --format='%ar - %s' 2>/dev/null)
total_commits=$(git rev-list --count HEAD 2>/dev/null)
contributors=$(git shortlog -sn --all 2>/dev/null | wc -l)
printf "Branch: %s\n" "$branch"
printf "Tracking: %s\n" "$remote"
printf "Ahead/Behind: +%s / -%s\n" "$ahead" "$behind"
printf "Staged: %s files\n" "$staged"
printf "Unstaged: %s files\n" "$unstaged"
printf "Untracked: %s files\n" "$untracked"
printf "Last commit: %s\n" "$last_commit"
printf "Total: %s commits by %s contributors\n" "$total_commits" "$contributors"
if [ "$unstaged" -gt 0 ] || [ "$staged" -gt 0 ] || [ "$untracked" -gt 0 ]; then
echo "---"
git status -sb
fi