#!/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() { option_picked "Detailed stats per author, including contribution to the total change:" git log --no-merges --numstat | awk ' function printStats(author) { printf "%s:\n", author printf " first -> last: %s -> %s \n", first[author] , last[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 } /^Date:/ { $1=""; first[author] = substr($0, 2) if(last[author] == "" ) { last[author] = first[author] } } /^[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") }' } function suggestReviewers() { option_picked "Suggest code reviewers based on git history:" git log --no-merges --pretty=%an $* | head -n 100 | sort | uniq -c | sort -nr } function commitsPerDay() { option_picked "Git commits per day:"; git log --no-merges --date=short --format='%ad' | sort | uniq -c } function commitsPerAuthor() { option_picked "Git commits per author:" git shortlog --no-merges -s -n | sort -nr } function myDailyStats() { option_picked "My daily status:" git diff --shortstat "@{0 day ago}" | sort -nr } function contributors() { option_picked "List repository contributors by author name (sorted by name):" git log --no-merges --format='%aN' | sort -u } function branchesByDate() { option_picked "List of all the branches, ordered by most recent commits:" git for-each-ref --sort=committerdate refs/heads/ --format='[%(authordate:relative)] %(authorname) %(color:yellow)%(refname:short)%(color:reset)' } function changelogs() { option_picked "Generate git changelogs:" git log --pretty=format:"- %s%n%b" --since="$(git show -s --format=%ad `git rev-list --all --max-count=1`)" | sort -nr } if [ $# -eq 1 ] then case $1 in "suggestReviewers") suggestReviewers ;; "detailedGitStats") detailedGitStats ;; "commitsPerDay") commitsPerDay ;; "commitsPerAuthor") commitsPerAuthor ;; "myDailyStats") myDailyStats ;; "contributors") contributors ;; "branchesByDate") branchesByDate ;; "changelogs") changelogs ;; *) echo "Invalid argument. Possible arguments: suggestReviewers, detailedGitStats, commitsPerDay, commitsPerAuthor, myDailyStats, contributors, branchesByDate, changelogs" ;; esac exit 0; fi if [ $# -gt 1 ] then echo "Usage: git quick-stats "; exit 1; fi clear show_menu while [ opt != '' ] do if [[ $opt = "" ]]; then exit; else clear case $opt in 1) suggestReviewers show_menu ;; 2) detailedGitStats show_menu ;; 3) commitsPerDay show_menu ;; 4) commitsPerAuthor show_menu ;; 5) myDailyStats show_menu ;; 6) contributors show_menu ;; 7) branchesByDate show_menu ;; 8) changelogs show_menu ;; x) exit ;; \n) exit ;; *) clear option_picked "Pick an option from the menu" show_menu ;; esac fi done