diff --git a/git-quick-stats b/git-quick-stats index 15173d2..154b60a 100755 --- a/git-quick-stats +++ b/git-quick-stats @@ -165,73 +165,89 @@ function option_picked() { # OUTS: None ################################################################################ function detailedGitStats() { - option_picked "Contribution stats (by author):" - git -c log.showSignature=false log --use-mailmap --no-merges --numstat \ - --pretty="format:commit %H%nAuthor: %aN <%aE>%nDate: %ad%n%n%w(0,4,4)%B%n" \ - $_since $_until $_pathspec | LC_ALL=C awk ' - function printStats(author) { - printf "\t%s:\n", author + local branch="${1:-}" + local _branch="" - if(more["total"] > 0) { - printf "\t insertions: %d (%.0f%%)\n", more[author], \ - (more[author] / more["total"] * 100) - } + if [[ -z "${branch}" ]]; then + option_picked "Contribution stats (by author):" + else + option_picked "Contribution stats (by author) on ${branch} branch:" + _branch="${branch}" + fi - if(less["total"] > 0) { - printf "\t deletions: %d (%.0f%%)\n", less[author], \ - (less[author] / less["total"] * 100) - } + { + + git -c log.showSignature=false log ${branch} --use-mailmap --no-merges --numstat \ + --pretty="format:commit %H%nAuthor: %aN <%aE>%nDate: %ad%n%n%w(0,4,4)%B%n" \ + $_since $_until $_pathspec | LC_ALL=C awk ' + function printStats(author) { + printf "\t%s:\n", author - if(file["total"] > 0) { - printf "\t files: %d (%.0f%%)\n", file[author], \ - (file[author] / file["total"] * 100) - } - - if(commits["total"] > 0) { - printf "\t commits: %d (%.0f%%)\n", commits[author], \ - (commits[author] / commits["total"] * 100) - } - - if (first[author] != "") { - printf "\t lines changed: %s\n", more[author] + less[author] - printf "\t first commit: %s\n", first[author] - printf "\t last commit: %s\n", last[author] - } - - printf "\n" - } - - /^Author:/ { - $1 = "" - author = $0 - 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) + if(more["total"] > 0) { + printf "\t insertions: %d (%.0f%%)\n", more[author], \ + (more[author] / more["total"] * 100) } - } - printStats("total") - }' + + if(less["total"] > 0) { + printf "\t deletions: %d (%.0f%%)\n", less[author], \ + (less[author] / less["total"] * 100) + } + + if(file["total"] > 0) { + printf "\t files: %d (%.0f%%)\n", file[author], \ + (file[author] / file["total"] * 100) + } + + if(commits["total"] > 0) { + printf "\t commits: %d (%.0f%%)\n", commits[author], \ + (commits[author] / commits["total"] * 100) + } + + if (first[author] != "") { + printf "\t lines changed: %s\n", more[author] + less[author] + printf "\t first commit: %s\n", first[author] + printf "\t last commit: %s\n", last[author] + } + + printf "\n" + } + + /^Author:/ { + $1 = "" + author = $0 + 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") + }' + } || { + # If branch does not exist + echo "Branch does not exist"; + show_menu + } } ################################################################################ @@ -492,6 +508,14 @@ if [[ "$#" -eq 1 ]]; then case "$1" in -r|--suggest-reviewers) suggestReviewers;; -T|--detailed-git-stats) detailedGitStats;; + # TODO + -R|--git-stats-by-branch) + branch="" + while [[ -z "${branch}" ]]; do + read -r -p "Which branch? " branch + done + detailedGitStats "${branch}";; + # END TODO -b|--branch-tree) branchTree;; -d|--commits-per-day) commitsPerDay;; -a|--commits-per-author) commitsPerAuthor;;