#!/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 --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 --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 --date=short --format='%ad' | sort | uniq -c show_menu ;; 4) clear option_picked "Git commits per author:" git shortlog -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 --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 --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