Compare commits

...

56 Commits
1.0.6 ... 2.0.3

Author SHA1 Message Date
Lukáš Mešťan
6579c31047 Merge pull request #59 from tomice/master
Added internal documentation and minor cleanup
2019-02-02 19:47:58 +01:00
Tom Ice
e82339b777 Added internal documentation and minor cleanup
* All internal functions now have documentation describing what they are,
  what arguments they take, and what external variables are set in an effort
  to help others understand the codebase more quickly

* Changed a few lines where grep | wc -l occurred, as grep has a built-in
  option to do this: grep -c

* Removed a $* where the suggestReviewers function expected a string but
  never received one during the life of the program

* Adjusted some lines so they weren't quite as long, adjusted some variable
  names, and other minor cleanup
2019-02-01 13:51:21 -05:00
Lukáš Mešťan
f3f0ab4730 Update LICENSE 2019-01-19 13:37:04 +01:00
Lukáš Mešťan
258b52eda8 Merge pull request #58 from tomice/master
Fixed issue where signatures were parsed in logs
2019-01-17 14:43:49 +01:00
Tom Ice
187c03ae98 Fixed issue where signatures were parsed in logs
* When someone has the showSignature=true flag set in their .gitconfig
  file, gpg verifying signature related text would be parsed as if it
  was actual log information. This change ignores signature-related text
  by passing the -c log.showSignature=false option to git so it ignores
  a user's custom .gitconfig showSignature flag regardless as to what it
  is set to.

Resolves: Issue #52
2019-01-16 18:10:59 -05:00
Lukáš Mešťan
5e00e35a30 Merge pull request #57 from arzzen/feature/issue-50
add man page, refs #50
2019-01-16 19:08:40 +01:00
Lukas Mestan
c107529335 add man page 2019-01-16 19:06:53 +01:00
Lukáš Mešťan
255f1a6976 Merge pull request #56 from tomice/master
Changed non-interactive args and fixed main loop
2019-01-16 07:32:14 +01:00
Tom Ice
2cc5cae1a8 Changed non-interactive args and fixed main loop
* The previous commands were Lower CamelCase style and had no equivalent
  short options. If you wanted to see the branch tree via non-interactive
  mode, you always needed to supply "branchTree" as the passing argument to
  the git-quick-stats script.

  This commit changes the argument style to be more akin to the POSIX and GNU
  styles of arguments commonly seen in many other applications. As of this
  commit, there is no compatibility with legacy commands, so those who have
  been using the old commands will unfortunately need to get familiar with the
  new ones. All documentation and tests have been updated accordingly to
  reflect the new changes.

* The main interactive loop contained a non-variable constant that was only
  getting parsed correctly due to legacy fallback behavior. This commit fixes
  the main loop and cleans up the formatting a little bit.

* Added -r to more areas where read reads in a variable to help prevent
  it from mangling backslashes.

* Changed everything to use bash's built-in [[ notation and did some minor
  formatting changes to reduce the LOC.

* Removed some unnecessary echo statements and did some other minor cleanup.
2019-01-10 20:47:40 -05:00
Lukáš Mešťan
4f95691967 Merge pull request #55 from tomice/master
Fix bug related to author name in hourly stats
2019-01-06 17:30:54 +01:00
Tom Ice
36405591ec Fix bug related to author name in hourly stats
* Fixing a bug where, if you insert an author's name that has a space in the
  "Git commits by author per hour" option, it fails due to improper variable
  expansion. Note that the current implementation is a "greedy" one in that
  it will attempt to look for any instance of the user provided string in the
  author field
2019-01-01 14:37:11 -05:00
Lukáš Mešťan
4e3f4ba826 Merge pull request #54 from tomice/master
Fix divide by zero error and add utility checker
2018-12-27 14:21:44 +01:00
Tom Ice
83e96f8b80 Fix divide by zero error and add utility checker
* In some situations, the awk statements in the functions commitsByMonth,
  commitsByDay, and commitsByHour attempt to divide by zero and display
  an error to the user. To invoke this bug, checkout any of the previous
  commits and attempt to see commits by hour from some user who has never
  committed to this repository.

  This commit fixes this bug by making sure the awk statement only ever
  executes when the total commits is greater than zero.

* Added a utility checker to make sure that the user has all of the necessary
  tools in their path in order to run this script. If they do not exist, it
  exits and informs the user that this script cannot locate them in PATH.

* Adjusted shell logic to prevent double negatives from confusing developers
  as ! -z is technically read as something akin to "not has no value"

* Changed some statements to utilize safer and more predictable bash-isms

* Minor white space fixes and adjusted the README.md slightly
2018-12-21 14:50:13 -05:00
Lukáš Mešťan
206ebd8a76 Merge pull request #53 from tomice/master
Improve color compatibility and other minor fixes
2018-12-21 19:35:55 +01:00
Tom Ice
2274ca1284 Improve color compatibility and other minor fixes
* Color was originally done with ANSI escape characters for defining
  different "expected" colors. However, this is not uniform across all
  terminals. To improve what the designers of this program expect
  colors to be, escape codes were replaced with tput equivalents.
  For more information, see the GNU manual here:

  https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html

* Limited scope of variables to their local scope instead of having them
  be global

* Renamed menu variables to aid in readability and adjusted formatting
  slightly to be more uniform

* Fixed a bug where option_picked was assigning an array to a string
  and relying on the default behavior of the shell to interpret it

* Added the -r option to "read" for safety, as read without -r will
  interpret backslashes before spaces/line feeds, which tends to
  be an unintended side effect

* Updated all backtick notation to the newer POSIX $(..) notation for
  aid in readability when paired next to single quotes and improved
  safety

* Updated the README.md to include missing utilities and fixed some
  minor formatting issues
