arzzen.git-quick-stats/git-quick-stats
Linell 02558e75a4 restrict to non-merge commits
Restrict the commits used in generating stats to commits that aren't
merges. For repos that have lots of pull requests that are merged in it
can really throw off the statistics.
2017-01-16 20:57:20 -06:00

153 lines
4.2 KiB
Bash
Executable file

#!/bin/bash
set -o nounset
set -o errexit
show_menu() {
NORMAL=`echo "\033[m"`
MENU=`echo "\033[36m"`
NUMBER=`echo "\033[33m"`
FGRED=`echo "\033[41m"`
RED_TEXT=`echo "\033[31m"`
ENTER_LINE=`echo "\033[33m"`
echo -e ""
echo -e "${MENU} ${NUMBER} 1)${MENU} Suggest code reviewers based on git history ${NORMAL}"
echo -e "${MENU} ${NUMBER} 2)${MENU} Detailed stats per author, including contribution to the total change ${NORMAL}"
echo -e "${MENU} ${NUMBER} 3)${MENU} Git commits per day ${NORMAL}"
echo -e "${MENU} ${NUMBER} 4)${MENU} Git commits per author ${NORMAL}"
echo -e "${MENU} ${NUMBER} 5)${MENU} Get own stats for the day ${NORMAL}"
echo -e "${MENU} ${NUMBER} 6)${MENU} List repository contributors by author name (sorted by name) ${NORMAL}"
echo -e "${MENU} ${NUMBER} 7)${MENU} List of all the branches, ordered by most recent commits ${NORMAL}"
echo -e "${MENU} ${NUMBER} 8)${MENU} Generate git changelogs ${NORMAL}"
echo -e ""
echo -e "${ENTER_LINE}Please enter a menu option and enter or ${RED_TEXT}enter to exit. ${NORMAL}"
read opt
}
function option_picked() {
COLOR='\033[01;31m'
RESET='\033[00;00m'
MESSAGE=${@:-"${RESET}Error: No message passed"}
echo -e "${COLOR}${MESSAGE}${RESET}"
}
function detailedGitStats() {
git log --no-merges --numstat | awk '
function printStats(author) {
printf "%s:\n", author
printf " insertions: %d (%.0f%%)\n", more[author], (more[author] / more["total"] * 100)
printf " deletions: %d (%.0f%%)\n", less[author], (less[author] / less["total"] * 100)
printf " files: %d (%.0f%%)\n", file[author], (file[author] / file["total"] * 100)
printf " commits: %d (%.0f%%)\n", commits[author], (commits[author] / commits["total"] * 100)
}
/^Author:/ {
author = $2 " " $3
commits[author] += 1
commits["total"] += 1
}
/^[0-9]/ {
more[author] += $1
less[author] += $2
file[author] += 1
more["total"] += $1
less["total"] += $2
file["total"] += 1
}
END {
for (author in commits) {
if (author != "total") {
printStats(author)
}
}
printStats("total")
}'
}
clear
show_menu
while [ opt != '' ]
do
if [[ $opt = "" ]]; then
exit;
else
case $opt in
1)
clear
option_picked "Suggest code reviewers based on git history:"
git log --no-merges --pretty=%an $* | head -n 100 | sort | uniq -c | sort -nr
show_menu
;;
2)
clear
option_picked "Detailed stats per author, including contribution to the total change:"
detailedGitStats
show_menu
;;
3)
clear
option_picked "Git commits per day:";
git log --no-merges --date=short --format='%ad' | sort | uniq -c
show_menu
;;
4)
clear
option_picked "Git commits per author:"
git shortlog --no-merges -s -n
show_menu
;;
5)
clear
option_picked "Get own stats for the day:"
git diff --shortstat "@{0 day ago}"
show_menu
;;
6)
clear
option_picked "List repository contributors by author name (sorted by name):"
git log --no-merges --format='%aN' | sort -u
show_menu
;;
7)
clear
option_picked "List of all the branches, ordered by most recent commits:"
git for-each-ref --sort=committerdate refs/heads/ --format='[%(authordate:relative)] %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
show_menu
;;
8)
clear
option_picked "Generate git changelogs:"
git log --no-merges --pretty=format:"- %s%n%b" --since="$(git show -s --format=%ad `git rev-list --tags --max-count=1`)"
show_menu
;;
x)
exit
;;
\n)
exit
;;
*)
clear
option_picked "Pick an option from the menu"
show_menu
;;
esac
fi
done