mirror of
https://github.com/git-quick-stats/git-quick-stats.git
synced 2025-12-21 12:13:52 +01:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b08bb0b52 | ||
|
|
08d1a5a6e3 | ||
|
|
f5c2b82f02 | ||
|
|
bf29c19cf5 | ||
|
|
c6cb74a5e0 | ||
|
|
3f0befcd07 | ||
|
|
292876846d | ||
|
|
e70c288225 | ||
|
|
4d2621b084 | ||
|
|
2318d42765 | ||
|
|
ef74d79102 | ||
|
|
82f8690285 | ||
|
|
0f641ea0e6 | ||
|
|
6c7bd4fddf | ||
|
|
9f9617b88b | ||
|
|
8cea653d6c | ||
|
|
efa004122e | ||
|
|
0534327006 | ||
|
|
a113dc306f | ||
|
|
0fc2fe956b | ||
|
|
1efe3133dc | ||
|
|
3fd0ee2453 | ||
|
|
a4f19c9e54 | ||
|
|
cd38c40fe8 | ||
|
|
3283122a38 | ||
|
|
920b95c042 | ||
|
|
810ffcff54 | ||
|
|
f9df7ee5e2 | ||
|
|
e31fc931c8 | ||
|
|
0655814800 | ||
|
|
1eb8c53f09 |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -2,4 +2,5 @@
|
||||
|
||||
github: [arzzen]
|
||||
open_collective: git-quick-stats
|
||||
ko_fi: lukasmestan
|
||||
custom: ['https://lukasmestan.com/thanks/']
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Lukáš Mešťan
|
||||
Copyright (c) 2021 Lukáš Mešťan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
32
README.md
32
README.md
@@ -1,5 +1,5 @@
|
||||
|
||||
# GIT quick statistics [](#backers) [](#sponsors) [](https://twitter.com/intent/tweet?text=Simple%20and%20efficient%20way%20to%20access%20various%20statistics%20in%20git%20repository&url=https://github.com/arzzen/git-quick-stat&via=arzzen&hashtags=git,stats,tool,statistics,developers) [](https://travis-ci.org/arzzen/git-quick-stats) [](http://braumeister.org/formula/git-quick-stats) [](https://repology.org/metapackage/git-quick-stats/packages)
|
||||
# GIT quick statistics [](#backers) [](#sponsors) [](https://twitter.com/intent/tweet?text=Simple%20and%20efficient%20way%20to%20access%20various%20statistics%20in%20git%20repository&url=https://github.com/arzzen/git-quick-stat&via=arzzen&hashtags=git,stats,tool,statistics,developers) [](https://travis-ci.org/arzzen/git-quick-stats) [](https://formulae.brew.sh/formula/git-quick-stats#default) [](https://repology.org/metapackage/git-quick-stats/packages)
|
||||
|
||||
> `git-quick-stats` is a simple and efficient way to access various statistics in a git repository.
|
||||
>
|
||||
@@ -18,6 +18,7 @@
|
||||
* [**Command-line arguments**](#command-line-arguments)
|
||||
* [**Git log since and until**](#git-log-since-and-until)
|
||||
* [**Git log limit**](#git-log-limit)
|
||||
* [**Git log options**](#git-log-options)
|
||||
* [**Git pathspec**](#git-pathspec)
|
||||
* [**Git merge view strategy**](#git-merge-view-strategy)
|
||||
* [**Color themes**](#color-themes)
|
||||
@@ -146,6 +147,14 @@ You can set variable `_GIT_LIMIT` for limited output. It will affect the "change
|
||||
export _GIT_LIMIT=20
|
||||
```
|
||||
|
||||
### Git log options
|
||||
|
||||
You can set _GIT_LOG_OPTIONS for [git log options](https://git-scm.com/docs/git-log#_options):
|
||||
|
||||
```bash
|
||||
export _GIT_LOG_OPTIONS="--ignore-all-space --ignore-blank-lines"
|
||||
```
|
||||
|
||||
### Git pathspec
|
||||
|
||||
You can exclude a directory from the stats by using [pathspec](https://git-scm.com/docs/gitglossary#gitglossary-aiddefpathspecapathspec)
|
||||
@@ -169,6 +178,14 @@ export _GIT_MERGE_VIEW="enable"
|
||||
export _GIT_MERGE_VIEW="exclusive"
|
||||
```
|
||||
|
||||
### Git branch
|
||||
|
||||
You can set the variable `_GIT_BRANCH` to set the branch of the stats. Works with commands `--git-stats-by-branch`.
|
||||
|
||||
```bash
|
||||
export _GIT_BRANCH="master"
|
||||
```
|
||||
|
||||
### Color themes
|
||||
|
||||
You can change to the legacy color scheme by toggling the variable `_MENU_THEME` between `default` and `legacy`
|
||||
@@ -181,6 +198,14 @@ export _MENU_THEME=legacy
|
||||
|
||||
## Installation
|
||||
|
||||
### Debian and Ubuntu
|
||||
|
||||
If you are on at least Debian Bullseye or Ubuntu Focal you can use apt for installation:
|
||||
|
||||
```bash
|
||||
apt install git-quick-stats
|
||||
```
|
||||
|
||||
### UNIX and Linux
|
||||
|
||||
```bash
|
||||
@@ -240,6 +265,11 @@ You can use the Docker image provided:
|
||||
|
||||
*A:* You can run the dos2unix app in cygwin as follows: `/bin/dos2unix.exe /usr/local/bin/git-quick-stats`. This will convert the script from the CR-LF convention that Microsoft uses to the LF convention that UNIX, OS X, and Linux use. You should then should be able to run it as normal.
|
||||
|
||||
*Q:* How they could be used in a project with many git projects and statistics would show a summary of all git projects?
|
||||
|
||||
*A:* If you want to include submodule logs, you can try using the following: `export _GIT_LOG_OPTIONS="-p --submodule=log"`
|
||||
(more info about [git log --submodule](https://git-scm.com/docs/git-log#Documentation/git-log.txt---submoduleltformatgt))
|
||||
|
||||
## Contribution
|
||||
|
||||
Want to contribute? Great! First, read this page.
|
||||
|
||||
172
git-quick-stats
172
git-quick-stats
@@ -14,7 +14,7 @@ _since=${_GIT_SINCE:-}
|
||||
if [[ -n "${_since}" ]]; then
|
||||
_since="--since=$_since"
|
||||
else
|
||||
_since="--since=1970-01-01"
|
||||
_since="--since=2005-04-07"
|
||||
fi
|
||||
|
||||
# End of git log date. Respects all git datetime formats
|
||||
@@ -57,6 +57,14 @@ else
|
||||
_limit=10
|
||||
fi
|
||||
|
||||
# Log options
|
||||
_log_options=${_GIT_LOG_OPTIONS:-}
|
||||
if [[ -n "${_log_options}" ]]; then
|
||||
_log_options=$_log_options
|
||||
else
|
||||
_log_options=""
|
||||
fi
|
||||
|
||||
# Default menu theme
|
||||
# Set the legacy theme by typing "export _MENU_THEME=legacy"
|
||||
_theme="${_MENU_THEME:=default}"
|
||||
@@ -66,14 +74,14 @@ _theme="${_MENU_THEME:=default}"
|
||||
# ARGS: None
|
||||
# OUTS: None
|
||||
################################################################################
|
||||
function checkUtils() {
|
||||
local -r msg="not found. Please make sure this is installed and in PATH."
|
||||
declare -ar utils=("awk" "basename" "cat" "column" "echo" "git" "grep" "head"
|
||||
"seq" "sort" "tput" "tr" "uniq" "wc")
|
||||
checkUtils() {
|
||||
readonly MSG="not found. Please make sure this is installed and in PATH."
|
||||
readonly UTILS="awk basename cat column echo git grep head seq sort tput \
|
||||
tr uniq wc"
|
||||
|
||||
for u in "${utils[@]}"
|
||||
for u in $UTILS
|
||||
do
|
||||
command -v "$u" >/dev/null 2>&1 || { echo >&2 "$u ${msg}"; exit 1; }
|
||||
command -v "$u" >/dev/null 2>&1 || { echo >&2 "$u ${MSG}"; exit 1; }
|
||||
done
|
||||
}
|
||||
|
||||
@@ -82,16 +90,16 @@ function checkUtils() {
|
||||
# ARGS: None
|
||||
# OUTS: None
|
||||
################################################################################
|
||||
function usage() {
|
||||
local -r program=$(basename "$0")
|
||||
usage() {
|
||||
readonly PROGRAM=$(basename "$0")
|
||||
|
||||
echo "
|
||||
NAME
|
||||
${program} - Simple and efficient way to access various stats in a git repo
|
||||
${PROGRAM} - Simple and efficient way to access various stats in a git repo
|
||||
|
||||
SYNOPSIS
|
||||
For non-interactive mode: ${program} [OPTIONS]
|
||||
For interactive mode: ${program}
|
||||
For non-interactive mode: ${PROGRAM} [OPTIONS]
|
||||
For interactive mode: ${PROGRAM}
|
||||
|
||||
DESCRIPTION
|
||||
Any git repository contains tons of information about commits, contributors,
|
||||
@@ -141,6 +149,8 @@ ADDITIONAL USAGE
|
||||
ex: export _GIT_SINCE=\"2017-01-20\"
|
||||
You can set _GIT_LIMIT for limited output log
|
||||
ex: export _GIT_LIMIT=20
|
||||
You can set _GIT_LOG_OPTIONS for git log options
|
||||
ex: export _GIT_LOG_OPTIONS=\"--ignore-all-space --ignore-blank-lines\"
|
||||
You can exclude directories or files from the stats by using pathspec
|
||||
ex: export _GIT_PATHSPEC=':!pattern'
|
||||
You can set _GIT_MERGE_VIEW to view merge commits with normal commits
|
||||
@@ -148,7 +158,9 @@ ADDITIONAL USAGE
|
||||
You can also set _GIT_MERGE_VIEW to only show merge commits
|
||||
ex: export _GIT_MERGE_VIEW=exclusive
|
||||
You can set _MENU_THEME to display the legacy color scheme
|
||||
ex: export _MENU_THEME=legacy"
|
||||
ex: export _MENU_THEME=legacy
|
||||
You can set _GIT_BRANCH to set the branch of the stats
|
||||
ex: export _GIT_BRANCH=master"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -156,55 +168,55 @@ ADDITIONAL USAGE
|
||||
# ARGS: None
|
||||
# OUTS: $opt: Option selected by the user based on menu choice
|
||||
################################################################################
|
||||
function showMenu() {
|
||||
local -r normal=$(tput sgr0)
|
||||
local -r cyan=$(tput setaf 6)
|
||||
local -r bold=$(tput bold)
|
||||
local -r red=$(tput setaf 1)
|
||||
local -r yellow=$(tput setaf 3)
|
||||
local -r white=$(tput setaf 7)
|
||||
local titles=""
|
||||
local text=""
|
||||
local nums=""
|
||||
local help_txt=""
|
||||
local exit_txt=""
|
||||
showMenu() {
|
||||
NORMAL=$(tput sgr0)
|
||||
CYAN=$(tput setaf 6)
|
||||
BOLD=$(tput bold)
|
||||
RED=$(tput setaf 1)
|
||||
YELLOW=$(tput setaf 3)
|
||||
WHITE=$(tput setaf 7)
|
||||
TITLES=""
|
||||
TEXT=""
|
||||
NUMS=""
|
||||
HELP_TXT=""
|
||||
EXIT_TXT=""
|
||||
|
||||
# Adjustable color menu option
|
||||
if [[ "${_theme}" == "legacy" ]]; then
|
||||
titles="${bold}${red}" && readonly titles
|
||||
text="${normal}${cyan}" && readonly text
|
||||
nums="${bold}${yellow}" && readonly nums
|
||||
help_txt="${normal}${yellow}" && readonly help_txt
|
||||
exit_txt="${bold}${red}" && readonly exit_txt
|
||||
TITLES="${BOLD}${RED}"
|
||||
TEXT="${NORMAL}${CYAN}"
|
||||
NUMS="${BOLD}${YELLOW}"
|
||||
HELP_TXT="${NORMAL}${YELLOW}"
|
||||
EXIT_TXT="${BOLD}${RED}"
|
||||
else
|
||||
titles="${bold}${cyan}" && readonly titles
|
||||
text="${normal}${white}" && readonly text
|
||||
nums="${normal}${bold}${white}" && readonly nums
|
||||
help_txt="${normal}${cyan}" && readonly help_txt
|
||||
exit_txt="${bold}${cyan}" && readonly exit_txt
|
||||
TITLES="${BOLD}${CYAN}"
|
||||
TEXT="${NORMAL}${WHITE}"
|
||||
NUMS="${NORMAL}${BOLD}${WHITE}"
|
||||
HELP_TXT="${NORMAL}${CYAN}"
|
||||
EXIT_TXT="${BOLD}${CYAN}"
|
||||
fi
|
||||
|
||||
echo -e "\n${titles} Generate:${normal}"
|
||||
echo -e "${nums} 1)${text} Contribution stats (by author)"
|
||||
echo -e "${nums} 2)${text} Contribution stats (by author) on a specific branch"
|
||||
echo -e "${nums} 3)${text} Git changelogs (last $_limit days)"
|
||||
echo -e "${nums} 4)${text} Git changelogs by author"
|
||||
echo -e "${nums} 5)${text} My daily status"
|
||||
echo -e "${nums} 6)${text} Save git log output in JSON format"
|
||||
echo -e "\n${titles} List:"
|
||||
echo -e "${nums} 7)${text} Branch tree view (last $_limit)"
|
||||
echo -e "${nums} 8)${text} All branches (sorted by most recent commit)"
|
||||
echo -e "${nums} 9)${text} All contributors (sorted by name)"
|
||||
echo -e "${nums} 10)${text} Git commits per author"
|
||||
echo -e "${nums} 11)${text} Git commits per date"
|
||||
echo -e "${nums} 12)${text} Git commits per month"
|
||||
echo -e "${nums} 13)${text} Git commits per weekday"
|
||||
echo -e "${nums} 14)${text} Git commits per hour"
|
||||
echo -e "${nums} 15)${text} Git commits by author per hour"
|
||||
echo -e "\n${titles} Suggest:"
|
||||
echo -e "${nums} 16)${text} Code reviewers (based on git history)"
|
||||
echo -e "\n${help_txt}Please enter a menu option or ${exit_txt}press Enter to exit."
|
||||
echo -n "${text}> ${normal}"
|
||||
printf %b "\\n${TITLES} Generate:${NORMAL}\\n"
|
||||
printf %b "${NUMS} 1)${TEXT} Contribution stats (by author)\\n"
|
||||
printf %b "${NUMS} 2)${TEXT} Contribution stats (by author) on a specific branch\\n"
|
||||
printf %b "${NUMS} 3)${TEXT} Git changelogs (last $_limit days)\\n"
|
||||
printf %b "${NUMS} 4)${TEXT} Git changelogs by author\\n"
|
||||
printf %b "${NUMS} 5)${TEXT} My daily status\\n"
|
||||
printf %b "${NUMS} 6)${TEXT} Save git log output in JSON format\\n"
|
||||
printf %b "\\n${TITLES} List:\\n"
|
||||
printf %b "${NUMS} 7)${TEXT} Branch tree view (last $_limit)\\n"
|
||||
printf %b "${NUMS} 8)${TEXT} All branches (sorted by most recent commit)\\n"
|
||||
printf %b "${NUMS} 9)${TEXT} All contributors (sorted by name)\\n"
|
||||
printf %b "${NUMS} 10)${TEXT} Git commits per author\\n"
|
||||
printf %b "${NUMS} 11)${TEXT} Git commits per date\\n"
|
||||
printf %b "${NUMS} 12)${TEXT} Git commits per month\\n"
|
||||
printf %b "${NUMS} 13)${TEXT} Git commits per weekday\\n"
|
||||
printf %b "${NUMS} 14)${TEXT} Git commits per hour\\n"
|
||||
printf %b "${NUMS} 15)${TEXT} Git commits by author per hour\\n"
|
||||
printf %b "\\n${TITLES} Suggest:\\n"
|
||||
printf %b "${NUMS} 16)${TEXT} Code reviewers (based on git history)\\n"
|
||||
printf %b "\\n${HELP_TXT}Please enter a menu option or ${EXIT_TXT}press Enter to exit.\\n"
|
||||
printf %b "${TEXT}> ${NORMAL}"
|
||||
read -r opt
|
||||
}
|
||||
|
||||
@@ -214,12 +226,9 @@ function showMenu() {
|
||||
# OUTS: None
|
||||
################################################################################
|
||||
function optionPicked() {
|
||||
local -r bold=$(tput bold)
|
||||
local -r red=$(tput setaf 1)
|
||||
local -r reset=$(tput sgr0)
|
||||
local msg=${*:-"${reset}Error: No message passed"}
|
||||
local msg=${*:-"Error: No message passed"}
|
||||
|
||||
echo -e "${bold}${red}${msg}${reset}\n"
|
||||
echo -e "${msg}\n"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -257,7 +266,7 @@ function detailedGitStats() {
|
||||
|
||||
git -c log.showSignature=false log ${_branch} --use-mailmap $_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 '
|
||||
"$_since" "$_until" $_log_options $_pathspec | LC_ALL=C awk '
|
||||
function printStats(author) {
|
||||
printf "\t%s:\n", author
|
||||
|
||||
@@ -338,7 +347,7 @@ function detailedGitStats() {
|
||||
function suggestReviewers() {
|
||||
optionPicked "Suggested code reviewers (based on git history):"
|
||||
git -c log.showSignature=false log --use-mailmap $_merges "$_since" "$_until" \
|
||||
--pretty=%aN $_pathspec | head -n 100 | sort | uniq -c | sort -nr | LC_ALL=C awk '
|
||||
--pretty=%aN $_log_options $_pathspec | head -n 100 | sort | uniq -c | sort -nr | LC_ALL=C awk '
|
||||
{ args[NR] = $0; }
|
||||
END {
|
||||
for (i = 1; i <= NR; ++i) {
|
||||
@@ -354,7 +363,7 @@ function suggestReviewers() {
|
||||
################################################################################
|
||||
function jsonOutput() {
|
||||
optionPicked "Output log saved to file at: ${json_path}/output.json"
|
||||
git -c log.showSignature=false log --use-mailmap $_merges "$_since" "$_until" \
|
||||
git -c log.showSignature=false log --use-mailmap $_merges "$_since" "$_until" $_log_options \
|
||||
--pretty=format:'{%n "commit": "%H",%n "abbreviated_commit": "%h",%n "tree": "%T",%n "abbreviated_tree": "%t",%n "parent": "%P",%n "abbreviated_parent": "%p",%n "refs": "%D",%n "encoding": "%e",%n "subject": "%s",%n "sanitized_subject_line": "%f",%n "body": "%b",%n "commit_notes": "%N",%n "author": {%n "name": "%aN",%n "email": "%aE",%n "date": "%aD"%n },%n "commiter": {%n "name": "%cN",%n "email": "%cE",%n "date": "%cD"%n }%n},' \
|
||||
| sed "$ s/,$//" \
|
||||
| sed ':a;N;$!ba;s/\r\n\([^{]\)/\\n\1/g' \
|
||||
@@ -370,11 +379,13 @@ function jsonOutput() {
|
||||
function commitsByMonth() {
|
||||
optionPicked "Git commits by month:"
|
||||
echo -e "\tmonth\tsum"
|
||||
local startYear=$(echo "$_since" | grep -Eo "[0-9]{4}")
|
||||
local endYear=$(echo "$_until" | grep -Eo "[0-9]{4}")
|
||||
for i in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
|
||||
do
|
||||
echo -en "\t$i\t"
|
||||
git -c log.showSignature=false shortlog -n $_merges --format='%ad %s' \
|
||||
"$_since" "$_until" | grep " $i " | wc -l
|
||||
"$_since" "$_until" $_log_options | grep -E "($startYear|$endYear)" | grep " $i " | wc -l
|
||||
done | awk '{
|
||||
count[$1] = $2
|
||||
total += $2
|
||||
@@ -401,12 +412,14 @@ function commitsByMonth() {
|
||||
function commitsByWeekday() {
|
||||
optionPicked "Git commits by weekday:"
|
||||
echo -e "\tday\tsum"
|
||||
local startYear=$(echo "$_since" | grep -Eo "[0-9]{4}")
|
||||
local endYear=$(echo "$_until" | grep -Eo "[0-9]{4}")
|
||||
local counter=1
|
||||
for i in Mon Tue Wed Thu Fri Sat Sun
|
||||
do
|
||||
echo -en "\t$counter\t$i\t"
|
||||
git -c log.showSignature=false shortlog -n $_merges --format='%ad %s' \
|
||||
"$_since" "$_until" | grep "$i " | wc -l
|
||||
"$_since" "$_until" $_log_options | grep -E "($startYear|$endYear)" | grep "$i " | wc -l
|
||||
counter=$((counter+1))
|
||||
done | awk '{
|
||||
}
|
||||
@@ -446,11 +459,14 @@ function commitsByHour() {
|
||||
_author="--author=${author}"
|
||||
fi
|
||||
echo -e "\thour\tsum"
|
||||
|
||||
local startYear=$(echo "$_since" | grep -Eo "[0-9]{4}")
|
||||
local endYear=$(echo "$_until" | grep -Eo "[0-9]{4}")
|
||||
for i in $(seq -w 0 23)
|
||||
do
|
||||
echo -ne "\t$i\t"
|
||||
git -c log.showSignature=false shortlog -n $_merges --format='%ad %s' \
|
||||
"${_author}" "$_since" "$_until" | grep ' '$i: | wc -l
|
||||
"${_author}" "$_since" "$_until" $_log_options | grep -E "($startYear|$endYear)" | grep ' '$i: | wc -l
|
||||
done | awk '{
|
||||
count[$1] = $2
|
||||
total += $2
|
||||
@@ -478,7 +494,7 @@ function commitsByHour() {
|
||||
function commitsPerDay() {
|
||||
optionPicked "Git commits per date:";
|
||||
git -c log.showSignature=false log --use-mailmap $_merges "$_since" "$_until" \
|
||||
--date=short --format='%ad' $_pathspec | sort | uniq -c
|
||||
--date=short --format='%ad' $_log_options $_pathspec | sort | uniq -c
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -490,9 +506,9 @@ function commitsPerDay() {
|
||||
function commitsPerAuthor() {
|
||||
optionPicked "Git commits per author:"
|
||||
local authorCommits=$(git -c log.showSignature=false log --use-mailmap $_merges \
|
||||
"$_since" "$_until" | grep -i Author: | cut -c9-)
|
||||
"$_since" "$_until" $_log_options | grep -i Author: | cut -c9-)
|
||||
local coAuthorCommits=$(git -c log.showSignature=false log --use-mailmap $_merges \
|
||||
"$_since" "$_until" | grep -i Co-Authored-by: | cut -c21-)
|
||||
"$_since" "$_until" $_log_options | grep -i Co-Authored-by: | cut -c21-)
|
||||
|
||||
if [[ -z "${coAuthorCommits}" ]]
|
||||
then
|
||||
@@ -508,9 +524,9 @@ function commitsPerAuthor() {
|
||||
sum[author[i]]++; name[author[i]] = author[i]; total++;
|
||||
}
|
||||
for(i in sum) {
|
||||
printf "\t%d,%s,%2.1f%%\n", sum[i], name[i], (100 * sum[i] / total)
|
||||
printf "\t%d:%s:%2.1f%%\n", sum[i], name[i], (100 * sum[i] / total)
|
||||
}
|
||||
}' | sort -n -r | column -t -s,
|
||||
}' | sort -n -r | column -t -s:
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -531,8 +547,8 @@ function myDailyStats() {
|
||||
echo -e "\t" $(git -c log.showSignature=false log --use-mailmap \
|
||||
--author="$(git config user.name)" $_merges \
|
||||
--since=$(date "+%Y-%m-%dT00:00:00") \
|
||||
--until=$(date "+%Y-%m-%dT23:59:59") --reverse \
|
||||
| grep commit | wc -l) "commits"
|
||||
--until=$(date "+%Y-%m-%dT23:59:59") --reverse $_log_options \
|
||||
| grep -E "commit [a-f0-9]{40}" | wc -l) "commits"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -543,7 +559,7 @@ function myDailyStats() {
|
||||
function contributors() {
|
||||
optionPicked "All contributors (sorted by name):"
|
||||
git -c log.showSignature=false log --use-mailmap $_merges "$_since" "$_until" \
|
||||
--format='%aN' $_pathspec | sort -u | cat -n
|
||||
--format='%aN' $_log_options $_pathspec | sort -u | cat -n
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -556,7 +572,7 @@ function branchTree() {
|
||||
git -c log.showSignature=false log --use-mailmap --graph --abbrev-commit \
|
||||
"$_since" "$_until" --decorate \
|
||||
--format=format:'--+ Commit: %h %n | Date: %aD (%ar) %n'' | Message: %s %d %n'' + Author: %aN %n' \
|
||||
--all | head -n $((_limit*5))
|
||||
--all $_log_options | head -n $((_limit*5))
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -592,7 +608,7 @@ function changelogs() {
|
||||
--use-mailmap \
|
||||
$_merges \
|
||||
--format="%cd" \
|
||||
--date=short "${_author}" "$_since" "$_until" $_pathspec \
|
||||
--date=short "${_author}" "$_since" "$_until" $_log_options $_pathspec \
|
||||
| sort -u -r | head -n $_limit \
|
||||
| while read DATE; do
|
||||
echo -e "\n[$DATE]"
|
||||
@@ -619,7 +635,7 @@ if [[ "$#" -eq 1 ]]; then
|
||||
-r|--suggest-reviewers) suggestReviewers;;
|
||||
-T|--detailed-git-stats) detailedGitStats;;
|
||||
-R|--git-stats-by-branch)
|
||||
branch=""
|
||||
branch="${_GIT_BRANCH:-}"
|
||||
while [[ -z "${branch}" ]]; do
|
||||
read -r -p "Which branch? " branch
|
||||
done
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
.TH git-quick-stats "1" "January 2020" "git-quick-stats" "User Commands"
|
||||
.SH NAME
|
||||
.B git\-quick\-stats
|
||||
.B git\-quick\-stats
|
||||
\- Simple and efficient way to access various stats in a git repository.
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
For non\-interactive mode:
|
||||
For non\-interactive mode:
|
||||
.B git\-quick\-stats [OPTIONS]
|
||||
.PP
|
||||
For interactive mode:
|
||||
For interactive mode:
|
||||
.B git-quick-stats
|
||||
.PP
|
||||
.SH DESCRIPTION
|
||||
@@ -112,6 +112,10 @@ You can set _GIT_LIMIT for limited output log, example:
|
||||
.PP
|
||||
.B export _GIT_LIMIT=20
|
||||
.PP
|
||||
You can set _GIT_LOG_OPTIONS for git log options, example:
|
||||
.PP
|
||||
.B export _GIT_LOG_OPTIONS="--ignore-all-space --ignore-blank-lines"
|
||||
.PP
|
||||
You can exclude directories or files from the stats by using pathspec, example:
|
||||
.PP
|
||||
.B export _GIT_PATHSPEC=':!pattern'
|
||||
@@ -127,6 +131,10 @@ You can also set _GIT_MERGE_VIEW to only show merge commits, example:
|
||||
You can switch to the legacy color scheme, example:
|
||||
.PP
|
||||
.B export _MENU_THEME=legacy
|
||||
.PP
|
||||
You can set _GIT_BRANCH to set the branch of the stats, example:
|
||||
.PP
|
||||
.B export _GIT_BRANCH="master"
|
||||
.
|
||||
.fi
|
||||
|
||||
|
||||
@@ -17,12 +17,16 @@
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
set -o nounset
|
||||
|
||||
export DISCOVERONLY=${DISCOVERONLY:-}
|
||||
export DEBUG=${DEBUG:-}
|
||||
export STOP=${STOP:-}
|
||||
export INVARIANT=${INVARIANT:-}
|
||||
export CONTINUE=${CONTINUE:-}
|
||||
|
||||
GREP=${GREP:-grep}
|
||||
|
||||
args="$(getopt -n "$0" -l \
|
||||
verbose,help,stop,discover,invariant,continue vhxdic $*)" \
|
||||
|| exit -1
|
||||
@@ -132,12 +136,12 @@ assert_raises() {
|
||||
_assert_with_grep() {
|
||||
local grep_modifier="$1"
|
||||
local output="$($2)"
|
||||
local exitcode="$4" || 0
|
||||
local exitcode=0
|
||||
shift 2
|
||||
|
||||
while [ $# != 0 ]; do
|
||||
assert_raises "echo '$output' | $GREP $grep_modifier '$1'" $exitcode || return 1
|
||||
shift
|
||||
assert_raises "echo '$output' | $GREP $grep_modifier '$1'" $exitcode || return 1
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
@@ -3,16 +3,85 @@
|
||||
. tests/assert.sh -v
|
||||
|
||||
src="./git-quick-stats"
|
||||
assert "$src fail" "Invalid argument\n\nNAME\n git-quick-stats - Simple and efficient way to access various stats in a git repo\n\nSYNOPSIS\n For non-interactive mode: git-quick-stats [OPTIONS]\n For interactive mode: git-quick-stats\n\nDESCRIPTION\n Any git repository contains tons of information about commits, contributors,\n and files. Extracting this information is not always trivial, mostly because\n of a gadzillion options to a gadzillion git commands.\n\n This program allows you to see detailed information about a git repository.\n\nOPTIONS\n -r, --suggest-reviewers\n show the best people to contact to review code\n -T, --detailed-git-stats\n give a detailed list of git stats\n -R, --git-stats-by-branch\n see detailed list of git stats by branch\n -d, --commits-per-day\n displays a list of commits per day\n -m, --commits-by-month\n displays a list of commits per month\n -w, --commits-by-weekday\n displays a list of commits per weekday\n -o, --commits-by-hour\n displays a list of commits per hour\n -A, --commits-by-author-by-hour\n displays a list of commits per hour by author\n -a, --commits-per-author\n displays a list of commits per author\n -S, --my-daily-stats\n see your current daily stats\n -C, --contributors\n see a list of everyone who contributed to the repo\n -b, --branch-tree\n show an ASCII graph of the git repo branch history\n -D, --branches-by-date\n show branches by date\n -c, --changelogs\n see changelogs\n -L, --changelogs-by-author\n see changelogs by author\n -j, --json-output\n save git log as a JSON formatted file to a specified area\n -h, -?, --help\n display this help text in the terminal\n\nADDITIONAL USAGE\n You can set _GIT_SINCE and _GIT_UNTIL to limit the git time log\n ex: export _GIT_SINCE=\"2017-01-20\"\n You can set _GIT_LIMIT for limited output log\n ex: export _GIT_LIMIT=20\n You can exclude directories or files from the stats by using pathspec\n ex: export _GIT_PATHSPEC=':!pattern'\n You can set _GIT_MERGE_VIEW to view merge commits with normal commits\n ex: export _GIT_MERGE_VIEW=enable\n You can also set _GIT_MERGE_VIEW to only show merge commits\n ex: export _GIT_MERGE_VIEW=exclusive\n You can set _MENU_THEME to display the legacy color scheme\n ex: export _MENU_THEME=legacy"
|
||||
assert "$src fail" "Invalid argument
|
||||
|
||||
NAME
|
||||
git-quick-stats - Simple and efficient way to access various stats in a git repo
|
||||
|
||||
SYNOPSIS
|
||||
For non-interactive mode: git-quick-stats [OPTIONS]
|
||||
For interactive mode: git-quick-stats
|
||||
|
||||
DESCRIPTION
|
||||
Any git repository contains tons of information about commits, contributors,
|
||||
and files. Extracting this information is not always trivial, mostly because
|
||||
of a gadzillion options to a gadzillion git commands.
|
||||
|
||||
This program allows you to see detailed information about a git repository.
|
||||
|
||||
OPTIONS
|
||||
-r, --suggest-reviewers
|
||||
show the best people to contact to review code
|
||||
-T, --detailed-git-stats
|
||||
give a detailed list of git stats
|
||||
-R, --git-stats-by-branch
|
||||
see detailed list of git stats by branch
|
||||
-d, --commits-per-day
|
||||
displays a list of commits per day
|
||||
-m, --commits-by-month
|
||||
displays a list of commits per month
|
||||
-w, --commits-by-weekday
|
||||
displays a list of commits per weekday
|
||||
-o, --commits-by-hour
|
||||
displays a list of commits per hour
|
||||
-A, --commits-by-author-by-hour
|
||||
displays a list of commits per hour by author
|
||||
-a, --commits-per-author
|
||||
displays a list of commits per author
|
||||
-S, --my-daily-stats
|
||||
see your current daily stats
|
||||
-C, --contributors
|
||||
see a list of everyone who contributed to the repo
|
||||
-b, --branch-tree
|
||||
show an ASCII graph of the git repo branch history
|
||||
-D, --branches-by-date
|
||||
show branches by date
|
||||
-c, --changelogs
|
||||
see changelogs
|
||||
-L, --changelogs-by-author
|
||||
see changelogs by author
|
||||
-j, --json-output
|
||||
save git log as a JSON formatted file to a specified area
|
||||
-h, -?, --help
|
||||
display this help text in the terminal
|
||||
|
||||
ADDITIONAL USAGE
|
||||
You can set _GIT_SINCE and _GIT_UNTIL to limit the git time log
|
||||
ex: export _GIT_SINCE=\"2017-01-20\"
|
||||
You can set _GIT_LIMIT for limited output log
|
||||
ex: export _GIT_LIMIT=20
|
||||
You can set _GIT_LOG_OPTIONS for git log options
|
||||
ex: export _GIT_LOG_OPTIONS=\"--ignore-all-space --ignore-blank-lines\"
|
||||
You can exclude directories or files from the stats by using pathspec
|
||||
ex: export _GIT_PATHSPEC=':!pattern'
|
||||
You can set _GIT_MERGE_VIEW to view merge commits with normal commits
|
||||
ex: export _GIT_MERGE_VIEW=enable
|
||||
You can also set _GIT_MERGE_VIEW to only show merge commits
|
||||
ex: export _GIT_MERGE_VIEW=exclusive
|
||||
You can set _MENU_THEME to display the legacy color scheme
|
||||
ex: export _MENU_THEME=legacy
|
||||
You can set _GIT_BRANCH to set the branch of the stats
|
||||
ex: export _GIT_BRANCH=master"
|
||||
|
||||
assert_raises "$src fail" 1
|
||||
|
||||
assert_contains "$src --suggest-reviewers" "Suggested code reviewers (based on git history)" 127
|
||||
assert_contains "$src --suggest-reviewers" "Suggested code reviewers (based on git history)"
|
||||
assert_raises "$src --suggest-reviewers" 0
|
||||
|
||||
assert_contains "$src --detailed-git-stats" "Contribution stats" 127
|
||||
assert_contains "$src --detailed-git-stats" "Contribution stats"
|
||||
assert_raises "$src --detailed-git-stats" 0
|
||||
|
||||
assert_contains "$src --commits-per-day" "Git commits per date" 127
|
||||
assert_contains "$src --commits-per-day" "Git commits per date"
|
||||
assert_raises "$src --commits-per-day" 0
|
||||
|
||||
assert_end
|
||||
|
||||
Reference in New Issue
Block a user