2018-12-21 12:05:53 -05:00
Lukáš Mešťan
37f15f6381 Update index.html 2018-12-07 15:43:23 +01:00
Lukáš Mešťan
337ead38e3 Update index.html 2018-12-07 15:42:16 +01:00
Lukáš Mešťan
c38e4eb7b6 Merge pull request #49 from motiprajapati/respect-mailmap-author-email
Respect mailmap author email
2018-11-30 09:19:50 +01:00
motiprajapati
b767822eb3 Respect mailmap author email
While using this tool feature "Contribution stats (by author)", I observed that script was not respecting author email as option was being used here was "%ae". Corrected it to "%aE", output looks good now.
2018-11-30 13:26:17 +05:30
Lukáš Mešťan
08520bf068 Merge pull request #48 from danieltaub96/master
fixed  Git changelogs wont work
2018-11-05 21:40:36 +01:00
Daniel
374527dbe1 changelogs printed with days limit 2018-11-05 20:45:01 +02:00
Daniel
dba2d87206 fixed git changelogs without author wont work 2018-11-05 20:40:13 +02:00
Lukáš Mešťan
8bfc58710a Merge pull request #47 from mixn/master
Fixes minor typos
2018-09-28 11:46:59 +02:00
mixn
6f931ac9b5 Fixes minor typos 2018-09-27 13:56:19 +02:00
Lukáš Mešťan
42a657b0de Merge pull request #45 from thangdc94/thangdc94-patch-1
fix: author not show fullname in contribution stats
2018-09-21 08:55:32 +02:00
Lukáš Mešťan
a48347e0df Merge pull request #46 from mathstuf/fix-install-to-empty-prefix
Makefile: fix installing to an empty prefix
2018-09-21 08:52:09 +02:00
Ben Boeckel
f4930f152d Makefile: fix installing to an empty prefix
If `$(PREFIX)` was an empty directory, `$(PREFIX)/bin` would end up
being the executable instead of a directory. Create the `bin` directory
first.
2018-09-20 13:34:18 -04:00
Phạm Ngọc Thắng
e5727cf4e9 fix: author not show fullname 2018-09-19 10:17:16 +07:00
Lukáš Mešťan
6b54e9d8df Merge pull request #44 from dkalowsk/fix_makefile
Makefile: set PREFIX to conditional assignment
2018-08-23 09:32:17 +02:00
Dan Kalowsky
7f70c8b728 Makefile: set PREFIX to conditional assignment
When the variable PREFIX is provided on the command line, do not
override the value.

Signed-off-by: Dan Kalowsky <dank@deadmime.org>
2018-08-22 14:37:11 -07:00
Lukáš Mešťan
dc86f8b6ae Merge pull request #43 from afarah1/master
Fix ambiguous argument when author is not specified for commits by hour
2018-07-26 10:56:39 +02:00
Alef Farah
36967bc6f4 Fix ambiguous argument when author is not specified 2018-07-25 18:38:37 -03:00
Lukáš Mešťan
cdfa6bf467 Merge pull request #42 from RobertBeilich/master
Fix error on whitespace in author name
2018-07-17 16:34:43 +02:00
Robert Beilich
a496390884 Fix error on whitespace in author name
Fixes https://github.com/arzzen/git-quick-stats/issues/37
2018-07-17 09:42:39 +02:00
Lukáš Mešťan
e81d3ab9f4 Update README.md 2018-01-22 20:15:45 +01:00
Lukáš Mešťan
b0e62d64c7 Update README.md 2018-01-22 08:25:42 +01:00
Lukáš Mešťan
01b6e17007 Update LICENSE 2018-01-07 12:33:34 +01:00
Lukáš Mešťan
ac730dbfbc Merge pull request #36 from a7r3/master
Makefile: Don't treat newline characters literally
2017-10-20 08:20:50 +02:00
a7r3
37b37bb5c8 Makefile: Don't treat newline characters literally
Signed-off-by: a7r3 <arvindultimate7352@gmail.com>
2017-10-19 22:04:33 +05:30
Lukáš Mešťan
db8009ff6d Update README.md 2017-09-29 13:41:25 +02:00
Lukáš Mešťan
5a275c87b8 Delete CONTRIBUTING.md 2017-09-29 13:40:28 +02:00
Lukáš Mešťan
98c0252e97 Rename CONTRIBUTING.md to contributing.md 2017-09-29 13:40:15 +02:00
Lukáš Mešťan
5a389f5071 Create issue_template.md 2017-09-29 13:38:57 +02:00
Lukáš Mešťan
382f6759cf Create CONTRIBUTING.md 2017-09-29 13:37:36 +02:00
Lukáš Mešťan
6362149953 Update README.md 2017-09-29 13:33:00 +02:00
Lukáš Mešťan
36cae305a4 Update .travis.yml 2017-09-29 13:28:50 +02:00
Lukáš Mešťan
90f6b631a9 update badges 2017-09-11 15:53:31 +02:00
Lukáš Mešťan
6a894d9efe Update README.md 2017-09-11 15:51:12 +02:00
Lukas Mestan
ef6120fa64 add .mailmap 2017-09-05 08:42:41 +02:00
Lukas Mestan
7c6b9b01e4 update makefile 2017-09-04 12:01:34 +02:00
Lukas Mestan
10353cbeff respecting .mailmap, refs #33 2017-09-04 11:23:16 +02:00
Lukáš Mešťan
0f68ba1588 fix define function 2017-07-28 09:42:33 +02:00
Lukáš Mešťan
a985e4decf Merge pull request #32 from arzzen/add-code-of-conduct-1
Create CODE_OF_CONDUCT.md
2017-06-16 08:24:05 +02:00
Lukáš Mešťan
6b33554bea Create CODE_OF_CONDUCT.md 2017-06-16 08:22:00 +02:00
Lukáš Mešťan
a6aed25d4b citations 2017-06-07 10:28:08 +02:00
Lukáš Mešťan
9418613d42 fix #30
update readme
2017-05-08 12:15:08 +02:00
12 changed files with 647 additions and 265 deletions

3
.mailmap Normal file
View File

@@ -0,0 +1,3 @@
Lukas Mestan <lukas.mestan@gmail.com> Lukáš Mešťan <arzzen@users.noreply.github.com>
Lukas Mestan <lukas.mestan@gmail.com> arzzen

