mirror of
https://github.com/arzzen/git-quick-stats.git
synced 2026-09-10 15:46:19 -04:00
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.
153 lines
4.2 KiB
Bash
Executable file
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
|