View File

@@ -1,2 +1,34 @@
language: bash
language: generic
sudo: required
addons:
apt:
packages:
- libcurl4-openssl-dev
- libelf-dev
- libdw-dev
- cmake
install:
- git checkout ${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}
- git branch --set-upstream-to origin/$TRAVIS_BRANCH
- git rev-parse HEAD
script: make test
after_success: |
wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
tar xzf master.tar.gz &&
cd kcov-master &&
mkdir build &&
cd build &&
cmake .. &&
make &&
sudo make install &&
cd ../.. &&
rm -rf kcov-master &&
mkdir -p coverage &&
kcov coverage git-quick-stats suggestReviewers && bash <(curl -s https://codecov.io/bash) -cF suggestReviewers &&
kcov coverage git-quick-stats detailedGitStats && bash <(curl -s https://codecov.io/bash) -cF detailedGitStats &&
kcov coverage git-quick-stats commitsPerDay && bash <(curl -s https://codecov.io/bash) -cF commitsPerDay

46
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at lukas.mestan@googlemail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017 Lukáš Mešťan
Copyright (c) 2019 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

View File

@@ -1,8 +1,10 @@
prefix=/usr/local
PREFIX ?= /usr/local
TASK_DONE = echo -e "\n✓ $@ done\n"
# files that need mode 755
EXEC_FILES=git-quick-stats
.PHONY: test
all:
@echo "usage: make install"
@echo " make reinstall"
@@ -11,21 +13,31 @@ all:
help:
$(MAKE) all
@$(TASK_DONE)
install:
install -m 0755 $(EXEC_FILES) $(prefix)/bin
git config --global alias.quick-stats '! $(prefix)/bin/$(EXEC_FILES)'
mkdir -p $(PREFIX)/bin
install -m 0755 $(EXEC_FILES) $(PREFIX)/bin/$(EXEC_FILES)
git config --global alias.quick-stats '! $(PREFIX)/bin/$(EXEC_FILES)'
$(MAKE) man
@$(TASK_DONE)
uninstall:
test -d $(prefix)/bin && \
cd $(prefix)/bin && \
test -d $(PREFIX)/bin && \
cd $(PREFIX)/bin && \
rm -f $(EXEC_FILES) && \
git config --global --unset alias.quick-stats
@$(TASK_DONE)
reinstall:
git pull origin master
@curl -s https://raw.githubusercontent.com/arzzen/git-quick-stats/master/git-quick-stats > git-quick-stats
$(MAKE) uninstall && \
$(MAKE) install
@$(TASK_DONE)
man:
install -g 0 -o 0 -m 0644 git-quick-stats.1 /usr/share/man/man1/
test:
tests/commands_test.sh
@$(TASK_DONE)

View File

@@ -1,11 +1,14 @@
## GIT quick statistics
## GIT quick statistics [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](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)
[![Travis](https://api.travis-ci.org/arzzen/git-quick-stats.svg?branch=master)](https://travis-ci.org/arzzen/git-quick-stats)
[![homebrew](https://img.shields.io/homebrew/v/git-quick-stats.svg)]()
[![Homebrew package](https://repology.org/badge/version-for-repo/homebrew/git-quick-stats.svg)](http://braumeister.org/formula/git-quick-stats)
[![Linuxbrew package](https://repology.org/badge/version-for-repo/linuxbrew/git-quick-stats.svg)](https://repology.org/metapackage/git-quick-stats/packages)
> `git quick-stats` is a simple and efficient way to access various statistics in git repository.
> 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 I dont think there is a single person alive who knows them all. Probably not even [Linus Torvalds](https://github.com/torvalds) himself :).
## Table of Contents
[**Screenshots**](#screenshots)
@@ -16,15 +19,18 @@
* [**Windows**](#windows-cygwin)
[**Usage**](#usage)
* [**Git log since/unitl**](#git-log-since-until)
* [**Git log since/until**](#git-log-since-until)
* [**Git log limit**](#git-log-limit)
* [**Git pathspec**](#git-pathspec)
* [**Tests**](#tests)
[**System requirements**](#system-requirements)
* [**Dependences**](#dependences)
[**Contribution**](#contribution)
[**FAQ**](#faq)
[**License**](#licensing)
@@ -53,10 +59,40 @@ Or you can use (non-interactive) direct execution:
`git quick-stats <optional-command-to-execute-directly>`
Possible arguments:
> suggestReviewers, detailedGitStats, commitsByHour, commitsByWeekday, commitsByMonth, commitsPerDay, commitsPerAuthor, myDailyStats, contributors,
branchTree, branchesByDate, changelogs, changelogsByAuthor
Possible arguments in short and long form:
```
-r, --suggest-reviewers
show the best people to contact to review code
-T, --detailed-git-stats
give a detailed list of git stats
-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
-h, -?, --help
display this help text in the terminal
```
#### Git log since / until
@@ -123,18 +159,28 @@ brew install git-quick-stats
## System requirements
* Unix like OS with a proper shell
* Tools we use: git ; awk ; sed ; tr ; echo ; grep ; cut ; sort ; head ; uniq ; column.
* Tools we use: awk ; cat ; column ; echo ; git ; grep ; head ; seq ; sort ; tput ; tr ; uniq ; wc
#### Dependences
* [`bsdmainutils`](https://packages.debian.org/sid/bsdmainutils) `apt install bsdmainutils`
## FAQ
*Q:* I get some errors after run git-quick-stats in cygwin like `/usr/local/bin/git-quick-stats: line 2: $'\r': command not found`
*A:* You can run dos2unix app in cygwin `/bin/dos2unix.exe /usr/local/bin/git-quick-stats`. This will convert it to Unix format and you then should be able to run it.
## Contribution
Want to contribute? Great! First, read this page.
#### Code reviews
All submissions, including submissions by project members, require review.
All submissions, including submissions by project members, require review.</br>
We use Github pull requests for this purpose.
#### Some tips for good pull requests:
* Use our code
* Use our code </br>
When in doubt, try to stay true to the existing code of the project.
* Write a descriptive commit message. What problem are you solving and what
are the consequences? Where and what did you test? Some good tips:
@@ -152,6 +198,8 @@ This documentation is written using standard [markdown syntax](https://help.gith
#### Tests
[![codecov](https://codecov.io/gh/arzzen/git-quick-stats/branch/master/graph/badge.svg)](https://codecov.io/gh/arzzen/git-quick-stats)
```bash
make test
```
@@ -159,7 +207,7 @@ make test
## Licensing
MIT see [LICENSE][] for the full license text.
[read this page]: http://github.com/arzzen/git-quick-stats/blob/master/CONTRIBUTING.md
[read this page]: http://github.com/arzzen/git-quick-stats/blob/master/docs/CONTRIBUTING.md
[landing page]: http://arzzen.github.io/git-quick-stats
[LICENSE]: https://github.com/arzzen/git-quick-stats/blob/master/LICENSE.txt
[LICENSE]: https://github.com/arzzen/git-quick-stats/blob/master/LICENSE

View File

@@ -17,6 +17,7 @@
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<meta http-equiv="refresh" content="0;url=https://lukasmestan.com/git-quick-stats/">
</head>
<body id="page-top">
<header>

9
docs/issue_template.md Normal file
View File

@@ -0,0 +1,9 @@
#### Expected behavior and actual behavior.
#### Steps to reproduce the problem.
#### Specifications like the version of the project, operating system, or hardware.

View File

@@ -1,93 +1,198 @@
#!/usr/bin/env bash
#
# Simple and efficient way to access various statistics in a git repository
################################################################################
# GLOBALS AND SHELL OPTIONS
set -o nounset
set -o errexit
_since=${_GIT_SINCE:-}
if [ ! -z ${_since} ]
then _since="--since=$_since"
fi
[[ -n "${_since}" ]] && _since="--since=$_since"
_until=${_GIT_UNTIL:-}
if [ ! -z ${_until} ]
then _until="--until=$_until"
fi
[[ -n "${_until}" ]] && _until="--until=$_until"
_pathspec=${_GIT_PATHSPEC:-}
if [ ! -z "${_pathspec}" ]
then _pathspec="-- $_pathspec"
fi
[[ -n "${_pathspec}" ]] && _pathspec="-- $_pathspec"
_limit=${_GIT_LIMIT:-}
if [ ! -z ${_limit} ]
if [[ -n "${_limit}" ]];
then _limit=$_limit
else
_limit=10
fi
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"`
################################################################################
# DESC: Checks to make sure the user has the appropriate utilities installed
# ARGS: None
# OUTS: None
################################################################################
function check_utils() {
local msg="not found. Please make sure this is installed and in PATH."
echo -e ""
echo -e "${RED_TEXT} Generate: ${NORMAL}"
echo -e "${MENU} ${NUMBER} 1)${MENU} Contribution stats (by author) ${NORMAL}"
echo -e "${MENU} ${NUMBER} 2)${MENU} Git changelogs (last $_limit)${NORMAL}"
echo -e "${MENU} ${NUMBER} 3)${MENU} Git changelogs by author ${NORMAL}"
echo -e "${MENU} ${NUMBER} 4)${MENU} My daily status ${NORMAL}"
echo -e "${RED_TEXT} List: ${NORMAL}"
echo -e "${MENU} ${NUMBER} 5)${MENU} Branch tree view (last $_limit)${NORMAL}"
echo -e "${MENU} ${NUMBER} 6)${MENU} All branches (sorted by most recent commit) ${NORMAL}"
echo -e "${MENU} ${NUMBER} 7)${MENU} All contributors (sorted by name) ${NORMAL}"
echo -e "${MENU} ${NUMBER} 8)${MENU} Git commits per author ${NORMAL}"
echo -e "${MENU} ${NUMBER} 9)${MENU} Git commits per date ${NORMAL}"
echo -e "${MENU} ${NUMBER} 10)${MENU} Git commits per month ${NORMAL}"
echo -e "${MENU} ${NUMBER} 11)${MENU} Git commits per weekday ${NORMAL}"
echo -e "${MENU} ${NUMBER} 12)${MENU} Git commits per hour ${NORMAL}"
echo -e "${MENU} ${NUMBER} 13)${MENU} Git commits by author per hour ${NORMAL}"
echo -e "${RED_TEXT} Suggest: ${NORMAL}"
echo -e "${MENU} ${NUMBER} 14)${MENU} Code reviewers (based on git history) ${NORMAL}"
echo -e ""
echo -e "${ENTER_LINE}Please enter a menu option or ${RED_TEXT}press enter to exit. ${NORMAL}"
read opt
command -v awk >/dev/null 2>&1 || { echo >&2 "awk ${msg}"; exit 1; }
command -v basename >/dev/null 2>&1 || { echo >&2 "basename ${msg}"; exit 1; }
command -v cat >/dev/null 2>&1 || { echo >&2 "cat ${msg}"; exit 1; }
command -v column >/dev/null 2>&1 || { echo >&2 "column ${msg}"; exit 1; }
command -v echo >/dev/null 2>&1 || { echo >&2 "echo ${msg}"; exit 1; }
command -v git >/dev/null 2>&1 || { echo >&2 "git ${msg}"; exit 1; }
command -v grep >/dev/null 2>&1 || { echo >&2 "grep ${msg}"; exit 1; }
command -v head >/dev/null 2>&1 || { echo >&2 "head ${msg}"; exit 1; }
command -v seq >/dev/null 2>&1 || { echo >&2 "seq ${msg}"; exit 1; }
command -v sort >/dev/null 2>&1 || { echo >&2 "sort ${msg}"; exit 1; }
command -v tput >/dev/null 2>&1 || { echo >&2 "tput ${msg}"; exit 1; }
command -v tr >/dev/null 2>&1 || { echo >&2 "tr ${msg}"; exit 1; }
command -v uniq >/dev/null 2>&1 || { echo >&2 "uniq ${msg}"; exit 1; }
command -v wc >/dev/null 2>&1 || { echo >&2 "wc ${msg}"; exit 1; }
}
################################################################################
# DESC: Help information printed to stdout during non-interactive mode
# ARGS: None
# OUTS: None
################################################################################
function usage() {
local program=$(basename "$0")
echo "
NAME
${program} - Simple and efficient way to access various stats in a git repo
SYNOPSIS
For non-interactive mode: ${program} [OPTIONS]
For interactive mode: ${program}
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
-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
-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-20-01\"
You can set _GIT_LIMIT for limited output log
ex: export _GIT_LIMIT=20
You can exclude a directory from the stats by using pathspec
ex: export _GIT_PATHSPEC=':!directory'"
}
################################################################################
# DESC: Displays the interactive menu and saves the user supplied option
# ARGS: None
# OUTS: $opt: Option selected by the user based on menu choice
################################################################################
function show_menu() {
local normal=$(tput sgr0)
local cyan=$(tput setaf 6)
local red=$(tput setaf 1)
local yellow=$(tput setaf 3)
echo -e "\n${red} Generate: ${normal}"
echo -e "${cyan} ${yellow} 1)${cyan} Contribution stats (by author) ${normal}"
echo -e "${cyan} ${yellow} 2)${cyan} Git changelogs (last $_limit days)${normal}"
echo -e "${cyan} ${yellow} 3)${cyan} Git changelogs by author ${normal}"
echo -e "${cyan} ${yellow} 4)${cyan} My daily status ${normal}"
echo -e "${red} List: ${normal}"
echo -e "${cyan} ${yellow} 5)${cyan} Branch tree view (last $_limit)${normal}"
echo -e "${cyan} ${yellow} 6)${cyan} All branches (sorted by most recent commit) ${normal}"
echo -e "${cyan} ${yellow} 7)${cyan} All contributors (sorted by name) ${normal}"
echo -e "${cyan} ${yellow} 8)${cyan} Git commits per author ${normal}"
echo -e "${cyan} ${yellow} 9)${cyan} Git commits per date ${normal}"
echo -e "${cyan} ${yellow} 10)${cyan} Git commits per month ${normal}"
echo -e "${cyan} ${yellow} 11)${cyan} Git commits per weekday ${normal}"
echo -e "${cyan} ${yellow} 12)${cyan} Git commits per hour ${normal}"
echo -e "${cyan} ${yellow} 13)${cyan} Git commits by author per hour ${normal}"
echo -e "${red} Suggest: ${normal}"
echo -e "${cyan} ${yellow} 14)${cyan} Code reviewers (based on git history) ${normal}"
echo -e "\n${yellow}Please enter a menu option or ${red}press enter to exit. ${normal}"
read -r opt
}
################################################################################
# DESC: Prints a formatted message of the selected option by the user to stdout
# ARGS: $* (required): String to print (usually provided by other functions)
# OUTS: None
################################################################################
function option_picked() {
COLOR='\033[01;31m'
RESET='\033[00;00m'
MESSAGE=${@:-"${RESET}Error: No message passed"}
echo -e "${COLOR}${MESSAGE}${RESET}"
echo ""
local bold=$(tput bold)
local red=$(tput setaf 1)
local reset=$(tput sgr0)
local msg=${*:-"${reset}Error: No message passed"}
echo -e "${bold}${red}${msg}${reset}\n"
}
################################################################################
# DESC: Shows detailed contribution stats per author by parsing every commit in
# the repo and outputting their contribution stats
# ARGS: None
# OUTS: None
################################################################################
function detailedGitStats() {
option_picked "Contribution stats (by author):"
git log --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 '
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
if( more["total"] > 0 ) {
printf "\t insertions: %d (%.0f%%)\n", more[author], (more[author] / more["total"] * 100)
if(more["total"] > 0) {
printf "\t insertions: %d (%.0f%%)\n", more[author], \
(more[author] / more["total"] * 100)
}
if( less["total"] > 0 ) {
printf "\t deletions: %d (%.0f%%)\n", less[author], (less[author] / less["total"] * 100)
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(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)
printf "\t commits: %d (%.0f%%)\n", commits[author], \
(commits[author] / commits["total"] * 100)
}
if ( first[author] != "" ) {
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]
@@ -97,7 +202,8 @@ function detailedGitStats() {
}
/^Author:/ {
author = $2 " " $3
$1 = ""
author = $0
commits[author] += 1
commits["total"] += 1
}
@@ -128,9 +234,15 @@ function detailedGitStats() {
}'
}
################################################################################
# DESC: Displays the authors in order of total contribution to the repo
# ARGS: None
# OUTS: None
################################################################################
function suggestReviewers() {
option_picked "Suggested code reviewers (based on git history):"
git log --no-merges $_since $_until --pretty=%an $_pathspec $* | head -n 100 | sort | uniq -c | sort -nr | LC_ALL=C awk '
git -c log.showSignature=false log --use-mailmap --no-merges $_since $_until \
--pretty=%aN $_pathspec | head -n 100 | sort | uniq -c | sort -nr | LC_ALL=C awk '
{ args[NR] = $0; }
END {
for (i = 1; i <= NR; ++i) {
@@ -139,13 +251,19 @@ function suggestReviewers() {
}' | column -t -s,
}
################################################################################
# DESC: Displays a horizontal bar graph based on total commits per month
# ARGS: None
# OUTS: None
################################################################################
function commitsByMonth() {
option_picked "Git commits by month:"
echo -e "\tmonth\tsum"
for i in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
echo -en "\t$i\t"
echo $(git shortlog -n --no-merges --format='%ad %s' $_since $_until | grep " $i " | wc -l)
git -c log.showSignature=false shortlog -n --no-merges --format='%ad %s' \
$_since $_until | grep -c " $i "
done | awk '{
count[$1] = $2
total += $2
@@ -153,23 +271,30 @@ function commitsByMonth() {
END{
for (month in count) {
s="|";
if (total > 0) {
percent = ((count[month] / total) * 100) / 1.25;
for (i = 1; i <= percent; ++i) {
s=s"█"
}
printf( "\t%s\t%-0s\t%s\n", month, count[month], s );
}
}
}' | LC_TIME="en_EN.UTF-8" sort -M
}
################################################################################
# DESC: Displays a horizontal bar graph based on total commits per weekday
# ARGS: None
# OUTS: None
################################################################################
function commitsByWeekday() {
option_picked "Git commits by weekday:"
echo -e "\tday\tsum"
for i in Mon Tue Wed Thu Fri Sat Sun
do
echo -en "\t$i\t"
echo $(git shortlog -n --no-merges --format='%ad %s' $_since $_until | grep "$i " | wc -l)
git -c log.showSignature=false shortlog -n --no-merges --format='%ad %s' \
$_since $_until | grep -c "$i "
done | awk '{
}
@@ -182,29 +307,39 @@ function commitsByWeekday() {
for (day in count) {
s="|";
if (total > 0) {
percent = ((count[day] / total) * 100) / 1.25;
for (i = 1; i <= percent; ++i) {
s=s"█"
}
printf( "\t%s\t%-0s\t%s\n", day, count[day], s );
}
}
}' | sort -k 2 -n -r
}
################################################################################
# DESC: Displays a horizontal bar graph based on total commits per hour
# ARGS: $author (optional): Can focus on a single author. Default is all authors
# OUTS: None
################################################################################
function commitsByHour() {
local author="${1:-}"
local _author=''
if [ -z "$author" ]; then
local _author=""
if [[ -z "${author}" ]]; then
option_picked "Git commits by hour:"
_author="--author=**"
else
option_picked "Git commits by hour for author '$author':"
_author="--author=$author"
option_picked "Git commits by hour for author '${author}':"
_author="--author=${author}"
fi
echo -e "\thour\tsum"
for i in `seq -w 0 23`
for i in $(seq -w 0 23)
do
echo -ne "\t$i\t"
echo $(git shortlog -n --no-merges --format='%ad %s' $_author $_since $_until | grep " $i:" | wc -l)
git -c log.showSignature=false shortlog -n --no-merges --format='%ad %s' \
"${_author}" $_since $_until | grep ' '$i: | wc -l
done | awk '{
count[$1] = $2
total += $2
@@ -212,23 +347,39 @@ function commitsByHour() {
END{
for (hour in count) {
s="|";
if (total > 0) {
percent = ((count[hour] / total) * 100) / 1.25;
for (i = 1; i <= percent; ++i) {
s=s"█"
}
printf( "\t%s\t%-0s\t%s\n", hour, count[hour], s );
}
}
}' | sort
}
################################################################################
# DESC: Shows the number of commits that were committed per date recorded in the
# repo's log history
# ARGS: None
# OUTS: None
################################################################################
function commitsPerDay() {
option_picked "Git commits per date:";
git log --no-merges $_since $_until --date=short --format='%ad' $_pathspec | sort | uniq -c
git -c log.showSignature=false log --use-mailmap --no-merges $_since $_until \
--date=short --format='%ad' $_pathspec | sort | uniq -c
}
################################################################################
# DESC: Displays the number of commits and percentage contributed to the repo
# per author and sorts them by contribution percentage
# ARGS: None
# OUTS: None
################################################################################
function commitsPerAuthor() {
option_picked "Git commits per author:"
git shortlog $_since $_until --no-merges -n -s | sort -nr | LC_ALL=C awk '
git -c log.showSignature=false shortlog $_since $_until --no-merges -n -s \
| sort -nr | LC_ALL=C awk '
{ args[NR] = $0; sum += $0 }
END {
for (i = 1; i <= NR; ++i) {
@@ -237,6 +388,11 @@ function commitsPerAuthor() {
}' | column -t -s,
}
################################################################################
# DESC: Shows git shortstats on the current user's changes for current day
# ARGS: None
# OUTS: None
################################################################################
function myDailyStats() {
option_picked "My daily status:"
git diff --shortstat '@{0 day ago}' | sort -nr | tr ',' '\n' | LC_ALL=C awk '
@@ -247,192 +403,154 @@ function myDailyStats() {
}
}'
echo -e "\t" $(git log --author="$(git config user.name)" --no-merges --since=$(date "+%Y-%m-%dT00:00:00") --until=$(date "+%Y-%m-%dT23:59:59") --reverse | grep commit | wc -l) "commits"
echo -e "\t" $(git -c log.showSignature=false log --use-mailmap \
--author="$(git config user.name)" --no-merges \
--since=$(date "+%Y-%m-%dT00:00:00") \
--until=$(date "+%Y-%m-%dT23:59:59") --reverse \
| grep -c commit) "commits"
}
################################################################################
# DESC: Lists all contributors to a repo sorted by alphabetical order
# ARGS: None
# OUTS: None
################################################################################
function contributors() {
option_picked "All contributors (sorted by name):"
git log --no-merges $_since $_until --format='%aN' $_pathspec | sort -u | cat -n
git -c log.showSignature=false log --use-mailmap --no-merges $_since $_until \
--format='%aN' $_pathspec | sort -u | cat -n
}
################################################################################
# DESC: Shows an abbreviated ASCII graph based off of commit history
# ARGS: None
# OUTS: None
################################################################################
function branchTree() {
option_picked "Branching tree view:"
git log --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))
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))
}
################################################################################
# DESC: Lists all branches sorted by their most recent commit
# ARGS: None
# OUTS: None
################################################################################
function branchesByDate() {
option_picked "All branches (sorted by most recent commit):"
git for-each-ref --sort=committerdate refs/heads/ --format='[%(authordate:relative)] %(authorname) %(refname:short)' | cat -n
git for-each-ref --sort=committerdate refs/heads/ \
--format='[%(authordate:relative)] %(authorname) %(refname:short)' | cat -n
}
################################################################################
# DESC: Displays the latest commit history in an easy to read format by date
# ARGS: $author (optional): Can focus on a single author. Default is all authors
# OUTS: None
################################################################################
function changelogs() {
local author="${1:-}"
local _author=''
if [ -z "$author" ]; then
local _author=""
if [[ -z "${author}" ]]; then
option_picked "Git changelogs:"
_author="--author=**"
else
option_picked "Git changelogs for author '$author':"
_author="--author=$author"
option_picked "Git changelogs for author '${author}':"
_author="--author=${author}"
fi
NEXT=$(date +%F)
git log --no-merges --format="%cd" --date=short $_author $_since $_until $_pathspec | sort -u -r | head -n $_limit | while read DATE ; do
echo
echo "[$DATE]"
GIT_PAGER=cat git log --no-merges --format=" * %s (%an)" $_author --since=$DATE --until=$NEXT
git -c log.showSignature=false log \
--use-mailmap \
--no-merges \
--format="%cd" \
--date=short "${_author}" $_since $_until $_pathspec \
| sort -u -r | head -n $_limit | while read DATE; do
echo -e "\n[$DATE]"
GIT_PAGER=cat git -c log.showSignature=false log \
--use-mailmap --no-merges \
--format=" * %s (%aN)" "${_author}" \
--since=$DATE --until=$NEXT
NEXT=$DATE
done
}
################################################################################
# MAIN
# Check to make sure all utilities required for this script are installed
check_utils
# Check if we are currently in a git repo.
git rev-parse --is-inside-work-tree > /dev/null
if [ $# -eq 1 ]
then
case $1 in
"suggestReviewers")
suggestReviewers
;;
"detailedGitStats")
detailedGitStats
;;
"branchTree")
branchTree
;;
"commitsPerDay")
commitsPerDay
;;
"commitsPerAuthor")
commitsPerAuthor
;;
"myDailyStats")
myDailyStats
;;
"contributors")
contributors
;;
"branchesByDate")
branchesByDate
;;
"changelogs")
changelogs
;;
"changelogsByAuthor")
# Parse non-interative commands
if [[ "$#" -eq 1 ]]; then
case "$1" in
-r|--suggest-reviewers) suggestReviewers;;
-T|--detailed-git-stats) detailedGitStats;;
-b|--branch-tree) branchTree;;
-d|--commits-per-day) commitsPerDay;;
-a|--commits-per-author) commitsPerAuthor;;
-S|--my-daily-stats) myDailyStats;;
-C|--contributors) contributors;;
-D|--branches-by-date) branchesByDate;;
-c|--changelogs) changelogs;;
-L|--changelogs-by-author)
author="${_GIT_AUTHOR:-}"
while [ -z "$author" ]; do read -p "Which author? " author; done
changelogs "$author"
;;
"commitsByWeekday")
commitsByWeekday
;;
"commitsByHour")
commitsByHour
;;
"commitsByAuthorByHour")
while [[ -z "${author}" ]]; do
read -r -p "Which author? " author
done
changelogs "${author}";;
-w|--commits-by-weekday) commitsByWeekday;;
-o|--commits-by-hour) commitsByHour;;
-A|--commits-by-author-by-hour)
author="${_GIT_AUTHOR:-}"
while [ -z "$author" ]; do read -p "Which author? " author; done
commitsByHour "$author"
;;
"commitsByMonth")
commitsByMonth
;;
*)
echo "Invalid argument. Possible arguments: suggestReviewers, detailedGitStats, commitsPerDay, commitsByMonth, commitsByWeekday, commitsByHour, commitsByAuthorByHour, commitsPerAuthor, myDailyStats, contributors, branchTree, branchesByDate, changelogs, changelogsByAuthor"
exit 1
;;
while [[ -z "${author}" ]]; do
read -r -p "Which author? " author
done
commitsByHour "${author}";;
-m|--commits-by-month) commitsByMonth;;
-h|-\?|--help) usage;;
*) echo "Invalid argument"; usage; exit 1;;
esac
exit 0;
fi
[[ "$#" -gt 1 ]] && { echo "Invalid arguments"; usage; exit 1; }
if [ $# -gt 1 ]
then
echo "Usage: git quick-stats <optional-command-to-execute-directly>";
exit 1;
fi
# Parse interactive commands
clear
show_menu
while [ opt != '' ]
do
if [[ $opt = "" ]]; then
exit;
else
while [[ "${opt}" != "" ]]; do
clear
case $opt in
1)
detailedGitStats
show_menu
;;
2)
changelogs
show_menu
;;
3)
author=''
while [ -z "$author" ]; do read -p "Which author? " author; done
changelogs "$author"
show_menu
;;
4)
myDailyStats
show_menu
;;
5)
branchTree
show_menu
;;
6)
branchesByDate
show_menu
;;
7)
contributors
show_menu
;;
8)
commitsPerAuthor
show_menu
;;
9)
commitsPerDay
show_menu
;;
10)
commitsByMonth
show_menu
;;
11)
commitsByWeekday
show_menu
;;
12)
commitsByHour
show_menu
;;
13)
author=''
while [ -z "$author" ]; do read -p "Which author? " author; done
commitsByHour "$author"
show_menu
;;
14)
suggestReviewers
show_menu
;;
q)
exit
;;
\n)
exit
;;
*)
clear
option_picked "Pick an option from the menu"
show_menu
;;
case "${opt}" in
1) detailedGitStats; show_menu;;
2) changelogs; show_menu;;
3) author=""
while [[ -z "${author}" ]]; do
read -r -p "Which author? " author
done
changelogs "${author}"; show_menu;;
4) myDailyStats; show_menu;;
5) branchTree; show_menu;;
6) branchesByDate; show_menu;;
7) contributors; show_menu;;
8) commitsPerAuthor; show_menu;;
9) commitsPerDay; show_menu;;
10) commitsByMonth; show_menu;;
11) commitsByWeekday; show_menu;;
12) commitsByHour; show_menu;;
13) author=""
while [[ -z "${author}" ]]; do
read -r -p "Which author? " author
done
commitsByHour "${author}"; show_menu;;
14) suggestReviewers; show_menu;;
q|"\n") exit;;
*) clear; option_picked "Pick an option from the menu"; show_menu;;
esac
fi
done

113
git-quick-stats.1 Normal file
View File

@@ -0,0 +1,113 @@
.TH git-quick-stats "1" "January 2019" "git-quick-stats" "User Commands"
.SH NAME
.B git\-quick\-stats
\- Simple and efficient way to access various stats in a git repository.
.SH SYNOPSIS
.PP
For non\-interactive mode:
.B git\-quick\-stats [OPTIONS]
.PP
For interactive mode:
.B git-quick-stats
.PP
.SH DESCRIPTION
.PP
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.
.PP
.SH OPTIONS
.HP
\fB\-r\fR, \fB\-\-suggest\-reviewers\fR
.IP
show the best people to contact to review code
.HP
.PP
.PP
\fB\-T\fR, \fB\-\-detailed\-git\-stats\fR
.IP
give a detailed list of git stats
.HP
.PP
\fB\-d\fR, \fB\-\-commits\-per\-day\fR
.IP
displays a list of commits per day
.HP
.PP
\fB\-m\fR, \fB\-\-commits\-by\-month\fR
.IP
displays a list of commits per month
.HP
.PP
\fB\-w\fR, \fB\-\-commits\-by\-weekday\fR
.IP
displays a list of commits per weekday
.HP
.PP
\fB\-o\fR, \fB\-\-commits\-by\-hour\fR
.IP
displays a list of commits per hour
.HP
.PP
\fB\-A\fR, \fB\-\-commits\-by\-author\-by\-hour\fR
.IP
displays a list of commits per hour by author
.HP
.PP
\fB\-a\fR, \fB\-\-commits\-per\-author\fR
.IP
displays a list of commits per author
.HP
.PP
\fB\-S\fR, \fB\-\-my\-daily\-stats\fR
.IP
see your current daily stats
.HP
.PP
\fB\-C\fR, \fB\-\-contributors\fR
.IP
see a list of everyone who contributed to the repo
.HP
.PP
\fB\-b\fR, \fB\-\-branch\-tree\fR
.IP
show an ASCII graph of the git repo branch history
.HP
.PP
\fB\-D\fR, \fB\-\-branches\-by\-date\fR
.IP
show branches by date
.HP
.PP
\fB\-c\fR, \fB\-\-changelogs\fR
.IP
see changelogs
.HP
.PP
\fB\-L\fR, \fB\-\-changelogs\-by\-author\fR
.IP
see changelogs by author
.HP
.PP
\fB\-h\fR, \-?, \fB\-\-help\fR
.IP
display this help text in the terminal
.PP
.SH ADDITIONAL USAGE
You can set _GIT_SINCE and _GIT_UNTIL to limit the git time log, example:
.IP
.PP
.B export _GIT_SINCE="2017\-20\-01"
.IP
.PP
You can set _GIT_LIMIT for limited output log, example:
.PP
.B export _GIT_LIMIT=20
.PP
You can exclude a directory from the stats by using pathspec, example:
.PP
.B export _GIT_PATHSPEC=':!directory'
.
.fi

View File

@@ -3,17 +3,17 @@
. tests/assert.sh -v
src="./git-quick-stats"
assert "$src fail" "Invalid argument. Possible arguments: suggestReviewers, detailedGitStats, commitsPerDay, commitsByMonth, commitsByWeekday, commitsByHour, commitsByAuthorByHour, commitsPerAuthor, myDailyStats, contributors, branchTree, branchesByDate, changelogs, changelogsByAuthor"
#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 suggestReviewers - see best people to contact to review code\n detailedGitStats - displays a detailed list of git status\n commitsPerDay - displays a list of commits per day\n commitsByMonth - displays a list of commits per month\n commitsByWeekday - displays a list of commits per weekday\n commitsByHour - displays a list of commits per hour\n commitsByAuthorByHour - see a list of commits per hour by author\n commitsPerAuthor - displays a list of commits per author\n myDailyStats - see your current daily stats\n contributors - see a list of all contributors\n branchTree - see an ASCII graph of the git repo\n branchesByDate - show branches by date\n changelogs - see changelogs\n changelogsByAuthor - see changelogs by author\n\nADDITIONAL USAGE\n You can set _GIT_SINCE and _GIT_UNTIL to limit the git time log\n ex: export _GIT_SINCE=2017-20-01\n You can set _GIT_LIMIT for limited output log\n ex: export _GIT_LIMIT=20\n You can exclude a directory from the stats by using pathspec\n ex: export _GIT_PATHSPEC=':!directory'\n \nCONTRIBUTION\n For details regarding contribution, please see the contribution.md document\n\nLICENSE\n This is under the MIT license. See LICENSE in the repo for more info"
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 -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 -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-20-01\"\n You can set _GIT_LIMIT for limited output log\n ex: export _GIT_LIMIT=20\n You can exclude a directory from the stats by using pathspec\n ex: export _GIT_PATHSPEC=':!directory'"
assert_raises "$src fail" 1
assert_contains "$src suggestReviewers" "Suggested code reviewers (based on git history)" 127
assert_raises "$src suggestReviewers" 0
assert_contains "$src --suggest-reviewers" "Suggested code reviewers (based on git history)" 127
assert_raises "$src --suggest-reviewers" 0
assert_contains "$src detailedGitStats" "Contribution stats" 127
assert_raises "$src detailedGitStats" 0
assert_contains "$src --detailed-git-stats" "Contribution stats" 127
assert_raises "$src --detailed-git-stats" 0
assert_contains "$src commitsPerDay" "Git commits per date" 127
assert_raises "$src commitsPerDay" 0
assert_contains "$src --commits-per-day" "Git commits per date" 127
assert_raises "$src --commits-per-day" 0
assert_end